屏幕区域识别以在屏幕上查找字段位置

Mar*_*l60 7 .net c# image-processing sikuli

我试图想出一种方法来让Sikuli的图像识别在C#中使用.我不想使用Sikuli本身,因为它的脚本语言有点慢,因为我真的不想在我的.NET C#app中引入一个java桥.

所以,我有一个代表我的屏幕区域的位图(我将这个区域称为BUTTON1).屏幕布局可能略有变化,或者屏幕可能已在桌面上移动 - 因此我无法使用直接位置.我必须首先找到BUTTON1 的当前位置在实时屏幕内的位置.(我试图发布这个图片,但我想我不能,因为我是一个新用户...我希望描述清楚......)

我认为Sikuli正在使用OpenCV.由于它是开源的,我想我可以对它进行逆向工程,并弄清楚如何在OpenCV中做他们正在做的事情,而不是在Emgu.CV中实现它 - 但我的Java不是很强大.

我查找了显示此示例的示例,但所有示例都非常简单(即,如何识别停止标志)或非常复杂(即如何进行面部识别)......也许我只是密集,但我可以似乎在如何做到这一点的逻辑上跳了起来.

另外我担心所有各种图像处理程序实际上都是处理器密集型的,我真的希望它尽可能轻量级(实际上我可能有很多按钮和字段,我试图在屏幕上找到......)

所以,我正在考虑这样做的方式是:

A)将位图转换为字节数组并执行强力搜索.(我知道该怎么做).然后

B)使用我找到的字节数组位置来计算它的屏幕位置(我真的不完全确定我是怎么做的)而不是使用图像处理的东西.

这完全是疯了吗?有没有人有一个简单的例子说明如何使用Aforge.Net或Emgu.CV来做到这一点?(或者如何充实上面的步骤B ......?)

谢谢!

小智 1

一般来说,听起来您想要基本的物体识别。我没有任何使用 SIKULI 的经验,但是有很多方法可以进行对象识别(基于边缘的模板匹配等)。话虽如此,您也许可以直接进行直方图匹配。

http://www.codeproject.com/KB/GDI-plus/Image_Processing_Lab.aspx

该页面应该向您展示如何使用 AForge.net 获取图像的直方图。你只需使用如下的方法进行强力搜索:

Bitmap ImageSearchingWithin=new Bitmap("Location of image"); //or just load from a screenshot or whatever
for (int x = 0; x < ImageSearchingWithin.Width - WidthOfImageSearchingFor; ++x)
{
    for (int y = 0; y < ImageSearchingWithin.Height - HeightOfImageSearchingFor; ++y)
    {
        Bitmap MySmallViewOfImage = ImageSearchingWithin.Clone(new Rectangle(x, y, WidthOfImageSearchingFor, HeightOfImageSearchingFor), System.Drawing.Imaging.PixelFormat.Format24bppRgb);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后将新创建的位图的直方图与您计算的原始图像的直方图进行比较(匹配度最接近的区域就是您选择的 BUTTON1 区域)。这不是最优雅的解决方案,但它可能适合您的需求。否则你会遇到更困难的技术(当然我现在可能会忘记一些可能更简单的东西)。