Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在另一个图像中找到一个图像?_C#_Image_Image Processing - Fatal编程技术网

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

C# 如何在另一个图像中找到一个图像?,c#,image,image-processing,C#,Image,Image Processing,我有2个bmp图像。 ImageA是一个屏幕截图(示例) ImageB是其中的一个子集。比如说,一个图标 我想找到ImageA中ImageB的X,Y坐标(如果存在) 知道我该怎么做吗? 那么在ImageA中是否存在ImageB的扭曲 图像的“精确性”如何,如中所示,像素对像素,它们将是相同的 你有多少计算能力 如果前两个问题的答案是“否”和“是”,那么您就有一个简单的问题。了解第三季度的答案也很有帮助 更新: 基本思想是这样的:与其将imageB中每个像素周围的窗口与imageA中的每个像素匹配

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

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

知道我该怎么做吗?



  • 那么在ImageA中是否存在ImageB的扭曲
  • 图像的“精确性”如何,如中所示,像素对像素,它们将是相同的
  • 你有多少计算能力
  • 如果前两个问题的答案是“否”和“是”,那么您就有一个简单的问题。了解第三季度的答案也很有帮助

    更新:

    基本思想是这样的:与其将imageB中每个像素周围的窗口与imageA中的每个像素匹配并检查相关性,不如在两幅图像中确定可跟踪的兴趣点(或特征)。所以它看起来像是真的可以跟踪的,因为它周围的区域有点相似(不深入细节)——因此,让我们在两幅图像中找到一些非常强的角,并搜索看起来最相似的角

    这将使用A搜索B中的每个像素的问题减少到例如,使用A中的1000个角搜索B中的500个角(或类似的),速度要快得多

    最棒的是,你有几个这样的角探测器在你的房间里。如果你不想使用(C#varriant),那么使用检测器来找到匹配的角点,从而在图像之间找到多个特征。一旦你有了它,你就可以找到图像左上角的位置。

    如果图像B是图像A的精确子集(意思是,像素值完全相同),这不是图像处理问题,只是2D中的字符串匹配。在99%的情况下,从B的中间取一条线,并将其与a的每一条线进行匹配,可以实现您想要的功能,而且速度非常快&mdhas;我想C#有一个功能。在获得匹配项(通常是其中的一部分)后,只需对照a的适当部分检查整个B


    我能看到的唯一问题是,在某些情况下,你可以得到太多的匹配。例如,如果A是你的桌面,B是一个图标,而你不幸地在B中选择了一条只包含背景的线。这个问题很容易解决(你必须更仔细地从B中选择行),但这取决于你问题的具体情况。

    这里有一个快速示例,但速度很慢,大约需要4-6秒,但它完全符合你的要求,我知道这篇文章很老,但是如果最近有人访问这篇文章的话 你可以看看这个东西 您需要.NET一个庞大的名称空间或框架来搜索它并安装它 在项目中包含一个巨大的名称空间,就这样 它找到另一个图形并给出坐标

    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);
    

    前两个问题与我的问题不同,产生了非常不同的结果。最后一个不起作用(另一个用户这样报告),即使它起作用了“720p也需要几分钟”。我将扫描1920x1200图像,多分钟是不可接受的。即使是从ImageB中获取Pixel1,在ImageA中找到它的所有实例,然后获取Pixel2并删除它不“紧挨着(水平/垂直)”的所有实例的算法,并重复,直到列表为空或所有像素都已扫描将快于几分钟。我只是在寻找更好的想法。。对于这样的事情,必须有一个合适的算法。如果你说的翘曲是指它们有不同的尺寸,那么第二。是的,它们将是逐像素相同的。我想解释一点点误差或规定的误差(1%,15%,50%)等。。但这不是必须的。3.假设最低要求是双proc x64 2.2GHz和2GB RAMI知道这一切可能看起来太过分了,但如果您可以发布BMP文件的链接,我可以向您展示它的效率/速度。非常简单。。我希望这种类型的东西是现有的windows应用程序。所以,只要拍一张chrome的屏幕截图,就可以在其中找到home(主页)按钮的X/Y。你所有的
    imageB
    都会那么小吗?@Jacob-我不想给你施加任何压力,但一切刚刚结束。你所说的几个是什么意思汉克斯这正是我要找的。有没有办法缩短6秒的时间?这对我现在所做的有点太高了,这对我也有好处。我首先将源图像和模板缩小到原始大小的40%,从而缩短了时间。(选择适合您的大小。)位图=新的大小比例尺((int)(bitmap.Width*0.4),(int)(bitmap.Height*0.4))。应用(位图);现在到2020年,您只需安装nuget软件包
    AForge.Imaging
    ,解决名称空间问题(
    使用AForge.Imaging;
    /
    使用System.Drawing;
    )。(-):你如何进行完整的2d字符串搜索,而不是仅仅一行?我会从B中找到所有有效的像素颜色,以及最大的连续/不透明矩形区域,然后我可以使用它跳过大图像并限制我测试的区域。你能在这里发布两个BMP图像吗?