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

这里写图片描述

这里写图片描述

你可能感兴趣的文章
webpack loader配置全流程详解
查看>>
mysql主从复制,读写分离,半同步复制实现
查看>>
MySQL主从失败 错误Got fatal error 1236解决方法
查看>>
MySQL主从架构与读写分离实战
查看>>
MySQL主从篇:死磕主从复制中数据同步原理与优化
查看>>
mysql主从配置
查看>>
MySQL之2003-Can‘t connect to MySQL server on ‘localhost‘(10038)的解决办法
查看>>
MySQL之CRUD
查看>>
MySQL之DML
查看>>
Mysql之IN 和 Exists 用法
查看>>
MYSQL之REPLACE INTO和INSERT … ON DUPLICATE KEY UPDATE用法
查看>>
MySQL之SQL语句优化步骤
查看>>
MYSQL之union和order by分析([Err] 1221 - Incorrect usage of UNION and ORDER BY)
查看>>
Mysql之主从复制
查看>>