如何在另一个图像中找到一个图像?

esa*_*sac 30 c# image image-processing

我有2个bmp图像.ImageA是截图(示例)ImageB是其中的一个子集.比如说一个图标.

我想在ImageA中找到ImageB的X,Y坐标(如果存在).

知道我该怎么做吗?

小智 17

这是一个快速的样本,但它很慢需要大约4-6秒,但它完全符合您的要求,我知道这篇文章很老但是如果有人最近访问这篇文章你可以看看这个东西你需要.NET AForge命名空间或框架google它并安装它包括你的项目中的AForge名称空间,它就是它找到与另一个的pictiure并给出坐标.

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);
Run Code Online (Sandbox Code Playgroud)

  • 现在,在 2020 年,您只需要安装 **nuget** 包 `AForge.Imaging`,解决命名空间(`using AForge.Imaging;` / `using System.Drawing;`),代码就可以快速运行。(-: (2认同)

Jac*_*cob 15

  1. 那么ImageA中的ImageB是否有任何变形?
  2. 图像的"精确"程度如何,像素对像素它们将是相同的
  3. 你有多少计算能力?

如果回答前两个问题都没有,那么你有一个简单的问题.它也有助于了解Q3的答案.

更新:

基本思路是:不是将imageB中每个像素周围的窗口与imageA中的每个像素相匹配并检查相关性,而是让我们识别两个可跟踪的图像中的兴趣点(或特征).所以它看起来像是可以跟踪的角落,因为它周围的区域有点类似(不详细说明) - 因此,让我们在两个图像中找到一些非常强大的角落并搜索看起来最相似的角落.

这减少了用A搜索B中的每个像素以搜索例如B中的500个角以及A中的1000个角(或类似的东西)的问题 - 更快.

令人敬畏的是,您可以在OpenCV中使用几个这样的角落探测器.如果您不习惯使用emguCV(C#varriant),请使用FAST检测器查找匹配的角,从而找到图像之间的多个要素.完成后,您可以找到图像左上角的位置.

  • @Jacob - 我不是要施加任何压力,但它已经超过[60,452小时](https://www.timeanddate.com/date/durationresult.html?m1=3&d1=18&y1=2010&m2=2&d2= 8,Y2 = 2017&H1 = 21&I1 = 50&S1 = 00 H2 = 17&I2 = 50&S2 = 41).你究竟是什么意思*几个*?:P (7认同)