博客
关于我
opencv3/C++ 描述符匹配
阅读量:141 次
发布时间:2019-02-27

本文共 2704 字,大约阅读时间需要 9 分钟。

BFMatcher类

暴力匹配BFMatcher类:

对于第一个集合中的每个描述符,这个匹配器通过尝试每个描述符找到第二个集合中最接近的描述符。

class CV_EXPORTS_W BFMatcher : public DescriptorMatcher{public://暴力匹配器构造函数    CV_WRAP BFMatcher(      int normType=NORM_L2, //NORM_L1,NORM_L2,NORM_HAMMING,NORM_HAMMING2之一    bool crossCheck=false );//为每个描述符找到k个最近的邻居,true时只返回一致的对    virtual ~BFMatcher() {}    virtual bool isMaskSupported() const { return true; }    virtual Ptr
clone( bool emptyTrainData=false ) const;protected: virtual void knnMatchImpl( InputArray queryDescriptors, std::vector
>& matches, int k, InputArrayOfArrays masks=noArray(), bool compactResult=false ); virtual void radiusMatchImpl( InputArray queryDescriptors, std::vector
>& matches, float maxDistance, InputArrayOfArrays masks=noArray(), bool compactResult=false ); int normType; bool crossCheck;};

关于normType:

对于SIFT和SURF描述符,选择L1和L2较好;
ORB、BRISK、BRIEF,选择NORM_HAMMING;
对于ORB,当WTA_K == 3或4时,使用NORM_HAMMING2。

函数drawMatches():

从两个图像中用一条线连接两个关键点(圈)绘制找到的关键点匹配。

函数drawMatches()参数说明:

void drawMatches( InputArray img1, //第一个源图像const std::vector
& keypoints1, //第一个源图像的关键点InputArray img2, //第二个源图像const std::vector
& keypoints2, //第二个源图像的关键点const std::vector
& matches1to2, //从第一个图像到第二个图像匹配InputOutputArray outImg, //输出图像const Scalar& matchColor=Scalar::all(-1), //匹配到的关键点的颜色(线条和连接的关键点)const Scalar& singlePointColor=Scalar::all(-1), //未匹配到的关键点的颜色(圆圈)const std::vector
& matchesMask=std::vector
(), //确定绘制哪些匹配的掩模。如果掩模为空,则绘制所有匹配int flags=DrawMatchesFlags::DEFAULT ); //设置绘图功能的标志

BFMatcher示例:

#include
#include
using namespace cv;using namespace cv::xfeatures2d;int main(){ Mat src1, src2, dst; src1 = imread("E:/image/image/card2.jpg"); src2 = imread("E:/image/image/cards.jpg"); if (src1.empty()||src2.empty()) { printf("could not load image \n"); return -1; } namedWindow("input", CV_WINDOW_AUTOSIZE); imshow("input", src1); Ptr
dector = SURF::create(700); std::vector
keypoints1,keypoints2; Mat descriptor1, descriptor2; dector->detectAndCompute(src1, Mat(), keypoints1, descriptor1); dector->detectAndCompute(src2, Mat(), keypoints2, descriptor2); //指定L1或L2距离 BFMatcher matcher(NORM_L2); std::vector
matchers; matcher.match(descriptor1, descriptor2, matchers); Mat result; //从两个图像中绘制找到的关键点匹配 drawMatches(src1, keypoints1, src2, keypoints2, matchers, result, Scalar::all(-1), Scalar(0,255,0)); namedWindow("output", CV_WINDOW_AUTOSIZE); imshow("output", result); waitKey(0); return 0;}

这里写图片描述

这里写图片描述

你可能感兴趣的文章
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 添加列,修改列,删除列
查看>>
mysql 添加索引
查看>>
MySQL 添加索引,删除索引及其用法
查看>>
mysql 状态检查,备份,修复
查看>>
MySQL 用 limit 为什么会影响性能?
查看>>
MySQL 用 limit 为什么会影响性能?有什么优化方案?
查看>>
MySQL 用户权限管理:授权、撤销、密码更新和用户删除(图文解析)
查看>>
mysql 用户管理和权限设置
查看>>
MySQL 的 varchar 水真的太深了!
查看>>
mysql 的GROUP_CONCAT函数的使用(group_by 如何显示分组之前的数据)
查看>>
MySQL 的instr函数
查看>>
MySQL 的mysql_secure_installation安全脚本执行过程介绍
查看>>
MySQL 的Rename Table语句
查看>>
MySQL 的全局锁、表锁和行锁
查看>>
mysql 的存储引擎介绍
查看>>
MySQL 的存储引擎有哪些?为什么常用InnoDB?
查看>>
Mysql 知识回顾总结-索引
查看>>
Mysql 笔记
查看>>
MySQL 精选 60 道面试题(含答案)
查看>>