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;
}
實現: