孟维康 2016-02-19 05:26 采纳率: 66.7%
浏览 3865
已采纳

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条回答

  • shiter 人工智能领域优质创作者 2016-02-24 13:03
    关注

    OpenCV特征点检测增加包围盒

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 用三极管设计一个单管共射放大电路
  • ¥20 fluent无法启动
  • ¥15 孟德尔随机化r语言运行问题
  • ¥15 pyinstaller编译的时候出现No module named 'imp'
  • ¥15 nirs_kit中打码怎么看(打码文件是csv格式)
  • ¥15 怎么把多于硬盘空间放到根目录下
  • ¥15 Matlab问题解答有两个问题
  • ¥15 LCD12864中文显示
  • ¥15 在使用CH341SER.EXE时不小心把所有驱动文件删除了怎么解决
  • ¥15 gsoap生成onvif框架