如何在另一个图像中找到一个图像?
c#
image
image-processing
6
0

我有2张bmp图片。 ImageA是屏幕截图(示例),ImageB是其子集。例如说一个图标。

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

知道我会怎么做吗?

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃
  1. 那么ImageA中的ImageB是否有任何变形?
  2. 图像如何“精确”,例如,像素之间相同
  3. 您为此拥有多少计算能力?

如果前两个问题的答案为 ,那么您有一个简单的问题。这也有助于了解第三季度的答案。

更新:

基本思想是:不要将imageB中每个像素周围的窗口与imageA中每个像素匹配并检查相关性,而要确定两个图像中的可追踪点(或特征),这些点是可跟踪的 。因此,由于拐角周围的区域有点相似(因此不再赘述),因此看起来拐角确实是可追踪的-因此,让我们在两个图像中找到一些确实很强的拐角,并搜索看起来最相似的拐角。

这样就减少了用A搜索B中的每个像素,而不是搜索B中的500个角和A中的1000个角(或类似的东西)的问题-更快。

令人敬畏的是,您在OpenCV中可以使用多个这样的角检测器 。如果您不喜欢使用emguCV (C#变体),请使用FAST检测器查找匹配的角,从而在图像之间定位多个特征。一旦找到了,就可以找到图像左上角的位置。

收藏
评论

这是一个快速的示例,但是它花的时间很慢,大约需要4-6秒钟,但是它确实满足您的要求,我知道此帖子很旧,但是如果最近有其他人访问此帖子,则可以查找此东西。框架谷歌它,并安装它在您的项目中包括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);
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号