opencv特征检测及匹配通用步骤及Code

opencv特征检测及匹配通用步骤及Code

转载请注明出处:原创地址https://blog.csdn.net/qq_41007606/article/details/81875193

当我们学习一个新的知识的时候,往往我们第一点能够想到的就是这个东西有什么用,有没有实际价值。如果学会了一样本领,现实生活中却用不到,这也是一种浪费,浪费的是时间精力。
那么,特征检测在视觉领域有哪些地方可以用到呢?如下:
1、图像匹配;
2、图像拼接;
3、实时跟踪;
……
什么是特征检测呢?所谓的特征检测直观一些的讲就是,你用手机拍了两幅图片,在这两幅图片中有重叠的区域,想要找出这两幅图片中相似的部分,度量他们是否相似的一些特征就是我们检测出来的特征点。现在我们要让计算机去找到这些特征点,会是什么样子呢?请看下面的例子。
首先我从网站上截取了两张图片,如下:
图片一
图片二
用肉眼不难发现两张图片中的建筑是有重叠的部分的,那么我们来看一下使用opencv检测出来的重合部分或者说是具有相同特征的部分是什么样子的呢?
SURF特征检测效果图
上面这幅图是使用SURF特征匹配算法实现的特征匹配效果图。
如果觉得有意思的朋友们,我们可以接着往下看看,使用c++和opencv是如何实现的。
我将特征检测的步骤分成了以下几个部分。
//步骤一:读取图片并将图片灰度化
//code:

Mat src1, src2;
src1 = imread("图片路径");
src2 = imread("图片路径");
Mat graySrc1, graySrc2;
cvtColor(src1, graySrc1, CV_BGR2GRAY);
cvtColor(src2, graySrc2, CV_BGR2GRAY);

//步骤二:提取特征并描述
//code:

vector<KeyPoint> keys1;  
vector<KeyPoint> keys2;
Ptr<xfeatures2d::SURF> detector = xfeatures2d::SURF::create(1500);

Mat descriptorMat1, descriptorMat2;
detector->detectAndCompute(src1, Mat(), keys1, descriptorMat1);
detector->detectAndCompute(src2, Mat(), keys2, descriptorMat2);

//步骤三:特征点匹配
//code:

    cv::BFMatcher matcher;
    std::vector<DMatch> matches;
    matcher.match(descriptorMat1, descriptorMat2, matches);

//步骤四:获取优秀匹配点
//code:

double max_dist = 0; double min_dist = 100;
for (int i=0; i<descriptorMat1.rows; i++)
{
    double dist = matches[i].distance;
    if (dist < min_dist) min_dist = dist;
    if (dist > max_dist) max_dist = dist;
}
cout<<"-- Max dist :"<< max_dist<<endl;
cout<<"-- Min dist :"<< min_dist<<endl;

vector< DMatch > good_matches;
for (int i=0; i<descriptorMat1.rows; i++)
{
    if (matches[i].distance < 0.2*max_dist)
    {
        good_matches.push_back(matches[i]);
    }
}

//步骤五:绘制特征匹配图
//code:

Mat img_matches;
drawMatches(src1, keys1, src2, keys2,good_matches, img_matches, 
            Scalar::all(-1), Scalar::all(-1),vector<char>(), 
            DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);

imwrite("SURFResult.jpg", img_matches);

以上就是整个特征检测的实现过程,根据实际项目需求,可以替换为SIFT,ORB,FAST等算法,仅需改动算法选择部分即可,其它代码博主已经写成了具有通用型的格式,任何检测算法都可以直接使用。

觉得有用的朋友可以帮博主点一波关注呦,谢谢
有问题的朋友可以联系博主本人进行问题咨询,有需要相关资料及开发环境也可以联系博主本人获取。
博主QQ:2021907249
如有不对的地方请指正,谢谢各位!

猜你喜欢

转载自blog.csdn.net/qq_41007606/article/details/81875193