一个简单的视觉里程计实现(1)
2016-11-15 09:34
267 查看
转载地址:冯兵一个简单的视觉里程计实现(1)
前一篇博文中已经简单介绍了视觉里程计,这一篇中对上述过程进行进一步的阐述。
PS:图中的彩色字体均带有相应的链接
from accelerated segment test)特征提取算法。
FAST算法简单过程,假设有一个点pp是我们要检测的点,如下图所示:
fast特征检测
具体就是查看点pp周围的16个点的像素值与该候选点灰度的差别是否够大(灰度值大于某个阈值),如果个数足够大(16个点中差值大于某个阈值的个数大于某个阈值,通常认为阈值为周长的四分之三),则认为该候选点位一个特征点。
为了获得更快的结果,作者通过对候选点周围中上下左右四点(即上图中1,5,9,13)先进行检查,这4个点中至少有3个点与候选点灰度值足够大,否则不用计算其它点,直接认为该候选点不是特征点,更详细的过程可以参考上述论文。
在OpenCV中可以进行简单实现,这边参考一起做RGB-D SLAM(1),将项目源码整理成如下:
在CMakeLists.txt添加内容如下:
在src文件夹中添加源文件fast_example.cpp以及文件夹内的CMakeLists.txt
CMakeLists.txt中添加如下:
fast_example.cpp中添加
具体效果如图
:
对于前面这几块是计算机视觉的基础部分,在图像拼接,图像识别,三维重建中都是基础,后期会对该部分进行进一步的扩充及完善。
本文主要参考http://avisingh599.github.io/vision/monocular-vo/
前一篇博文中已经简单介绍了视觉里程计,这一篇中对上述过程进行进一步的阐述。
PS:图中的彩色字体均带有相应的链接
图像获取
目前主要采用KITTI的数据集,采用公共数据集可以对自己的算法效率和精度进行评估。具体的获取基于OpenCV进行实现。图像畸变处理
图像在成像过程中由于镜头等相关因素会形成畸变,对于普通图像需进行畸变矫正,这个可以在对镜头进行标定的时候进行解决,具体标定可以参考matlab或者opencv,这边采用的KITTI数据集已经对图像进行了畸变处理,如何根据上述标定的结果对图像进行补偿失真,具体可以参考OpenCV中的介绍使用。特征提取
特征提取是一个视觉问题的基础部分,虽然深度学习在特征提取问题中已经取得了不错的成果,但是在实用的角度(比如考虑效率)人工特征提取还很有必要,计算机视觉中常用的图像特征包括:点,边缘,直线,曲线等。在我们基础部分,我们主要考虑点特征,点特征也分为角点和斑点特征,对于经典的斑点特征提取SIFT,SURF等算法在执行效率上较为欠缺,目前我们主要使用FAST(featuresfrom 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) |
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} ) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1617 | #include <vector> #include <opencv2/core/core.hpp> #include <opencv2/features2d/features2d.hpp> #include <opencv2/highgui/highgui.hpp> using namespace cv; int main(int argc,char *argv[]) { Mat image; image = imread("1.jpg"); // 存储为关键点 std::vector<KeyPoint> 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/
相关文章推荐
- 一个简单的视觉里程计实现(2)
- Unity3D学习(五):实现一个简单的视觉感知
- 一个简单T9输入法的实现(有代码)
- 一个简单的Thread缓冲池的实现
- 利用xmlHttp实现一个简单的Ajax无刷新
- 分形介绍 && 一个简单的Kotch curve实现代码
- 实现一个简单的图形菜单
- 一个简单的学生成绩管理程序(二叉树实现)
- 一个购物车的简单实现(多层开发)
- 一个简单留言本的实现
- 一个简单的自定义ClassLoader的实现
- 又一个简单实现AJAX的好东西!!
- 一个简单的oracle分页存储过程的实现和调用
- 一个简单聊天室的两种实现 (fcntl 和 select)
- J2ME应用实例——一个简单的计算器实现(附源代码)
- 一个简单的Thread缓冲池的实现
- 一个在程序中实现plugin机制的简单例子
- 一个简单的32位多任务操作系统的实现
- 用javascript实现的一个简单抽奖小程序
- 如何实现一个简单的remoteing实例