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

时间:2011-02-22 22:53:49

标签: c# .net 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 个答案:

答案 0 :(得分: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);
    }
}

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