博客
关于我
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;}

这里写图片描述

这里写图片描述

你可能感兴趣的文章
MariaDB的简单使用
查看>>
MaterialForm对tab页进行隐藏
查看>>
Member var and Static var.
查看>>
memcached高速缓存学习笔记001---memcached介绍和安装以及基本使用
查看>>
memcached高速缓存学习笔记003---利用JAVA程序操作memcached crud操作
查看>>
Memcached:Node.js 高性能缓存解决方案
查看>>
memcache、redis原理对比
查看>>
memset初始化高维数组为-1/0
查看>>
Metasploit CGI网关接口渗透测试实战
查看>>
Metasploit Web服务器渗透测试实战
查看>>
Moment.js常见用法总结
查看>>
MongoDB出现Error parsing command line: unrecognised option ‘--fork‘ 的解决方法
查看>>
mxGraph改变图形大小重置overlay位置
查看>>
MongoDB学习笔记(8)--索引及优化索引
查看>>
MQTT工作笔记0009---订阅主题和订阅确认
查看>>
ms sql server 2008 sp2更新异常
查看>>
MS UC 2013-0-Prepare Tool
查看>>
msbuild发布web应用程序
查看>>
MSB与LSB
查看>>
MSCRM调用外部JS文件
查看>>