人们一直在讨论如何比较两个图像,“计算”它们之间的差异。这可以看作是图像比较的一种变体,但不完全是。 考虑一下: 假设我有一支笔的图像,存储在我的手机(Android 手机)的 SD 卡中。而且,我正在用我的相机在我家里“搜索”这支笔。让我们忽略我可以用眼睛做同样的事情这一事实,让相机来进行搜索。所以,我在家里,将相机对准不同的地方,看看当我将相机对准这支笔时,相机是否可以“识别”这支笔。 用模糊的计算机科学术语来说,当我将相机对准物体时,我有一个线程在后台运行,不断地将这支笔的图像与当前的相机 View 进行比较。我将相机对准椅子,线程将椅子的相机 View 与笔的图像进行比较,并且由于椅子不是笔,因此它返回“false”。 当我最终将它指向放在 table 上的同一支笔时,线程应该确定这就是我们在 SD 卡上拥有其图像的笔。因此,相机 View 现在显示笔及其所在的 table ,但它应该使用图像比较技术来识别笔。
一般来说,这样的事情可能吗?忘记Android,或者智能手机,用相机“识别”一个区域或物体可能吗?由于对图像处理库一无所知,我只能假设某些库确实有执行此类操作的工具。或者至少,可能有一个“理论”算法可以开始研究。
谢谢
桑吉夫 Mk
最佳答案
这种事情是可以做的,但是要让它运作良好是非常非常困难的。我在 Android 上进行 OpenCV 处理的经验是,使用当前的移动硬件实时执行此操作是不可能的。 (用静止帧来做到这一点可能是可行的)
一个非常粗糙(而且是最简单的)系统将使用模板匹配cvMatchTemplate
。本质上,您将"template"(例如,钢笔的照片)与搜索图像中每个可能位置的照片进行比较。它的计算量很大,但在受限环境下工作得很好,但是您的应用程序需要完全不受约束的条件。
我的建议是看看 Surf 或类似的东西以及霍夫变换。您可以通过引用图像在对象上生成一组 SURF 特征来制作对象的“指纹”。您在搜索图像上运行冲浪。然后应用广义霍夫变换,其中对象模型是一组特征点。霍夫空间中的峰值代表良好的匹配。
我从未尝试过第二种方法,但我知道这是可能的。而且我提出的两种方法绝不是唯一的两种,它们只是我所熟悉的两种。
关于安卓 : Camera view comparison with stored image,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12032028/