一个简单的视觉里程计实现(1)

转载地址:冯兵一个简单的视觉里程计实现(1)

前一篇博文中已经简单介绍了视觉里程计,这一篇中对上述过程进行进一步的阐述。

PS:图中的彩色字体均带有相应的链接

图像获取

目前主要采用KITTI的数据集,采用公共数据集可以对自己的算法效率和精度进行评估。具体的获取基于OpenCV进行实现。

图像畸变处理

图像在成像过程中由于镜头等相关因素会形成畸变,对于普通图像需进行畸变矫正,这个可以在对镜头进行标定的时候进行解决,具体标定可以参考matlab或者opencv,这边采用的KITTI数据集已经对图像进行了畸变处理,如何根据上述标定的结果对图像进行补偿失真,具体可以参考OpenCV中的介绍使用。

特征提取

特征提取是一个视觉问题的基础部分,虽然深度学习在特征提取问题中已经取得了不错的成果,但是在实用的角度(比如考虑效率)人工特征提取还很有必要,计算机视觉中常用的图像特征包括:点,边缘,直线,曲线等。在我们基础部分,我们主要考虑点特征,点特征也分为角点和斑点特征,对于经典的斑点特征提取SIFT,SURF等算法在执行效率上较为欠缺,目前我们主要使用FAST(features from accelerated segment test)特征提取算法。
FAST算法简单过程,假设有一个点pp是我们要检测的点,如下图所示:
fast特征检测
具体就是查看点pp周围的16个点的像素值与该候选点灰度的差别是否够大(灰度值大于某个阈值),如果个数足够大(16个点中差值大于某个阈值的个数大于某个阈值,通常认为阈值为周长的四分之三),则认为该候选点位一个特征点。
为了获得更快的结果,作者通过对候选点周围中上下左右四点(即上图中1,5,9,13)先进行检查,这4个点中至少有3个点与候选点灰度值足够大,否则不用计算其它点,直接认为该候选点不是特征点,更详细的过程可以参考上述论文。
在OpenCV中可以进行简单实现,这边参考一起做RGB-D SLAM(1),将项目源码整理成如下:
在CMakeLists.txt添加内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CMAKE_MINIMUM_REQUIRED( VERSION 2.8 ) #设定最小版本号
PROJECT( mvo ) #设定工程名

#设定可执行二进制文件的目录
SET( EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
#设定存放编译出来的库文件的目录
SET( LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

#并且把该目录设为连接目录
LINK_DIRECTORIES( ${PROJECT_SOURCE_DIR}/lib)

#设定头文件目录
INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}/include)

#增加子文件夹,进行后续构建
ADD_SUBDIRECTORY( ${PROJECT_SOURCE_DIR}/src)

在src文件夹中添加源文件fast_example.cpp以及文件夹内的CMakeLists.txt
CMakeLists.txt中添加如下:

1
2
3
4
5
6
7
8
# 增加opencv的依赖
FIND_PACKAGE( OpenCV REQUIRED )

# 添加头文件
INCLUDE_DIRECTORIES( ${OpenCV_INCLUDE_DIRS} )

ADD_EXECUTABLE( vo fast_example.cpp )
TARGET_LINK_LIBRARIES( vo ${OpenCV_LIBS} )

fast_example.cpp中添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include 

#include
#include
#include

using namespace cv;

int main(int argc,char *argv[])
{

Mat image;
image = imread("1.jpg");
// 存储为关键点
std::vector keyPoints;
// 定义特征检测
FastFeatureDetector fast(40); // 检测的阈值为40
// 特征点检测
fast.detect(image,keyPoints);
drawKeypoints(image, keyPoints, image, Scalar::all(255), DrawMatchesFlags::DRAW_OVER_OUTIMG);
imshow("FAST feature", image);
waitKey(0);

return 0;
}

具体效果如图:

对于前面这几块是计算机视觉的基础部分,在图像拼接,图像识别,三维重建中都是基础,后期会对该部分进行进一步的扩充及完善。

本文主要参考http://avisingh599.github.io/vision/monocular-vo/

你可能感兴趣的:(VO)