opencv-计算图像的SIFT特征及匹配

来源:互联网 发布:战争框架steam网络 编辑:程序博客网 时间:2024/05/22 00:20
#include <opencv2/highgui/highgui.hpp>#include <opencv2/nonfree/nonfree.hpp>#include <opencv2/legacy/legacy.hpp>#include <iostream>using namespace std;// 计算图像的SIFT特征及匹配float cacSIFTFeatureAndCompare(cv::Mat srcImage1,cv::Mat srcImage2, float paraHessian){ CV_Assert(srcImage1.data != NULL && srcImage2.data != NULL);// 转换为灰度cv::Mat grayMat1, grayMat2;cv::cvtColor(srcImage1, grayMat1, CV_RGB2GRAY);cv::cvtColor(srcImage2, grayMat2, CV_RGB2GRAY);// 初始化SURF检测描述子cv::SurfFeatureDetector surfDetector(paraHessian);cv::SurfDescriptorExtractor surfExtractor;// 关键点及特征描述矩阵声明vector<cv::KeyPoint> keyPoints1, keyPoints2;cv::Mat descriptorMat1, descriptorMat2;// 计算surf特征关键点surfDetector.detect( grayMat1, keyPoints1 );surfDetector.detect( grayMat2, keyPoints2 );// 计算surf特征描述矩阵surfExtractor.compute(grayMat1, keyPoints1, descriptorMat1);surfExtractor.compute(grayMat2, keyPoints2, descriptorMat2);float result = 0;// 特征点匹配if (keyPoints1.size() > 0 && keyPoints2.size() > 0){// 计算特征匹配点cv::FlannBasedMatcher matcher;vector< cv::DMatch > matches;std::vector<cv::DMatch> viewMatches;matcher.match( descriptorMat1, descriptorMat2, matches);// 最优匹配判断double minDist = 100;for (int i = 0; i < matches.size(); i++){ if(matches[i].distance < minDist) minDist = matches[i].distance;}// 计算距离特征符合要求的特征点int num = 0;std::cout << "minDist: "<< minDist << std::endl;for( int i = 0; i < matches.size(); i++ ){ // 特征点匹配距离判断if(matches[i].distance <= 2 * minDist){result += matches[i].distance * matches[i].distance;viewMatches.push_back(matches[i]);num++;}}// 匹配度计算result /= num;// 绘制特征点匹配结果cv::Mat matchMat;cv::drawMatches(srcImage1, keyPoints1, srcImage2, keyPoints2, matches, matchMat); cv::imshow("matchMat", matchMat); cv::waitKey(0);}return result;}int main (){// 读取源图像及待匹配图像cv::Mat srcImage1 = cv::imread("hand1.jpg", 1); if (srcImage1.empty()) return -1;cv::Mat srcImage2 = cv::imread("hand3.jpg", 1); if (srcImage2.empty()) return -1;float matchRate= cacSIFTFeatureAndCompare(srcImage1, srcImage2,1000);std::cout <<"matchRate: " << matchRate << std::endl;return 0;}

http://lib.csdn.net/base/opencv

0 0