天天看點

SURF特征點檢測與比對之誤比對點删除

SURF特征點檢測與比對之誤比對點删除

SURF(SpeededUp Robust Feature)是加速版的具有魯棒性的算法,是SIFT算法的加速版。

但是SURF特征比對之後有大量的誤比對點,需要對這些誤比對點進行删除。

這裡不從理論上講解SURF原理等,直接說用法。

特征比對的步驟分為三步:

1、找出特征點

2、描述特征點

3、特征點比對

具體基本代碼見最後。具體的可以看毛星雲的書籍,但是個人認為其程式設計風格不嚴謹,自己有做改動。

但是比對出來的結果如下:

SURF特征點檢測與比對之誤比對點删除

有很多的誤比對點,如何對誤比對點進行删除呢。

雙向比對加距離限制。

實驗結果如下:效果還是非常好的。

SURF特征點檢測與比對之誤比對點删除
#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;
}
           

繼續閱讀