sift特征检测
Mat tReverseImg1 =imread("F:\\card\\68\\model1.jpg",-1);
Mat tReverseImg0=imread("F:\\card\\68\\model2.jpg",-1);
//sift特征检测
SiftFeatureDetector siftdtc;
vector<KeyPoint>kp1,kp2;
siftdtc.detect(tReverseImg1,kp1);
Mat outimg1;
drawKeypoints(tReverseImg1,kp1,outimg1);
imshow("image1 keypoints",outimg1);
KeyPoint kp;
vector<KeyPoint>::iterator itvc;
for(itvc=kp1.begin();itvc!=kp1.end();itvc++)
{
cout<<"angle:"<<itvc->angle<<"\t"<<itvc->class_id<<"\t"<<itvc->octave<<"\t"<<itvc->pt<<"\t"<<itvc->response<<endl;
}
siftdtc.detect(tReverseImg,kp2);
Mat outimg2;
drawKeypoints(tReverseImg,kp2,outimg2);
imshow("image2 keypoints",outimg2);
SiftDescriptorExtractor extractor;
Mat descriptor1,descriptor2;
BruteForceMatcher<L2<float>> matcher;
vector<DMatch> matches;
Mat img_matches;
extractor.compute(tReverseImg1,kp1,descriptor1);
extractor.compute(tReverseImg,kp2,descriptor2);
//imshow("desc",descriptor1);
//cout<<endl<<descriptor1<<endl;
matcher.match(descriptor1,descriptor2,matches);
//namedWindow("SIFT_matches");
//提取出前30个最佳匹配结果
std::nth_element(matches.begin(), //匹配器算子的初始位置
matches.begin()+30, // 排序的数量
matches.end()); // 结束位置
//剔除掉其余的匹配结果
matches.erase(matches.begin()+30, matches.end());
drawMatches(tReverseImg1,kp1,tReverseImg,kp2,matches,img_matches);
imshow("matches",img_matches);
浙公网安备 33010602011771号