“未声明的标识符***** ” 问题
今天用opencv249的SIFT时碰到一点问题:“未声明的标识符***** ”,涉及到头文件包含问题,经查询整理如下:
- 2.4.X版本的特征提取 SurfFeatureDetector(或者SiftFeatureDetector)包含在opencv2/nonfree/features2d.hpp中,应该include这个头文件,并且在附加依赖项中加入:opencv_nonfree249d.lib(具体编号以自己的opencv版本一致);
- 特征匹配使用的 BruteForceMatcher则应该include头文件:opencv2/legacy/legacy.hpp,并在附加依赖项中加入:opencv_legacy249d.lib
- 特征匹配使用的 FlannBasedMatcher则应该include头文件:opencv2/features2d/features2d.hpp,并在附加依赖项中加入:opencv_features2d249d.lib
匹配常用函数
- 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);
- BruteForceMatcher类中的函数match来匹配两幅图像的特征向量
BruteForceMatcher<L2<float> > matcher;
std::vector<DMatch > matches;
//匹配两幅图中的描述子(descriptors)
matcher.match(descriptors1, descriptors2, matches );
- FlannBasedMatcher算法更快但是找到的是最近邻近似匹配,所以当我们需要找到一个相对好的匹配但是不需要最佳匹配的时候往往使用FlannBasedMatcher。当然也可以通过调整FlannBasedMatcher的参数来提高匹配的精度或者提高算法速度,但是相应地算法速度或者算法精度会受到影响
FlannBasedMatcher matcher;
std::vector< DMatch > matches; //定义了一个DMatch类向量matches,用来存放descriptors_1, descriptors_2中匹配的关键点
matcher.match( descriptors_1, descriptors_2, matches );
- 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),颜色随机生成;
参考: