【问题标题】:Screen Region Recognition to Find Field location on Screen屏幕区域识别以在屏幕上查找字段位置
【发布时间】:2011-07-02 09:13:45
【问题描述】:

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

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

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

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

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

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

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

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

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

谢谢!

【问题讨论】:

  • +1 很棒的问题 - 我希望有人能给出一个好的答案!

标签: c# .net image-processing sikuli


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

【讨论】:

  • 我会接受这个答案,只是因为我没有看到任何其他有价值的东西。老实说,当我发现 Sikuli 下面的 OCR 库存在一些内存泄漏问题时,我放弃了这个。直方图将是要走的路,但是从这里到那里还有很多工作要做......
猜你喜欢
  • 2011-05-31
  • 2010-09-25
  • 1970-01-01
  • 2012-04-09
  • 2010-12-18
  • 2019-01-31
  • 2021-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多