Изменение размера изображения и его ограничительной рамки

У меня есть изображение с ограничивающей рамкой, и я хочу изменить размер изображения.

img = cv2.imread("img.jpg",3)
x_ = img.shape[0]
y_ = img.shape[1]
img = cv2.resize(img,(416,416));

Теперь я хочу рассчитать масштабный коэффициент:

x_scale = ( 416 / x_)
y_scale = ( 416 / y_ )

И нарисуйте изображение, это код исходного ограничивающего прямоугольника:

( 128, 25, 447, 375 ) = ( xmin,ymin,xmax,ymax)
x = int(np.round(128*x_scale))
y = int(np.round(25*y_scale))
xmax= int(np.round  (447*(x_scale)))
ymax= int(np.round(375*y_scale))

Однако, используя это, я получаю:

Изменение размера изображения и его ограничительной рамки

Пока оригинал:

Изменение размера изображения и его ограничительной рамки

Я не вижу флага в этой логике, что не так?

Весь код:

imageToPredict = cv2.imread("img.jpg",3)
print(imageToPredict.shape)

x_ = imageToPredict.shape[0]
y_ = imageToPredict.shape[1]

x_scale = 416/x_
y_scale = 416/y_
print(x_scale,y_scale)
img = cv2.resize(imageToPredict,(416,416));
img = np.array(img);


x = int(np.round(128*x_scale))
y = int(np.round(25*y_scale))
xmax= int(np.round  (447*(x_scale)))
ymax= int(np.round(375*y_scale))
Box.drawBox([[1,0, x,y,xmax,ymax]],img)

и ящик

def drawBox(boxes, image):
    for i in range (0, len(boxes)):
        cv2.rectangle(image,(boxes[i][2],boxes[i][3]),(boxes[i][4],boxes[i][5]),(0,0,120),3)
    cv2.imshow("img",image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

Изображение и данные для ограничивающей рамки загружаются отдельно. Я рисую ограничивающую рамку внутри изображения. Изображение не содержит самой коробки.

Добро пожаловать на сайт! Ознакомьтесь с тур и страница с инструкциями, чтобы узнать больше о том, как задавать вопросы, на которые можно получить качественные ответы. Вы можете отредактируйте свой вопрос, чтобы включить дополнительную информацию. Где определяется Box.drawBox? Я не вижу этого в документах numpy или opencv.

cxw 24.03.2018 15:58

Я удалил эту строчку, она здесь irelavant

jejjejd 24.03.2018 16:00

Я не уверен, что понимаю. Не могли бы вы адаптировать код к MCVE и опубликовать его? Является ли ограничивающая рамка частью данных изображения вашего исходного изображения или это то, что вы рисуете отдельно?

cxw 24.03.2018 16:01

У меня есть изображение и xml-документация к нему, где хранятся x, y, ширина и высота. Неважно, как я загружаю здесь документ image / xml, я думаю, когда я изменяю размер изображения, мне также нужно изменять размер ограничивающей рамки.

jejjejd 24.03.2018 16:04

Итак, ограничивающая рамка отсутствует на изображении, и вам нужно изменить размер ограничивающей рамки отдельно от изображения. В таком случае звонок drawBox определенно актуален :). Как я уже сказал, дайте мне MCVE, и я посмотрю. Сейчас я боюсь, что это не выскочит на меня из фрагментов кода. Спасибо!

cxw 24.03.2018 16:07

Ваш код выглядит несовместимым. width рассчитан на основе xmax, что выглядит странно. Не могли бы вы на самом деле показать полный пример, включая то, как вы рисуете оба поля на полном и масштабированном изображениях?

SergGr 24.03.2018 16:08

отредактированный вопрос

jejjejd 24.03.2018 16:12

Мне кажется, что вы где-то поменяли местами x и y, либо при вычислении масштабирования, либо на чертеже коробки.

Cris Luengo 24.03.2018 17:05

@jejjejd, я все еще не вижу фрагмента кода, который рисует прямоугольник поверх исходного изображения. Мы можем говорить о согласованности только в том случае, если вы покажете код для рисования блоков оба. В частности, на вашем "исходном" изображении рамка не прямоугольная (128,25) - (447,375). Фактический верхний левый угол - это что-то о (160,35).

SergGr 24.03.2018 18:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
22
9
14 808
2

Ответы 2

Я считаю, что есть две проблемы:

  1. Вы должны поменять местами x_ и y_, потому что shape[0] на самом деле имеет размерность y, а shape[1] - размерность x.
  2. Вы должны использовать одни и те же координаты на исходном и масштабированном изображении. На исходном изображении прямоугольник - это (160, 35) - (555, 470), а не (128,25) - (447,375), который вы используете в коде.

Если я использую следующий код:

import cv2
import numpy as np


def drawBox(boxes, image):
    for i in range(0, len(boxes)):
        # changed color and width to make it visible
        cv2.rectangle(image, (boxes[i][2], boxes[i][3]), (boxes[i][4], boxes[i][5]), (255, 0, 0), 1)
    cv2.imshow("img", image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


def cvTest():
    # imageToPredict = cv2.imread("img.jpg", 3)
    imageToPredict = cv2.imread("49466033\\img.png ", 3)
    print(imageToPredict.shape)

    # Note: flipped comparing to your original code!
    # x_ = imageToPredict.shape[0]
    # y_ = imageToPredict.shape[1]
    y_ = imageToPredict.shape[0]
    x_ = imageToPredict.shape[1]

    targetSize = 416
    x_scale = targetSize / x_
    y_scale = targetSize / y_
    print(x_scale, y_scale)
    img = cv2.resize(imageToPredict, (targetSize, targetSize));
    print(img.shape)
    img = np.array(img);

    # original frame as named values
    (origLeft, origTop, origRight, origBottom) = (160, 35, 555, 470)

    x = int(np.round(origLeft * x_scale))
    y = int(np.round(origTop * y_scale))
    xmax = int(np.round(origRight * x_scale))
    ymax = int(np.round(origBottom * y_scale))
    # Box.drawBox([[1, 0, x, y, xmax, ymax]], img)
    drawBox([[1, 0, x, y, xmax, ymax]], img)


cvTest()

и используйте свое "исходное" изображение как "49466033 \ img.png",

Original image

Я получаю следующее изображение

Processed image

И, как вы можете видеть, моя более тонкая синяя линия лежит точно внутри вашей исходной красной линии и остается там, какой бы targetSize вы ни выбрали (так что масштабирование действительно работает правильно).

вы можете использовать resize_dataset_pascalvoc

python3 main.py -p <IMAGES_&_XML_PATH> --output <IMAGES_&_XML> --new_x <NEW_X_SIZE> --new_y <NEW_X_SIZE> --save_box_images <FLAG>" легко использовать

Он изменяет размер всего вашего набора данных и перезаписывает новые файлы аннотаций для изображений с измененным размером.

вы можете немного подробнее объяснить, как это сделать.

Priyank Pathak 30.11.2019 05:43

Другие вопросы по теме