如何在另一张图片中查找一个图像?Node.js

3

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

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

你知道我该怎么做吗?


请查看以下网址: https://dev59.com/XV7Va4cB1Zd3GeqPGAsq - Ankit Pandey
1
你有没有尝试过自己解决这个问题? - Andy
1个回答

5
这被称为光学识别。它可能看起来很复杂(确实如此),但在实现上可以非常简单,所以不要回避它!
假设Image A是我们要查找的图像,Image B是包含Image A的大图像。
方法1
如果Image AImage B中的比例没有改变,并且颜色都得到了保留,您可以将Image B放在HTML 5画布上并迭代像素数据。您将从Image A加载第一行像素,然后迭代Image B中的每个像素。如果一个像素相同,则会将该像素列存储在变量中,并检查下一个是否匹配。如果第一行完全匹配,则跳转到下一行并进行比较。重复此过程,直到获得匹配或达到足够数量的不匹配像素。在这种情况下,您将重置所有变量并重新开始寻找与第1行匹配的内容。
方法2
如果Image AImage B中不是完全相同的,则会出现新的复杂情况,事情变得更加复杂。如果只有比例发生变化,我们可以对方法1进行一些调整,以获得可行的解决方案。我们需要额外跟踪图像的剪切/压缩
在每一行中,逐渐增加像素。例如,我们将检查每十个像素。如果我们找到了像素1的匹配项,则检查10个像素并查看该像素是否存在于我们的行中的任何位置。如果我们找到了它,则从0到该像素的距离除以10(我们的增量)即为原始图像的放大倍数。
假设我们在Image A中找到了一个距离0有20个插槽的像素,并且在Image B中只相隔10个像素(请记住,10是我们的增量),则我们的原始图像放大了2倍。换句话说,新图像的大小是原始图像的一半。
1) compression = target_width / original_width
2) compression = 20 / 10
3) compression = 2

这是一种更加复杂但健壮的方法来检测匹配。足够的匹配行意味着你已经找到了一个匹配的图像,但垂直拉伸怎么办?
类似的逻辑。如果你找到一个匹配的行,从0开始每隔10个像素往下,然后在Image A中找到该像素的匹配项。
编辑
我提供的方法是用于查找任何图像中的任何图像的通用方法。正如您所想象的那样,这对性能要求很高。我不知道您要检测的图像是什么,但如果有常见的形状,有时可以使用替代算法。例如,如果您有一个圆,只需检查半径外部是否有匹配的像素和内部是否有相同的像素即可。
我提出的方法也不能补偿弯曲。如果图像被拉伸但保持矩形比例,则方法2应该没问题。如果例如将图像变成圆形,情况会变得无限复杂。对于这种情况,我唯一能给出的提示就是检查原始图像半径内的像素是否匹配。

如果您需要一些能够实现这个功能的JS库,我也可以为您找几个,但是手动输入光学识别应该会给您带来足够的信息!祝你好运。 - mcfish
我在 npm 上寻找库,但我只找到了 OpenCV,而且关于这个主题的教程并不多 :( - greyb3ast
我正在开发一个光学识别项目,一旦我完成了可靠的功能,很可能会将其作为库发布。然而,目前这是一个相当不容易的任务,大多数人每次都必须重新发明轮子。 - mcfish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接