1. 程式人生 > >SURF特徵點檢測與匹配之誤匹配點刪除

SURF特徵點檢測與匹配之誤匹配點刪除

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