提高OpenCV中cvMatchShapes的匹配准确性

时间:2011-11-24 23:34:48

标签: image-processing opencv matching image-recognition

我尝试使用cvMatchShapes()来匹配两种标记模式。正如您在Best way to count number of "White Blobs" in a Thresholded IplImage in OpenCV 2.3.0所看到的那样,源的图像质量很差。

我对从该函数返回的结果不满意,大多数时候它给出了不正确的匹配。如何使用此功能(或一些合适的功能)进行有效匹配?

注意:我的后备解决方案是将标记图案更改为具有相当大/清晰可见的形状。请访问上面的链接,查看我当前的标记模式。

修改

我发现了OpenCV中实现的各种特征检测算法的综合比较。 http://computer-vision-talks.com/2011/01/comparison-of-the-opencvs-feature-detection-algorithms-2。据说FAST似乎是个不错的选择。

我会给那些能够分享好教程的人提供 +1,以便在OpenCV中实施FAST(否则为STAR / SURF / SIFT)。我无法 google 认为快速,如 speed :(

1 个答案:

答案 0 :(得分:3)

Here是FAST发明家的网站。 FAST代表加速细分测试的功能Here是基于AST的算法的简短维基百科条目。此外,here是对当前使用的不同特征检测器的一个很好的调查。

FAST实际上已经由OpenCV实现,如果您想使用它们的实现。

编辑:以下是我创建的简短示例,向您展示如何使用FAST探测器:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <vector>

using namespace std;
using namespace cv;

int main(int argc, char* argv[])
{
    Mat far = imread("far.jpg", 0);
    Mat near = imread("near.jpg", 0);

    Ptr<FeatureDetector> detector = FeatureDetector::create("FAST");

    vector<KeyPoint> farPoints;
    detector->detect(far, farPoints);

    Mat farColor;
    cvtColor(far, farColor, CV_GRAY2BGR);
    drawKeypoints(farColor, farPoints, farColor, Scalar(255, 0, 0), DrawMatchesFlags::DRAW_OVER_OUTIMG);
    imshow("farColor", farColor);
    imwrite("farPoints.jpg", farColor);

    vector<KeyPoint> nearPoints;
    detector->detect(near, nearPoints);

    Mat nearColor;
    cvtColor(near, nearColor, CV_GRAY2BGR);
    drawKeypoints(nearColor, nearPoints, nearColor, Scalar(0, 255, 0), DrawMatchesFlags::DRAW_OVER_OUTIMG);
    imshow("nearColor", nearColor);
    imwrite("nearPoints.jpg", nearColor);

    waitKey();
    return 0;
}

此代码查找远近图像的以下要素点:
near image far image

正如您所看到的,近距离图像具有更多功能,但看起来远程图像检测到相同的基本结构。所以,你应该能够匹配这些。看看descriptor_extractor_matcher.cpp。这应该让你开始。

希望有所帮助!