SIFT或SURF做图像匹配过程中出现 “未声明的标识符”问题以及常用匹配函数

“未声明的标识符***** ” 问题

今天用opencv249的SIFT时碰到一点问题:“未声明的标识符***** ”,涉及到头文件包含问题,经查询整理如下:

  1. 2.4.X版本的特征提取 SurfFeatureDetector(或者SiftFeatureDetector)包含在opencv2/nonfree/features2d.hpp中,应该include这个头文件,并且在附加依赖项中加入:opencv_nonfree249d.lib(具体编号以自己的opencv版本一致);
  2. 特征匹配使用的 BruteForceMatcher则应该include头文件:opencv2/legacy/legacy.hpp,并在附加依赖项中加入:opencv_legacy249d.lib
  3. 特征匹配使用的 FlannBasedMatcher则应该include头文件:opencv2/features2d/features2d.hpp,并在附加依赖项中加入:opencv_features2d249d.lib

匹配常用函数

  1. drawKeypoints( ): 绘制关键点
//形式:
void drawKeypoints(const Mat&image, const vector<KeyPoint>& keypoints, Mat& outImage, constScalar& color=Scalar::all(-1), int flags=DrawMatchesFlags::DEFAULT );

参数:
image:const Mat&类型的src,输入图像;
keypoints:const vector&类型的keypoints,根据源图像得到的特征点,它是一个输出参数;
outImage:Mat&类型的outImage,输出图像,其内容取决于第五个参数标识符falgs;
color:const Scalar&类型的color,关键点的颜色,有默认值Scalar::all(-1);

  1. BruteForceMatcher类中的函数match来匹配两幅图像的特征向量
  BruteForceMatcher<L2<float> > matcher;
  std::vector<DMatch > matches;
  //匹配两幅图中的描述子(descriptors)
  matcher.match(descriptors1, descriptors2, matches );
  1. FlannBasedMatcher算法更快但是找到的是最近邻近似匹配,所以当我们需要找到一个相对好的匹配但是不需要最佳匹配的时候往往使用FlannBasedMatcher。当然也可以通过调整FlannBasedMatcher的参数来提高匹配的精度或者提高算法速度,但是相应地算法速度或者算法精度会受到影响
 FlannBasedMatcher matcher;
 std::vector< DMatch > matches;       //定义了一个DMatch类向量matches,用来存放descriptors_1, descriptors_2中匹配的关键点
 matcher.match( descriptors_1, descriptors_2, matches );
  1. drawMatches() 从两幅图片中画出发现的匹配的关键点。
	形式;
	void drawMatches(const Mat& img1, const vector<KeyPoint>& keypoints1, const Mat& img2, const vector<KeyPoint>& keypoints2, const vector<DMatch>& matches1to2, Mat& outImg, const Scalar& matchColor=Scalar::all(-1), const Scalar& singlePointColor=Scalar::all(-1), const vector<char>& matchesMask=vector<char>(), int flags=DrawMatchesFlags::DEFAULT );

参数:
img1、img2:两幅源图像;
keypoints1、keypoints2:两幅源图像中的关键点;
matches1to2:从第一幅图像来匹配第二幅图像,即从keypoints1[i]中寻找与keypoints2[i]的对应点;
outImg:输出图像;它的值取决于flags–在图像中绘制的内容;
matchColor:匹配颜色(线和点的颜色),如果matchColor= =Scalar::all(-1),颜色随机生成 ;
matchesMask:掩码决定画哪个匹配的关键点,如果掩码为空,画出所有的匹配的关键点;
singlePointColor:单个关键点的颜色,即没有关键点与之匹配,如果matchColor= =Scalar::all(-1),颜色随机生成;

参考:

  1. https://blog.csdn.net/holybin/article/details/41144705
  2. https://blog.csdn.net/u014310328/article/details/46463643
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值