Как надежно найти флажки на изображении (с помощью cv2.findContours или другой техники)? - PullRequest
0 голосов
/ 28 октября 2018

Я пытаюсь определить 6 квадратов на этом изображении:

enter image description here

и определить, какие из них отмечены или имеют черный цвет (здесь (1,1) и (3,2)).

  • может быть текст или рисунок, но ничего на самом деле аналогично установленным флажкам

  • изображение можно слегка повернуть

Подход # 1

Я пробовал:

_, contours, hierarchy = cv2.findContours(gray, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
for j, c in enumerate(contours):
    cv2.drawContours(imgcolor, [c], 0, COLORS[j % len(COLORS)], thickness=1)

но результат довольно плохой:

enter image description here

Что я пробовал до сих пор:

  • фильтр по области с cv2.contourArea(c)

  • Используйте

    shape = cv2.approxPolyDP(c, 0.05 * cv2.arcLength(c, True), closed=True)
    

    и сохраняйте прямоугольники только с if len(shape) == 4:, но это не будет работать, так как некоторыеквадраты разделены на два или три контура: см. верхний правый квадрат, который распознается как красный + голубой контур

  • Примечание: некоторые квадраты успешно распознаются контуром, но даже по двум контурам , поэтому, когда мы drawContour, мы видим two контуры друг на друге для одного и того же квадрата

Подход № 2

Можно ли использовать корреляцию между исходным изображением и всеми «смещенными по положению + повернутыми + масштабированными» версиями этого «ящика 3х2»:

enter image description here

Позволит ли этохорошее обнаружение?

TL; DR:

Как надежно определить 6 полей на таком изображении и найти флажки, которые отмечены или имеют черный цвет?

1 Ответ

0 голосов
/ 28 октября 2018

Вот мой метод:

(1) Порог и поиск внешних контуров

(2) Фильтруйте контур по площади и высоте / ширине, затем различайте по занимаемой области.

Это мой результат:

enter image description here

...