七八讲是视觉里程计(VO),即前端的内容。一开始看感觉挺不习惯,这写的非常不详细,对算法的内容一带而过,基本上只有特性的介绍,如果想要弄清楚原理还得自己去看资料,我现在还没有做这个工作,等看完书再去吧。
代码也是大量的格式化的东西,有些类似于在学神经网络,学习函数的用法,学习这个框架咋写,需要特别说明的东西不多。
1.feature_extraction.cpp中的一些内容
1.1.main函数的参数
从argc里可以判断参数个数,argv里可以找到对应的字符串。
if ( argc != 3 ) // argc=3表示除了程序名外还有2个参数。argv[0][1][2]指向输入的程序路径及名称,参数para_1字符串,参数para_2字符串.
{
// 程序名加两张图像一共三个,argv[1]是"1.png"字符串
cout<<"usage: feature_extraction img1 img2"<<endl;
return 1;
}
1.2.图像读取函数的参数
Mat img_1 = imread ( argv[1], CV_LOAD_IMAGE_COLOR );
第一个argv[1]是图像的名称,因为同目录,所以直接名称就行。
第二个参数是读取的内容,一共有五种:
- CV_LOAD_IMAGE_UNCHANGED – 在每个通道中,每个像素的位深为8 bit,通道数(颜色)保持不变。
- CV_LOAD_IMAGE_GRAYSCALE – 位深=8 bit 通道数=1(颜色变灰)
- CV_LOAD_IMAGE_COLOR -位深空着, 通道数=3
- CV_LOAD_IMAGE_ANYDEPTH – 位深不变 ,通道数空着
- CV_LOAD_IMAGE_ANYCOLOR – 位深空着, 通道数不变
1.3.特征点绘制的函数drawKeypoints
drawKeypoints( img_1, keypoints_1, outimg1, Scalar::all(-1), DrawMatchesFlags::DEFAULT );
这个函数相当好用,我记得原来我都是用js来自己写的一个小接口,前三个参数很明白,第四个是color参数,这里用-1就是默认颜色,第五个flag稍微复杂一些,具体有以下四种选择。,(cv2和cv3含义一样,写法不同)
- cv2.DRAW_MATCHES_FLAGS_DEFAULT:创建输出图像矩阵,使用现存的输出图像绘制匹配对和特征点,对每一个关键点只绘制中间点
- cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG:不创建输出图像矩阵,而是在输出图像上绘制匹配对
- cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS:对每一个特征点绘制带大小和方向的关键点图形
- cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS:单点的特征点不被绘制
1.4.一点小问题
//-- 第三步:对两幅图像中的BRIEF描述子进行匹配,使用 Hamming 距离
vector<DMatch> matches;
//BFMatcher matcher ( NORM_HAMMING );
matcher->match ( descriptors_1, descriptors_2, matches );
matcher->match出现了红色下划线的警告Call to "match" is ambiguous,网上提到是函数重载时与原有的发生了冲突,但是没给出具体的解决办法。运行时似乎没有问题,但是看着总是很难受,留待解决。
1.5.仅供娱乐的写法
// 仅供娱乐的写法
min_dist = min_element( matches.begin(), matches.end(), [](const DMatch& m1, const DMatch& m2) {
return m1.distance<m2.distance;} )->distance;
max_dist = max_element( matches.begin(), matches.end(), [](const DMatch& m1, const DMatch& m2) {
return m1.distanc
确实只是为了娱乐。。。。等效于前面那个遍历写法,那个遍历写的非常明白,不用理解这个。
1.6.drawMatches
代码中用到的drawMatches参数很少,而且含义很明确,其他的都采用了默认,实际上的参数较为繁琐。
// Draws matches of keypints from two images on output image.
void drawMatches( const Mat& img1, const vector<KeyPoint>& keypoints1,
const Mat& img2, const vector<KeyPoint>& keypoints2,
const vector<vector<DMatch> >& matches1to2, Mat& outImg,
const Scalar& matchColor=Scalar::all(-1), const Scalar& singlePointColor=Scalar::all(-1),