博客
关于我
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工作笔记002
查看>>
Mysql中获取所有表名以及表名带时间字符串使用BetweenAnd筛选区间范围
查看>>
Mysql中视图的使用以及常见运算符的使用示例和优先级
查看>>
Mysql中触发器的使用示例
查看>>
Mysql中设置只允许指定ip能连接访问(可视化工具的方式)
查看>>
mysql中还有窗口函数?这是什么东西?
查看>>
mysql中间件
查看>>
MYSQL中频繁的乱码问题终极解决
查看>>
MySQL为Null会导致5个问题,个个致命!
查看>>
MySQL为什么不建议使用delete删除数据?
查看>>
MySQL主从、环境搭建、主从配制
查看>>
Mysql主从不同步
查看>>
mysql主从同步及清除信息
查看>>
MySQL主从同步相关-主从多久的延迟?
查看>>
mysql主从同步配置方法和原理
查看>>
mysql主从复制 master和slave配置的参数大全
查看>>
MySQL主从复制几个重要的启动选项
查看>>
MySQL主从复制及排错
查看>>
mysql主从复制及故障修复
查看>>