前言:小白创建了一个微信公众号,主要面向学习视觉的小伙伴,分享一些学习过程中的感受和一些技术文章。公众号里文章也会更新在优快云中,不过由于工作量较大,会出现一段时间的延时,感兴趣的小伙伴可以关注公众号第一时间接受消息。
作者:小白
公众号:小白学视觉
作为一个视觉SLAM的入门学徒,高翔的书我看了一遍,视频也跟了一遍,代码在自己的电脑上也跑过,但总觉得跟啥都没学没有太大区别。
于是乎决定开始看代码。由于不是计算机专业的本科,看代码比较生疏所以一直以来都是在逃避在敷衍,现在一看确实不落实到代码层面是干脆不行的。高翔的slambook前几讲都是相对比较基础的内容,直到第七讲视觉里程计才有相对切实的应用,那么我准备从第七讲的代码开始下手。
第七讲共五个程序:特征点提取、三种位姿估计方式:2d-2d、3d-2d、3d-3d,和三角化测量。
其中特征点提取是剩余所有程序的一个基础,也作为一个封装好的函数进行调用,那么不妨先从特征点提取这个基础程序开始看。
由于我代码基础较为薄弱,自学能力也较弱,所以本篇内容写得相对基础与啰嗦。对特征点提取这里稔熟于心的同学可以取干别的了,不必在这里浪费时间~
首先,明确一下特征点提取的目的与步骤:
-
目的:在每张图像中找到“区分度较高”的像素点,这里“区分度较高”具体为FAST角点。
-
步骤:高翔的代码注释写的也很全面,步骤基本上可以分为
-
读取图像
-
初始化存储特征点数据的变量
-
提取每张图像的FAST角点
-
计算每张图像每个FAST角点的BRIEF描述子
-
根据刚刚计算好的BRIEF描述子,对两张图的角点进行匹配
-
筛去匹配度较差的角点配对
-
绘制匹配结果
好了,在把高翔的注释抄了一遍之后,咱们来开始看代码。
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
int main ( int argc, char** argv )
{
if ( argc != 3 )
{
cout<<"usage: feature_extraction img1 img2"<<endl;
return 1;
}
//-- 读取图像
Mat img_1 = imread ( argv[1], CV_LOAD_IMAGE_COLOR );
Mat img_2 = imread ( argv[2], CV_LOAD_IMAGE_COLOR );
//-- 初始化
vector<KeyPoint> keypoints_1, keypoints_2;