OpenCV學習筆記(十八) SIFT特徵

SIFT特徵:

SIFT是目前應用最廣泛的關鍵檢測和描述算法。關鍵點描述也稱特徵點描述,SIFT特徵提取充分利用了圖像局部信息。

主要包含了四個步驟:疑似特徵點檢測,去除僞關鍵點,關鍵點梯度和方向匹配及特徵向量生成。

OpenCV中提供了sift特徵描述及提取的類siftFeatureDetector,應用:ocv:class:SIFT來封裝用於計算特徵描述的子類,該類繼承特徵描述基類DescriptorExtrator。

應用DescriptorExtractor::create成員函數方法可以支持多種特徵描述子操作,常見的描述子包括

"SIFT"---SiftDescriptorExtractor  是一種強制匹配

vector<DMatch> matches;
	BruteForceMatcher<L2<float> > matcher;
	//bruteForce匹配
	matcher.match(descriptors1, descriptors2, matches);
建立一個<L2<float>>類型的匹配器,強制匹配兩幅圖特徵點,將之保存在matches中。

"SURF"---SurfDescriptorExtractor

"ORB"---OrbDescriptorExtractor

"BRIEF"---BriefDescriptorExtractor

程序實現:

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/nonfree/nonfree.hpp>
#include <opencv2/legacy/legacy.hpp>
#include <iostream>
using namespace cv;
using namespace std;
Mat cacSIFTFeatureAndCompare(Mat srcImage1, Mat srcImage2)
{
	CV_Assert(srcImage1.data != NULL && srcImage2.data != NULL);
	//轉換爲灰度並歸一化
	Mat grayMat1, grayMat2;
	cvtColor(srcImage1, grayMat1, CV_BGR2GRAY);
	normalize(grayMat1, grayMat1, 0, 255, NORM_MINMAX);
	cvtColor(srcImage2, grayMat2, CV_BGR2GRAY);
	normalize(grayMat2, grayMat2, 0, 255, NORM_MINMAX);
	//定義SIFT描述子
	SiftFeatureDetector detector;//SIFT 函數實現的特徵檢測子封裝類
	SiftFeatureDetector extractor;//SIFT 來封裝的用於計算特徵描述子的類
	//特徵點檢測
	vector<KeyPoint> keypoints1;
	detector.detect(grayMat1, keypoints1);
	vector<KeyPoint> keypoints2;
	detector.detect(grayMat2, keypoints2);
	//計算特徵點的描述子
	Mat descriptors1;
	extractor.compute(grayMat1, keypoints1, descriptors1);
	Mat descriptors2;
	extractor.compute(grayMat2, keypoints2, descriptors2);
	//特徵點匹配
	vector<DMatch> matches;
	BruteForceMatcher<L2<float> > matcher;
	//bruteForce匹配
	matcher.match(descriptors1, descriptors2, matches);
	//二分排序
	int N = 80;
	nth_element(matches.begin(), matches.begin() + N - 1, matches.end());
	//去除特徵點不匹配情況
	matches.erase(matches.begin() + N, matches.end());
	//繪製檢測結果
	Mat matchMat;
	drawMatches(srcImage1, keypoints1, srcImage2, keypoints2, matches, matchMat);
	imshow("matchMat", matchMat);
	return matchMat;
}
int main()
{
	Mat srcImage1 = imread("D:\\Projects\\1.jpg");
	if (!srcImage1.data)
		return -1;
	Mat srcImage2 = imread("D:\\Projects\\11.jpg");
	if (!srcImage2.data)
		return -1;
	//SIFT特徵描述
	Mat resSiftMatchMat = cacSIFTFeatureAndCompare(srcImage1, srcImage2);
	imshow("resSiftMatchMat", resSiftMatchMat);
	waitKey(0);
	return 0;
}

實現:



發佈了56 篇原創文章 · 獲贊 72 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章