我有2个bmp图像。 ImageA是截图(示例) ImageB是其中的一个子集。比如说一个图标。
我想在ImageA中找到ImageB的X,Y坐标(如果存在)。
知道我该怎么做吗?
答案 0 :(得分:16)
这是一个快速的样本,但它很慢需要大约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);
答案 1 :(得分:15)
如果前两个问题的答案是否且是,那么您有一个简单的问题。它也有助于了解 Q3 的答案。
<强>更新强>
基本思想是这样的:不是将imageB中每个像素周围的窗口与imageA中的每个像素相匹配并检查相关性,而是让我们识别两个图像中的感兴趣点(或特征)可跟踪。所以看起来角落确实是可跟踪的,因为它周围的区域有点相似(不详细说明) - 因此,让我们在两个图像中找到一些真正的强角并搜索看起来最相似的角落。
这减少了使用A搜索B中的每个像素来搜索B中的500个角以及A中的1000个角(或类似的东西)的问题 - 更快。
令人敬畏的是,您可以在OpenCV中使用几个这样的角落探测器。如果您不想使用emguCV(C#varriant),请使用FAST检测器查找匹配的角,从而找到图像之间的多个要素。完成后,您可以找到图像左上角的位置。
答案 2 :(得分:1)
如果图像B是图像A的精确子集(意味着,像素值完全相同),这不是图像处理问题,它只是2D中的字符串匹配。在99%的情况下,从B的中间取一条线并将其与A的每一条线相匹配将做你想要的,超快速和mdhas;我猜C#有一个功能。在你得到你的比赛(通常是其中一些)后,只需检查整个B对A的适当部分。
我能看到的唯一问题是,在某些情况下你可以得到太多的比赛。例如。如果A是你的桌面,B是一个图标,你不幸选择B中仅包含背景的一行。这个问题很容易解决(你必须更仔细地选择B中的行),但这取决于问题的具体情况。
答案 3 :(得分:0)
Finding sub images in an image {
{3}} {
{3}}