image-processing - 提高 OpenCV 中 cvMatchShapes 的匹配精度

标签 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)的好教程 的人。我无法谷歌认为速度 :(

最佳答案

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 .这应该让你开始。

希望对您有所帮助!

关于image-processing - 提高 OpenCV 中 cvMatchShapes 的匹配精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8263487/

相关文章:

javascript - 使用 Javascript 或 WebAssembly 进行图像插值

python - 从叠加图像中提取多边形

python - 使用 cv2.VideoWriter 编写视频

c - 在 C 中使用无符号字符进行数据表示

Perl 函数参数消失。为什么?

c++ - 使用 OpenCV 改进特征点的匹配

python - 像素点变换的性能

OpenCV - 两个二值图像之间的交集

python - 在python中查找关键字后的单词

javascript - WebGL 基础知识 : Using Render Loops to Apply 2D Convolution Filters to Buffer Canvases