Обнаружение вводимого текстового поля на экране с помощью OpenCV (C #, emgu cv) - PullRequest
2 голосов
/ 23 сентября 2019

Я пытаюсь определить поля ввода текста в форме Windows.

Я новичок в OpenCV, поэтому я попытался использовать код (Emgu CV 3.x) из http://www.emgu.com/wiki/index.php/Shape_(Triangle,_Rectangle,_Circle,_Line)_Detection_in_CSharp

Я немного изменил этот код, поэтому я добавил новое imagebox5 и изменил пороги, потому что оригинальный код не обнаружил никаких полей ввода:

#region Canny and edge detection
            watch.Reset(); watch.Start();
            double cannyThresholdLinking = 120.0;
            cannyThreshold = 1;
            UMat cannyEdges = new UMat();
            CvInvoke.Canny(uimage, cannyEdges, cannyThreshold, cannyThresholdLinking);
            imagebox5.Image = cannyEdges;

В результате imagebox5 показывает грубые контуры полей, но без прямоугольников(входные текстовые поля) были обнаружены.

Как определить положение каждого из полей ввода в таком поле со многими входными текстовыми полями?

enter image description here enter image description here

1 Ответ

2 голосов
/ 24 сентября 2019

Вот подход

  • Преобразование изображения в оттенки серого
  • Обнаружение канни по краям
  • Поиск контуров и фильтра с использованием минимальной / максимальной области контура

enter image description here

Я реализовал это в Python OpenCV, но вы можете адаптировать ту же стратегию с C #

import cv2

image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
canny = cv2.Canny(gray, 50, 200, 1)

cnts = cv2.findContours(canny, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    area = cv2.contourArea(c)
    if area > 10000 and area < 15000:
        cv2.drawContours(image, [c], 0, (36,255,12), 2)

cv2.imshow('canny', canny)
cv2.imshow('image', image)
cv2.waitKey()
...