视觉slam十四讲 pdf_视觉slam第七讲学习笔记

这篇博客介绍了视觉SLAM中特征提取与匹配的细节,包括main函数参数、图像读取、特征点绘制函数drawKeypoints的使用。接着深入探讨了对极几何的理论和代码实现,以及3D-2D匹配中的PnP问题,如直接线性变换(DLT)、P3P算法和光束平差法(BA)的应用。博客中还提到了实际代码运行时遇到的问题和解决方法。
摘要由CSDN通过智能技术生成

七八讲是视觉里程计(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),
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值