【问题标题】:Opencv match contour imageOpencv匹配轮廓图像
【发布时间】:2011-12-13 17:46:13
【问题描述】:

我想知道比较一组轮廓的最佳策略是什么,实际上是从两张图片中进行精明边缘检测的边缘,以便知道哪一对更相似。

我有这张图片:

http://i55.tinypic.com/10fe1y8.jpg

我想知道如何计算其中哪一个最适合它:

http://i56.tinypic.com/zmxd13.jpg

(应该是右边那个)

是否可以将轮廓作为一个整体进行比较? 我可以轻松地旋转图像,但我不知道使用什么函数来计算右侧的参考图像是最合适的。

这是我已经使用 opencv 尝试过的:

matchShapes 函数 - 我使用 2 个灰度图像尝试了这个函数,并且在每个比较图像中我总是得到相同的结果,并且该值似乎是错误的,因为它是 0,0002。

所以我意识到 matchShapes,但我不确定这是正确的假设,即该函数适用于成对的轮廓而不是完整的图像。现在这是一个问题,因为虽然我有要比较的图像的轮廓,但它们有数百个,我不知道应该“配对”哪些。

所以我还尝试通过 for 迭代将第一张图像的所有轮廓与其他两个进行比较,但我可能会比较,例如,5 的轮廓与圆形轮廓两个参考图像,而不是 2 轮廓。

还尝试了简单的 cv::compare 函数和 matchTemplate,都没有成功。

【问题讨论】:

    标签: opencv contour


    【解决方案1】:

    嗯,为此,您有几个选择,具体取决于您需要的方法有多稳健。

    简单解决方案(带假设):

    对于这些方法,我假设您提供的图像就是您正在使用的图像(即,对象已经被分割并且比例大致相同。此外,您需要更正旋转(至少在粗略的方式)。您可以执行类似的操作,例如每 10、30、60 或 90 度或任何您认为可以避免的粗糙度迭代旋转比较图像。

    例如,

    for(degrees = 10; degrees < 360; degrees += 10)
        coinRot = rotate(compareCoin, degrees)
        // you could also try Cosine Similarity, or even matchedTemplate here.
        metric = SAD(coinRot, targetCoin) 
        if(metric > bestMetric)
            bestMetric = metric
            coinRotation = degrees
    

    • Sum of Absolute Differences (SAD):一旦确定了大致的旋转角度,您就可以快速比较图像。
    • Cosine Similarity:这有点不同,将图像视为一维向量,然后计算两个向量之间的高维角度。匹配度越高,角度越小。

    复杂的解决方案(可能更强大):

    这些解决方案实施起来会更复杂,但可能会产生更可靠的分类。


    • Haussdorf Distance:这个answer会给你介绍一下这个方法的使用。此解决方案可能还需要旋转校正才能正常工作。
    • Fourier-Mellin Transform:该方法是Phase Correlation的扩展,可以提取两幅图像之间的旋转、缩放和平移(RST)变换。
    • Feature Detection and Extraction:此方法涉及检测图像中的“稳健”(即缩放和/或旋转不变)特征,并使用 RANSAC、LMedS 或简单最小二乘法将它们与一组目标特征进行比较。 OpenCV 在matcher_simple.cppmatching_to_many_images.cpp 中有几个使用这种技术的示例。 注意:使用此方法您可能不想对图像进行二值化,因此有更多可检测的功能可用。

    【讨论】:

    • 非常感谢您提供的指导方针...我会深入研究...非常感谢..当我更好地分析推荐的步骤时,我会提供一些反馈。
    猜你喜欢
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 2019-02-12
    • 2023-03-09
    • 2011-06-13
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    相关资源
    最近更新 更多