7

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

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

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

我寻找了显示这一点的示例,但所有示例都非常简单(即如何识别停车标志)或非常复杂(即如何进行面部识别)......也许我只是很密集,但我可以似乎没有使如何做到这一点的逻辑跳跃。

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

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

A)将位图转换为字节数组并进行暴力搜索。(我知道如何做那部分)。进而

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

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

谢谢!

4

1 回答 1

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 区域)。这不是最优雅的解决方案,但它可能会满足您的需求。否则你会接触到更难的技术(当然我现在可能会忘记一些可能更简单的东西)。

于 2011-07-23T20:37:54.123 回答