SURF特徵點檢測與匹配之誤匹配點刪除
阿新 • • 發佈:2018-12-30
SURF特徵點檢測與匹配之誤匹配點刪除
SURF(SpeededUp Robust Feature)是加速版的具有魯棒性的演算法,是SIFT演算法的加速版。
但是SURF特徵匹配之後有大量的誤匹配點,需要對這些誤匹配點進行刪除。
這裡不從理論上講解SURF原理等,直接說用法。
特徵匹配的步驟分為三步:
1、找出特徵點
2、描述特徵點
3、特徵點匹配
具體基本程式碼見最後。具體的可以看毛星雲的書籍,但是個人認為其程式設計風格不嚴謹,自己有做改動。
但是匹配出來的結果如下:
有很多的誤匹配點,如何對誤匹配點進行刪除呢。
雙向匹配加距離約束。
實驗結果如下:效果還是非常好的。
#include "stdafx.h" #include <opencv2\opencv.hpp> #include <opencv2\nonfree\nonfree.hpp> #include <opencv2\legacy\legacy.hpp> #include <iostream> int _tmain(int argc, _TCHAR* argv[]) { //讀取圖片 cv::Mat srcImg1 = cv::imread("1.jpg", 1); cv::Mat srcImg2 = cv::imread("2.jpg", 1); if (srcImg1.empty() || srcImg2.empty()) { std::cout << "Read Image ERROR!" << std::endl; return 0; } //SURF運算元特徵點檢測 int minHessian = 700; cv::SurfFeatureDetector detector(minHessian);//定義特徵點類物件 std::vector<cv::KeyPoint> keyPoint1, keyPoint2;//存放動態陣列,也就是特徵點 detector.detect(srcImg1, keyPoint1); detector.detect(srcImg2, keyPoint2); //特徵向量 cv::SurfDescriptorExtractor extrator;//定義描述類物件 cv::Mat descriptor1, descriptor2;//描述物件 extrator.compute(srcImg1, keyPoint1, descriptor1); extrator.compute(srcImg2, keyPoint2, descriptor2); //BruteForce暴力匹配 cv::BruteForceMatcher <cv::L2<float>>matcher;//匹配器 std::vector <cv::DMatch> matches; matcher12.match(descriptor1, descriptor2, matches); //繪製關鍵點 cv::Mat imgMatch; cv::drawMatches(srcImg1, keyPoint1, srcImg2, keyPoint2, matches, imgMatch); cv::namedWindow("匹配圖", CV_WINDOW_AUTOSIZE); cv::imshow("匹配圖", imgMatch); cv::imwrite("匹配圖.jpg", imgMatch); cv::waitKey(10); return 0; }