Я пытаюсь искать фигуры в изображении с помощью OpenCV. Я знаю формы, которые хочу сопоставить (есть некоторые формы, о которых я не знаю, но мне не нужно их находить) и их ориентации. Я не знаю их размеры (масштаб) и местоположения.Поиск фигур в изображении с использованием opencv
Мой текущий подход:
- Обнаружение контуров
- Для каждого контура, рассчитать максимальный ограничивающий параллелепипед
- матч каждый ограничивающий параллелепипед с одной из известных форм в отдельности. В моем реальном проекте я масштабирую область до размера шаблона и вычисляя различия в градиенте Sobel, но для этой демонстрации я просто использую соотношение сторон.
В тех случаях, когда этот подход отменяется, формы касаются друг друга. Обнаружение контура поднимает две смежные формы в виде единого контура (единственная ограничивающая рамка). Соответственно, шаг совпадения, очевидно, не удастся.
Есть ли способ изменить мой подход для обработки смежных форм отдельно? Кроме того, есть ли лучший способ выполнить шаг 3?
Например: (Es зеленого цвета, Ys синего цвета)
Failed случай: (неизвестная форма в красном цвете)
Исходный код:
import cv
import sys
E = cv.LoadImage('e.png')
E_ratio = float(E.width)/E.height
Y = cv.LoadImage('y.png')
Y_ratio = float(Y.width)/Y.height
EPSILON = 0.1
im = cv.LoadImage(sys.argv[1], cv.CV_LOAD_IMAGE_GRAYSCALE)
storage = cv.CreateMemStorage(0)
seq = cv.FindContours(im, storage, cv.CV_RETR_EXTERNAL,
cv.CV_CHAIN_APPROX_SIMPLE)
regions = []
while seq:
pts = [ pt for pt in seq ]
x, y = zip(*pts)
min_x, min_y = min(x), min(y)
width, height = max(x) - min_x + 1, max(y) - min_y + 1
regions.append((min_x, min_y, width, height))
seq = seq.h_next()
rgb = cv.LoadImage(sys.argv[1], cv.CV_LOAD_IMAGE_COLOR)
for x,y,width,height in regions:
pt1 = x,y
pt2 = x+width,y+height
if abs(float(width)/height - E_ratio) < EPSILON:
color = (0,255,0,0)
elif abs(float(width)/height - Y_ratio) < EPSILON:
color = (255,0,0,0)
else:
color = (0,0,255,0)
cv.Rectangle(rgb, pt1, pt2, color, 2)
cv.ShowImage('rgb', rgb)
cv.WaitKey(0)
e.png:
y.png:
хорошо:
плохо:
Прежде чем кто-нибудь спросит, нет, я не пытается сломать captcha :) OCR само по себе на самом деле не так актуально: фактические фигуры в моем реальном проекте не являются персонажами - я просто ленивый, а символы - это самая легкая вещь для рисования (и до сих пор обнаруживается тривиальными методами).
Рассматривались ли вы для определения допустимого интервала для отношения высоты/ширины. Если все случаи, когда фигуры касаются друг друга, приводят к слишком широким или слишком высоким ограничивающим прямоугольникам, может быть ключом. –
Да, я об этом уже подумал. Спасибо, что упомянул об этом. – misha