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