2 qq 22703009 qq_22703009 于 2016.02.19 13:26 提问

sift特征点匹配筛选问题

筛选出了一部分匹配结果,怎么用这些线段把用到的特征点提出来,我想做一个包围盒,谢谢谢谢

图片说明
int main(int argc,char* argv[])
{
Mat img_1=imread("cap.jpg",CV_LOAD_IMAGE_GRAYSCALE);//宏定义时CV_LOAD_IMAGE_GRAYSCALE=0,也就是读取灰度图像
Mat img_2=imread("capman.jpg",CV_LOAD_IMAGE_GRAYSCALE);//一定要记得这里路径的斜线方向,这与Matlab里面是相反的

if(!img_1.data || !img_2.data)//如果数据为空
{
    cout<<"opencv error"<<endl;
    return -1;
}
cout<<"open right"<<endl;

// 第一步,用SIFT算子检测关键点

SiftFeatureDetector detector;//构造函数采用内部默认的
std::vector<KeyPoint> keypoints_1,keypoints_2;//构造2个专门由点组成的点向量用来存储特征点
detector.detect(img_1,keypoints_1);//将img_1图像中检测到的特征点存储起来放在keypoints_1中
detector.detect(img_2,keypoints_2);//同理

//在图像中画出特征点
Mat img_keypoints_1,img_keypoints_2;

drawKeypoints(img_1,keypoints_1,img_keypoints_1,Scalar::all(-1),DrawMatchesFlags::DEFAULT);//在内存中画出特征点
drawKeypoints(img_2,keypoints_2,img_keypoints_2,Scalar::all(-1),DrawMatchesFlags::DEFAULT);

imshow("sift_keypoints_1",img_keypoints_1);//显示特征点
imshow("sift_keypoints_2",img_keypoints_2);

//计算特征向量
SiftDescriptorExtractor extractor;//定义描述子对象

Mat descriptors_1,descriptors_2;//存放特征向量的矩阵

extractor.compute(img_1,keypoints_1,descriptors_1);//计算特征向量
extractor.compute(img_2,keypoints_2,descriptors_2);

//用burte force进行匹配特征向量
BruteForceMatcher<L2<float>>matcher;//定义一个burte force matcher对象
vector<DMatch>matches;
matcher.match(descriptors_1,descriptors_2,matches);


//提取出前15个最佳匹配结果  
std::nth_element(matches.begin(),     //匹配器算子的初始位置  
    matches.begin()+14,     // 排序的数量  
    matches.end());       // 结束位置  
//剔除掉其余的匹配结果  
matches.erase(matches.begin()+15, matches.end());  

//绘制匹配线段
Mat img_matches;
drawMatches(img_1,keypoints_1,img_2,keypoints_2,matches,img_matches);//将匹配出来的结果放入内存img_matches中


//显示匹配线段
imshow("sift_Matches",img_matches);//显示的标题为Matches
//保存
IplImage imgTmp = img_matches;
IplImage *input = cvCloneImage(&imgTmp);
 cvSaveImage("E:\\123.jpg",input  );

waitKey(0);
return 0;
}

2个回答

wangyaninglm
wangyaninglm   Ds   Rxr 2016.02.24 21:03
已采纳

OpenCV特征点检测增加包围盒

上一个答案怎么好像插入到代码里面去了。重新编辑一下

wangyaninglm
wangyaninglm   Ds   Rxr 2016.02.24 21:02
基本原理是利用函数:findHomography,该 函数是求两幅图像的单应性矩阵或者叫(单映射矩阵),在对待匹配图像做一个透视变化算一下位置就行了:

    [OpenCV特征点检测增加包围盒](http://blog.csdn.net/wangyaninglm/article/details/50732434 "")
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!