我有2个bmp图像。 ImageA是截图(示例)ImageB是其中的一个子集。比如说一个图标。
我想在ImageA中找到ImageB的X,Y坐标(如果存在)。
知道我该怎么做吗?
答案 0 :(得分:2)
这称为光学识别。它可能看起来很复杂(实际上)但实现起来非常简单,所以不要回避它!
让Image A
成为我们正在寻找的图片,Image B
是包含Image A
的较大图片。
如果Image A
中的Image B
缩放未被更改,并且颜色全部保留,则可以将Image B
放在HTML 5画布上迭代像素数据。您将从Image A
加载第一行像素,然后迭代Image B
中的每个像素。如果像素相同,则将该像素列存储在变量中,并检查下一个是否匹配。如果第一行是完全匹配,则跳到下一行并比较它们。你重复一遍,直到你得到一个匹配或击中一个(或足够)不匹配的像素。在这种情况下,您将重置所有变量并重新开始寻找与第1行的匹配。
如果Image A
Image B
在Image A
中完全相同,则会出现新的并发症,事情会变得复杂得多。如果仅改变比例,我们可以对方法1进行一些调整以获得有效的方法。我们还需要跟踪图像纯粹/压缩,而不是抓取任何像素并查看是否匹配80%。
在每一行中,逐步增加像素。例如,我们将检查每十个像素。如果我们找到像素1的匹配项,那么我们会检查10个像素,看看该行中是否存在 where 。如果我们找到它,从0到该像素的距离除以10(我们的增量)是原始图像的大小。
如果我们在Image B
中找到0个像素的20个像素,并且在1) compression = target_width / original_width
2) compression = 20 / 10
3) compression = 2
中仅相差10个像素(请记住,10是我们的增量),那么我们的原始图像要大2倍。换句话说,新图像是原始图像的一半。
Image A
这是一种检测匹配的更复杂但更健壮的方法。足够匹配的行意味着你有一个匹配的图像,但垂直拉伸呢?
类似的逻辑。如果您找到匹配的行,请从0开始并向下移动10,然后在docker-compose up --build
中找到该像素匹配。
我提供的方法是在查找任何其他图像中的任何图像时使用的通用方法。你可以想象这是性能密集型的。我不知道你要检测的图像是什么,但如果有常见的形状,有时你可以做其他算法。例如,如果你有一个圆圈,你可以检查像素在半径之外是否与相同的像素。
我提出的方法也不能补偿 warping 。如果图像被拉伸但保持矩形比例,方法2应该没问题。例如,如果图像被扭曲成圆形,则事情会变得无比复杂。对于这种情况,我可以提供的唯一提示是检查原始半径内的像素以进行匹配。