Как обрезать номер автомобиля на этой картинке, учитывая его относительные координаты Bbox? - PullRequest
1 голос
/ 21 апреля 2019

У меня есть эта картинка: pic_to_be_cropped

У меня есть следующие относительные координаты:

[[0.6625, 0.6035714285714285], [0.7224999999999999, 0.6035714285714285], [0.7224999999999999, 0.6571428571428571], [0.6625, 0.6571428571428571], [0.6625, 0.6035714285714285]]

(однако я не понимаю, почему здесь 5 значений вместо обычных 4 и что они означают)

Моя попытка с scikit-image, которая показывает всю картинку вместо обрезки:

import numpy as np
from skimage import io, draw

img = io.imread(pic)

vals = [[0.6625, 0.6035714285714285], [0.7224999999999999, 0.6035714285714285], [0.7224999999999999, 0.6571428571428571], [0.6625, 0.6571428571428571], [0.6625, 0.6035714285714285]]

vertices = np.asarray(test_vals)

rows, cols = draw.polygon(vertices[:, 0], vertices[:, 1])

crop = img.copy()

crop[:, :, -1] = 0
crop[rows, cols, -1] = 255

io.imshow(crop)
io.show()

# shows whole pic instead of cropping

Моя попытка с opencv дает ошибки, потому что координаты в формате с плавающей точкой:

import cv2 as cv


vals = [[0.6625, 0.6035714285714285], [0.7224999999999999, 0.6035714285714285], [0.7224999999999999, 0.6571428571428571], [0.6625, 0.6571428571428571], [0.6625, 0.6035714285714285]]

x = vals[0][0]
y = vals[0][1]
width = vals[1][0] - x
height = vals[2][1] - y

img = cv.imread(pic)

crop_img = img[y:y+height, x:x+width]
cv.imshow("cropped", crop_img)
cv.waitKey(0)

#  TypeError: slice indices must be integers or None or have an __index__ method

Как обрезать номер автомобиля на этой картинке, учитывая его относительные координаты bbox?

Я не ограничен какой-либо структурой, поэтому, если вы считаете, что TF или что-то еще может помочь - пожалуйста, предложите.

1 Ответ

0 голосов
/ 21 апреля 2019

Проверка

vals = [[0.6625, 0.6035714285714285], [0.7224999999999999, 0.6035714285714285], [0.7224999999999999, 0.6571428571428571], [0.6625, 0.6571428571428571], [0.6625, 0.6035714285714285]]

показывает, что первая и последняя запись в списке идентичны.При обработке изображения позиция (0,0) - это верхний левый угол.Глядя на значения в списке, можно предположить, что координаты заданы следующим образом:

[top_left, bottom_left, bottom_right, top_right, top_left]

Тот факт, что все числа находятся в диапазоне от нуля до 1, предполагает, что это относительные координаты.Чтобы изменить масштаб до размеров изображения, их нужно умножить на высоту и ширину соответственно:

# dummy img sizes:
image_height = 480
image_width = 640

# rescale to img dimensions, and convert to int, to allow slicing:
bbox_coordinates = [[int(a[0]*image_height), int(a[1]* image_width)] for a in vals]

Теперь вы можете использовать нарезку массива на изображении для обрезки:

top_left = bbox_coordinates[0]
bottom_right = boox_coordinates[2]

bbox = img[top_left[0]:bottom_right[0], top_left[1]:bottom_right[1]]
...