Распознавание прямоугольников в шаблонных изображениях

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

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

По сути, я пытаюсь создать случайно сгенерированного мем-бота, который помещает случайное исходное изображение в область, определяемую этими прямоугольниками. У меня уже есть тонны этих изображений с предопределенными областями с этими красными прямоугольниками для использования. Я хочу как-то автоматизировать процесс, в настоящее время каждая форма изменения размера и смещение должны быть определены для каждого шаблона. Итак, что мне нужно сделать, это распознать область внутри прямоугольника и заставить ее вернуть определенную форму изменения размера и смещение, необходимое для размещения исходного изображения.

Как мне это сделать? Должен ли я использовать что-то в OpenCV или мне придется обучать CNN? Просто действительно ищу толчок в правильном направлении, потому что я совершенно не понимаю, как лучше всего подойти к этой проблеме.


person Jesus Christ    schedule 06.01.2019    source источник


Ответы (1)


Я думаю, что OpenCV может это сделать. Ниже приведен краткий пример шагов для того, что вам нужно. Прочтите комментарии в коде для более подробной информации.

import cv2
import numpy as np

img = cv2.imread("1.jpg")

#STEP1: get only red color (or the bounding box color) in the image
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# define range of red color in HSV
lower_red = np.array([0,50,50])
upper_red = np.array([0,255,255])
# Threshold the HSV image to get only blue colors
mask = cv2.inRange(hsv, lower_red, upper_red)
red_only = cv2.bitwise_and(img,img, mask= mask)

#STEP2: find contour
gray_img = cv2.cvtColor(red_only,cv2.COLOR_BGR2GRAY)
_,thresh = cv2.threshold(gray_img,1,255,cv2.THRESH_BINARY)

_,contours,_ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

#max contour in the image is the box you want
areas = [cv2.contourArea(c) for c in contours]
sorted_areas = np.sort(areas)
cnt=contours[areas.index(sorted_areas[-1])]
r = cv2.boundingRect(cnt)
cv2.rectangle(img,(r[0],r[1]),(r[0]+r[2],r[1]+r[3]),(0,255,0),3)

cv2.imshow("img",img)
cv2.imshow("red_only",red_only)
cv2.imshow("thresh",thresh)

cv2.waitKey()
cv2.destroyAllWindows()

введите здесь описание изображения

введите здесь описание изображения

введите здесь описание изображения

person Ha Bom    schedule 07.01.2019