使用 OpenCV(C#、emgu cv)检测屏幕上的输入文本字段

Detecting input text field on screen with OpenCV (C#, emgu cv)

我正在尝试检测 Windows 表单上的输入文本字段。

我是 OpenCV 的新手,所以我尝试使用来自 http://www.emgu.com/wiki/index.php/Shape_(Triangle,_Rectangle,_Circle,_Line)_Detection_in_CSharp

的代码 (Emgu CV 3.x)

我稍微修改了那个代码,所以我添加了一个新的 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 显示了字段的粗略轮廓,但未检测到矩形(输入文本字段)。

如何在具有多个输入文本字段的此类字段上检测每个输入字段的位置?

这是一个方法

  • 将图像转换为灰度
  • Canny 边缘检测
  • 使用minimum/maxmium轮廓区域
  • 查找轮廓并过滤

我在 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()