Как обнаружить букву «Н» под любым углом - PullRequest
0 голосов
/ 05 июня 2019

Я изо всех сил пытаюсь обнаружить определенную форму в openCV, используя python. Конкретной формой является буква "H".

Я рассмотрел несколько способов сделать это. Сопоставление с шаблоном и OCR не будут работать под любым углом, поэтому я подумываю использовать хитрое обнаружение краев. Может ли кто-нибудь из вас дать несколько советов о том, как двигаться дальше отсюда. Как применить фильтр Канни, как проверить наличие буквы «Н»?

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
binary = cv2.erode(gray, None, iterations=2)
median_filter = cv2.medianBlur(binary, 3)
edges = cv2.Canny(median_filter, 120, 180)

bin, contours, _hierarchy = cv2.findContours(edges, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
    cnt_len = cv2.arcLength(cnt, True)
    cnt = cv2.approxPolyDP(cnt, 0.02 * cnt_len, True)

cv2.imshow("crop", binary)
cv2.imshow("Frame", edges)
cv2.imshow("frame", frame)
key = cv2.waitKey(1) & 0xFF

if key == ord("q"):
    break

cv2.destroyAllWindows()

Ответы [ 2 ]

0 голосов
/ 06 июня 2019

Вы можете использовать Hough Transformation после использования Canny Edge. Вы всегда будете получать две параллельные линии и одну перпендикулярную обеим прямым линиям без необходимости искать угол. Это уже реализовано в OpenCV (вероятностное преобразование линий). После этого вам нужно проверить выходные линии на параллельность и, наконец, перпендикулярную линию, где должны быть соединены все линии. Ссылка

// runs detection
HoughLinesP(image, linesP, rho, (CV_PI / 180)*theta, threshold, minLineLength, maxLineGap); 
    }
//Draw lines
for (int i = 0; i < linesP.size(); i++)
    {
        Vec4i l = linesP[i];
        line(image, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(255, 255, 255), 3, LINE_AA);
    }
//continue here
0 голосов
/ 05 июня 2019

Самое простое (но медленное) решение - запустить сопоставление с шаблоном или OCR на многих повернутых версиях изображений. Методы распознавания обычно имеют, по крайней мере, небольшой допуск на вращение, поэтому вам может не понадобиться такое количество. Если вычислительная сложность не является проблемой, это то, что я буду делать, поскольку она очень надежна.

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

...