Я немного опоздал с ответом, но, тем не менее, возможно, он послужит кому-то альтернативной идеей.
Сначала вы выполняете поиск контуров в своем изображении и создаете маски и окончательные изображения для отображения результата.
Для каждого контура вы найдете размер контура, так что это поможет вам отфильтровать ваши ящики от букв (ящики больше по размеру). Для флажка я нашел решение отфильтровать его по размеру И по расстоянию от крайней точки слева и справа от контура (вы можете найти множество различных критериев для фильтрации контрольных точек и, возможно, намного более качественные - я сосредоточился только на изображении, которое вы разместили в своем вопросе).
Чтобы попасть в интересующую область, вы найдете значения x, y, h, w с помощью cv2.boundingRect ()
Затем вы просто рисуете его на изображениях, созданных в начале (обратите внимание, что эти выходные данные только черно-белые). Может быть, этот подход даст вам некоторое представление. Ура!
Пример в коде:
import cv2
import numpy as np
img = cv2.imread('checkbox.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, threshold = cv2.threshold(gray,170,255,cv2.THRESH_BINARY_INV)
im, contours, hierarchy = cv2.findContours(threshold,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
final = np.zeros(gray.shape,np.uint8)
mask = np.zeros(gray.shape,np.uint8)
final2 = np.zeros(gray.shape,np.uint8)
list1 = []
for i in range(0, len(contours)):
cnt = contours[i]
epsilon = 0.1*cv2.arcLength(cnt,True)
approx = cv2.approxPolyDP(cnt,epsilon,True)
size = cv2.contourArea(approx)
extLeft = tuple(cnt[cnt[:, :, 0].argmin()][0])
extRight = tuple(cnt[cnt[:, :, 0].argmax()][0])
distance = np.sqrt((extLeft[0] - extRight[0])**2 + (extLeft[1] - extRight[1])**2)
x,y,w,h = cv2.boundingRect(cnt)
mask[x:x+h, y:y+w]=0
if 700 > size > 220:
cv2.drawContours(mask,contours,i,255,-1)
cv2.drawContours(final,contours,i,255,2)
elif 16 < distance < 17 and size > 60:
list1.append(cnt)
elif size < 250:
cv2.drawContours(final2,contours,i,(255,255,255),1)
for i in list1:
cv2.drawContours(final, [i], -1, (255,255,255), -1)
cv2.bitwise_not(final,final)
cv2.bitwise_not(final2,final2)
cv2.imwrite('c_orig.png', img)
cv2.imwrite('c_boxes.png', final)
cv2.imwrite('c_text.png', final2)
cv2.imshow('img', img)
cv2.imshow('img2', final)
cv2.imshow('img3', final2)
cv2.waitKey(0)
cv2.destroyAllWindows()
Выход: