opencv特征检测及匹配通用步骤及Code
转载请注明出处:原创地址https://blog.csdn.net/qq_41007606/article/details/81875193
当我们学习一个新的知识的时候,往往我们第一点能够想到的就是这个东西有什么用,有没有实际价值。如果学会了一样本领,现实生活中却用不到,这也是一种浪费,浪费的是时间精力。
那么,特征检测在视觉领域有哪些地方可以用到呢?如下:
1、图像匹配;
2、图像拼接;
3、实时跟踪;
……
什么是特征检测呢?所谓的特征检测直观一些的讲就是,你用手机拍了两幅图片,在这两幅图片中有重叠的区域,想要找出这两幅图片中相似的部分,度量他们是否相似的一些特征就是我们检测出来的特征点。现在我们要让计算机去找到这些特征点,会是什么样子呢?请看下面的例子。
首先我从网站上截取了两张图片,如下:
用肉眼不难发现两张图片中的建筑是有重叠的部分的,那么我们来看一下使用opencv检测出来的重合部分或者说是具有相同特征的部分是什么样子的呢?
上面这幅图是使用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
如有不对的地方请指正,谢谢各位!