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;
}