C++和OpenCV的图像比较方法
Posted
技术标签:
【中文标题】C++和OpenCV的图像比较方法【英文标题】:Image comparison method with C++ and OpenCV 【发布时间】:2012-05-28 06:56:23 【问题描述】:我是 OpenCV 的新手。我想知道我们是否可以比较两张图像(一张由 photoshop 制作的图像,即源图像,另一张将从相机中获取)并确定它们是否相同。 我尝试使用模板匹配来比较图像。这没用。您能告诉我我们可以使用哪些其他程序进行这种比较?
【问题讨论】:
【参考方案1】:可以根据您的目的以不同的方式比较图像:
如果你只是想比较两个图像是否近似相等(有几个 亮度差异),但使用相同的视角和相机视图,您可以简单地 计算每个色带的像素到像素平方差。如果平方和超过 两个图像小于图像匹配的阈值,否则不匹配。 如果一个图像是另一个图像的黑白变体,则彩色图像的转换是 需要(参见例如http://www.johndcook.com/blog/2009/08/24/algorithms-convert-color-grayscale)。 Afterwarts 只需执行上述步骤。 如果一个图像是另一个图像的子图像,则需要执行这两个图像的配准 图片。这意味着确定比例、可能的旋转和 XY 平移,即 有必要将子图像放在较大的图像上(有关注册图像的方法,请参阅: Pluim, J.P.W., Maintz, J.B.A., Viergever, M.A. , 基于互信息的注册 医学图像:一项调查,IEEE Transactions on Medical Imaging,2003 年,第 22 卷,第 8 期, 第 986 - 1004 页) 如果您有透视差异,您需要一种算法来校正一张图像 尽可能匹配另一个。对于进行纠偏的方法,例如 http://javaanpr.sourceforge.net/anpr.pdf 从第 15 页起。祝你好运!
【讨论】:
【参考方案2】:您应该尝试 SIFT。您将 SIFT 应用于您的标记(保存在内存中的图像),您会得到一些描述符(可以识别的点)。然后,您可以对相机帧使用 FAST 算法,以便在相机图像中找到标记的对应关键点。 你有很多关于这个话题的话题:
How to get a rectangle around the target object using the features extracted by SIFT in OpenCV
How to search the image for an object with SIFT and OpenCV?
OpenCV - Object matching using SURF descriptors and BruteForceMatcher
祝你好运
【讨论】:
感谢您的 rply 。但我认为它不适用于非常小的不同 ..假设源图像包含两辆汽车 ....并且要比较的图像也包含两辆相同的汽车。 ..但是其中一辆车有一个红十字标记..它无法检测到 肯定可以。 SIFT 检测“角”,即在任何比例、任何角度、上下颠倒等下易于识别的点……我已经将它用于杂乱的图片,并且工作得非常好。它是最先进的检测器,以及快速。试一试。有什么比草地上的绿草图片更难检测的。 SIFT 没有问题 我已经尝试使用 SIFT 描述符和 FlannBasedMatcher 进行比较,但它无法检测到图像的不常见部分......总之它只是检测到两个图像是相同的......非常感谢以上是关于C++和OpenCV的图像比较方法的主要内容,如果未能解决你的问题,请参考以下文章