孟维康 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 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记