Oto proste podejście w kodzie Pythona. (But as I stated in my comment below, It is not an universal answer applicable everywhere, It is just to show finding contour inside a contour can be done. And if your images are different, then you have to come with some different constraints other than i mentioned below
)
To, co robisz po znalezieniu konturów, polega na sprawdzeniu, czy obszar każdego konturu jest mniejszy niż określona wartość (dałem 10000, tylko przypuszczenie), jeśli nie, to większy kontur, unikaj tego. Jeśli jest mniejsza niż podana wartość, może to być nasz kwadrat lub prostokąt obok niego.
Znaleźliśmy więc jego szerokość i wysokość i sprawdzić, czy proporcje są bliskie 1. Jeśli tak, to jest to nasz kwadrat.
import cv2
import numpy as np
img = cv2.imread('sofcnt.jpg')
gray = cv2.imread('sofcnt.jpg',0)
ret,thresh = cv2.threshold(gray,127,255,1)
cont,hier = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
for cnt in cont:
approx = cv2.approxPolyDP(cnt,0.02*cv2.arcLength(cnt,True),True)
if cv2.contourArea(cnt) < 10000:
x,y,w,h = cv2.boundingRect(cnt)
if w/float(h) < 2:
cv2.drawContours(img,[cnt],0,255,-1)
cv2.imshow('a',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Wynik:
Czy możesz podać więcej informacji? Jakie są kryteria wykrywania wypełnionego konturu? – ArtemStorozhuk