生活随笔
收集整理的這篇文章主要介紹了
OpenCV2.4.4中调用SIFT特征检测器进行图像匹配
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
OpenCV中一些相關結構說明:
特征點類:
[cpp]?view plain
?copy ? class?KeyPoint?? {?? ???????Point2f??pt;???? ???????float??size;??? ???????float??angle;??? ???????float??response;??? ???????int??octave;??? ???????int??class_id;??? }??
存放匹配結果的結構:
[cpp]?view plain
?copy ? struct?DMatch?? {?? ????????? ????DMatch():?queryIdx(-1),?trainIdx(-1),imgIdx(-1),distance(std::numeric_limits<float>::max())?{}?? ????DMatch(int??_queryIdx,?int??_trainIdx,?float??_distance?)?:?? ?????????????????????queryIdx(?_queryIdx),trainIdx(?_trainIdx),?imgIdx(-1),distance(?_distance)?{}?? ????DMatch(int??_queryIdx,?int??_trainIdx,?int??_imgIdx,?float??_distance?)?:?? ????????????queryIdx(_queryIdx),?trainIdx(?_trainIdx),?imgIdx(?_imgIdx),distance(?_distance)?{}?? ?? ????intqueryIdx;???? ????inttrainIdx;????? ????intimgIdx;?????? ????float?distance;???? ????booloperator?<?(const?DMatch?&m)?const;?? };??
?????? 說明:以兩個特征點描述子(特征向量)之間的歐氏距離作為特征點匹配的相似度準則,假設特征點對p和q的
????????????? ?特征描述子分別為Desp和Desq,則其歐氏距離定義為:
????????????? ? 所以每個匹配分別對應訓練圖像(train)和查詢圖像(query)中的一個特征描述子(特征向量)。
[cpp]?view plain
?copy ? #include?"opencv2/highgui/highgui.hpp"?? #include?"opencv2/imgproc/imgproc.hpp"?? #include?"opencv2/nonfree/nonfree.hpp"?? #include?"opencv2/nonfree/features2d.hpp"?? #include?<iostream>?? #include?<stdio.h>?? #include?<stdlib.h>?? ?? using?namespace?cv;?? using?namespace?std;?? ?? int?main()?? {?? ????initModule_nonfree();?? ????Ptr<FeatureDetector>?detector?=?FeatureDetector::create(?"SIFT"?);?? ????Ptr<DescriptorExtractor>?descriptor_extractor?=?DescriptorExtractor::create(?"SIFT"?);?? ????Ptr<DescriptorMatcher>?descriptor_matcher?=?DescriptorMatcher::create(?"BruteForce"?);?? ????if(?detector.empty()?||?descriptor_extractor.empty()?)?? ????????cout<<"fail?to?create?detector!";?? ?? ?????? ????Mat?img1?=?imread("desk.jpg");?? ????Mat?img2?=?imread("desk_glue.jpg");?? ?? ?????? ????double?t?=?getTickCount();?? ????vector<KeyPoint>?keypoints1,keypoints2;?? ????detector->detect(?img1,?keypoints1?);?? ????detector->detect(?img2,?keypoints2?);?? ????cout<<"圖像1特征點個數:"<<keypoints1.size()<<endl;?? ????cout<<"圖像2特征點個數:"<<keypoints2.size()<<endl;?? ?? ?????? ????Mat?descriptors1,descriptors2;?? ????descriptor_extractor->compute(?img1,?keypoints1,?descriptors1?);?? ????descriptor_extractor->compute(?img2,?keypoints2,?descriptors2?);?? ????t?=?((double)getTickCount()?-?t)/getTickFrequency();?? ????cout<<"SIFT算法用時:"<<t<<"秒"<<endl;?? ?? ?? ????cout<<"圖像1特征描述矩陣大小:"<<descriptors1.size()?? ????????<<",特征向量個數:"<<descriptors1.rows<<",維數:"<<descriptors1.cols<<endl;?? ????cout<<"圖像2特征描述矩陣大小:"<<descriptors2.size()?? ????????<<",特征向量個數:"<<descriptors2.rows<<",維數:"<<descriptors2.cols<<endl;?? ?? ?????? ????Mat?img_keypoints1,img_keypoints2;?? ????drawKeypoints(img1,keypoints1,img_keypoints1,Scalar::all(-1),0);?? ????drawKeypoints(img2,keypoints2,img_keypoints2,Scalar::all(-1),0);?? ?????? ?????? ?? ?????? ????vector<DMatch>?matches;?? ????descriptor_matcher->match(?descriptors1,?descriptors2,?matches?);?? ????cout<<"Match個數:"<<matches.size()<<endl;?? ?? ?????? ?????? ????double?max_dist?=?0;?? ????double?min_dist?=?100;?? ????for(int?i=0;?i<matches.size();?i++)?? ????{?? ????????double?dist?=?matches[i].distance;?? ????????if(dist?<?min_dist)?min_dist?=?dist;?? ????????if(dist?>?max_dist)?max_dist?=?dist;?? ????}?? ????cout<<"最大距離:"<<max_dist<<endl;?? ????cout<<"最小距離:"<<min_dist<<endl;?? ?? ?????? ????vector<DMatch>?goodMatches;?? ????for(int?i=0;?i<matches.size();?i++)?? ????{?? ????????if(matches[i].distance?<?0.31?*?max_dist)?? ????????{?? ????????????goodMatches.push_back(matches[i]);?? ????????}?? ????}?? ????cout<<"goodMatch個數:"<<goodMatches.size()<<endl;?? ?? ?????? ????Mat?img_matches;?? ?????? ????drawMatches(img1,keypoints1,img2,keypoints2,goodMatches,img_matches,?? ????????????????Scalar::all(-1),CV_RGB(0,255,0),Mat(),2);?? ?? ????imshow("MatchSIFT",img_matches);?? ????waitKey(0);?? ????return?0;?? }??
結果:
效果圖:
源碼下載:
http://download.csdn.net/detail/masikkk/5511831
當然,這些匹配還沒有經過系統的篩選,還存在大量的錯配,關于匹配的篩選參見這篇文章:
?利用RANSAC算法篩選SIFT特征匹配
以及RobHess的SIFT源碼分析系列文章:http://blog.csdn.net/masibuaa/article/details/9191309
from:?http://blog.csdn.net/masibuaa/article/details/8998601
總結
以上是生活随笔為你收集整理的OpenCV2.4.4中调用SIFT特征检测器进行图像匹配的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。