【发布时间】:2011-01-29 04:06:30
【问题描述】:
我有 2 张 bmp 图片。 ImageA 是屏幕截图(示例) ImageB 是其中的一个子集。例如,一个图标。
我想在 ImageA 中找到 ImageB 的 X、Y 坐标(如果存在的话)。
知道我会怎么做吗?
【问题讨论】:
-
你能把两张BMP图片贴在这里吗?
标签: c# image image-processing
我有 2 张 bmp 图片。 ImageA 是屏幕截图(示例) ImageB 是其中的一个子集。例如,一个图标。
我想在 ImageA 中找到 ImageB 的 X、Y 坐标(如果存在的话)。
知道我会怎么做吗?
【问题讨论】:
标签: c# image image-processing
这是一个快速示例,但速度很慢,大约需要 4-6 秒,但它完全符合您的要求,我知道这篇文章很旧,但如果最近有其他人访问这篇文章 你可以看看这个东西 你需要 .NET AForge 命名空间或框架谷歌它并安装它 在您的项目中包含 AForge 名称空间,仅此而已 它找到另一张图片并给出坐标。
System.Drawing.Bitmap sourceImage = (Bitmap)Bitmap.FromFile(@"C:\SavedBMPs\1.jpg");
System.Drawing.Bitmap template = (Bitmap)Bitmap.FromFile(@"C:\SavedBMPs\2.jpg");
// create template matching algorithm's instance
// (set similarity threshold to 92.1%)
ExhaustiveTemplateMatching tm = new ExhaustiveTemplateMatching(0.921f);
// find all matchings with specified above similarity
TemplateMatch[] matchings = tm.ProcessImage(sourceImage, template);
// highlight found matchings
BitmapData data = sourceImage.LockBits(
new Rectangle(0, 0, sourceImage.Width, sourceImage.Height),
ImageLockMode.ReadWrite, sourceImage.PixelFormat);
foreach (TemplateMatch m in matchings)
{
Drawing.Rectangle(data, m.Rectangle, Color.White);
MessageBox.Show(m.Rectangle.Location.ToString());
// do something else with matching
}
sourceImage.UnlockBits(data);
【讨论】:
AForge.Imaging,解决命名空间 (using AForge.Imaging; / using System.Drawing;) 并且代码可以快速运行。 (-:
如果图像 B 是图像 A 的 exact 子集(意思是像素值完全相同),这不是图像处理问题,它只是 2D 中的字符串匹配。在 99% 的情况下,从 B 的中间取一条线并将其与 A 的每一行相匹配,就能达到你想要的效果,而且速度超快……我猜 C# 有一个功能。在你得到你的匹配之后(通常是几个),只需检查整个 B 和 A 的适当部分。
我能看到的唯一问题是,在某些情况下你会得到太多的匹配。例如。如果 A 是您的桌面,B 是一个图标,那么您很不幸在 B 中选择了仅包含背景的一行。这个问题很容易解决(您必须更仔细地从 B 中选择行),但这取决于您的问题的具体情况。
【讨论】:
如果前两个问题的答案是否和是,那么你有一个简单的问题。了解Q3的答案也很有帮助。
更新:
基本思路是这样的:不是将 imageB 中每个像素周围的窗口与 imageA 中的每个像素匹配并检查相关性,而是在两个图像中识别出可可跟踪的兴趣点(或特征) >。所以看起来拐角确实是可追踪的,因为它周围的区域有点相似(不详述) - 因此,让我们在两张图像中找到一些非常strong的拐角并搜索看起来最相似的拐角。
这减少了用 A 搜索 B 中的每个像素的问题,例如搜索 B 中的 500 个角和 A 中的 1000 个角(或类似的东西) - 更快。
很棒的是,OpenCV 中有几个这样的角落检测器可供您使用。如果您不喜欢使用emguCV(C# 变体),请使用FAST 检测器来查找匹配的角点,从而定位图像之间的多个特征。一旦你有了它,你就可以找到图像左上角的位置。
【讨论】:
imageBs 都会那么小吗?
【讨论】: