讲述在10月到12月所做的所有工作
对于一个无人机自主避障来说,存在着以下流程:
感知:障碍物检测、行人检测、目标检测
SLAM:为无人机提供位置估计,构建稀疏环境地图
路径规划:规划一条从当前位置到目标位置的移动轨迹
控制:控制无人机速度,加速度,追随规划出来的轨迹
我先做出了障碍物检测部分:
Opencv/MATLAB做双目测距(相机标定+立体匹配+测距)
双目测距实际操作分4个步骤:相机标定——双目校正——双目匹配——计算深度信息。
01
—
相机标定+双目校正
首先是对摄像头做标定
Q1:为什么要做相机标定?
标定的目的是为了消除畸变以及得到内外参数矩阵,内参数矩阵可以理解为焦距相关,它是一个从平面到像素的转换,焦距不变它就不变,所以确定以后就可以重复使用,而外参数矩阵反映的是摄像机坐标系与世界坐标系的转换,至于畸变参数,一般也包含在内参数矩阵中。从作用上来看,内参数矩阵是为了得到镜头的信息,并消除畸变,使得到的图像更为准确,外参数矩阵是为了得到相机相对于世界坐标的联系,是为了最终的测距。
无论是在图像测量或者机器视觉应用中,相机参数的标定都是非常关键的环节,其标定结果的精度及算法的稳定性直接影响相机工作产生结果的准确性。因此,做好相机标定是做好后续工作的前提,提高标定精度是科研工作的重点所在。
https://blog.csdn.net/baidu_38172402/article/details/81949447
CSDN
https://www.zhihu.com/question/29448299/answer/102658379
知乎 陈明猷
先完成单目标定,再完成双目标定。选择标定方法的时候,选用张正友标定法,因为MATLAB用的也是张正友标定法做的,误差最小。
双目标定,必须是拿自己打印的棋盘格摆拍的,且记下棋盘距离自己的距离,以衡量你标定和匹配的误差是否在合适的范围之内。
先固定好左右相机,拿棋盘标定图摆拍并保存,左右相机各15张(我做的时候在30张图中选用15张图进行opencv标定的时候误差最小,但是在MATLAB中就不用考虑这个问题)
------相机标定的代码网上很多,一步一步来即可---------
简单来说就是:OpenCV使用黑白棋盘格来标定摄像机,调用findChessboardCorners()获得棋盘格角点的像素坐标,再调用cornerSubpix获得棋盘格角点的亚像素坐标。调用drawChessboardCorners()函数绘制出检测到的棋盘角点,然后使用stereoCalibrate()函数完成双目标定。
标定之后进行校正:在OpenCV中可通过stereoRectify()函数完成校正功能,摄像机矩阵,畸变向量,左右旋转矩阵R和平移向量T。输出参数为左右投影矩阵P,以及重投影矩阵Q。可调用函数InitUndistortRectifyMap()生成图像校正所需的映射矩阵。
标定结束后最终得到的yml文件,就是双目标定的参数矩阵,之后使用它就可以得到校正后的图像啦。MATLAB里面有双目标定工具箱很方便,且误差很小。
Q2:你得到的参数和误差有什么合格判据吗?误差在哪个区间内能用?你怎么确定你得到的参数能用?你有跟别人做的对比过吗?
单目标定的误差 看平均重投影误差,越小越好。
双目标定看对极线误差,越小越好,这个关系着后面立体匹配的效果。
在工业生产中,对于双目相机标定, 需要一个稳定可靠的方法确定标定的质量,以帮助判断标定结果,确定是否需要重新标定。现有双目标定的精确度评价研究较少,而且具有明显的局限性,无法应用于工业环境。现有一种方法可以确定标定质量的方法,可在最新资源中查看。
02
—
双目匹配
原理:
通过对两幅图像视差的计算,直接对前方景物(图像所拍摄到的范围)进行距离测量,而无需判断前方出现的是什么类型的障碍物。所以对于任何类型的障碍物,都能根据距离信息的变化,进行必要的预警或制动。双目摄像头的原理与人眼相似。人眼能够感知物体的远近,是由于两只眼睛对同一个物体呈现的图像存在差异,也称“视差”。物体距离越远,视差越小;反之,视差越大。视差的大小对应着物体与眼睛之间距离的远近,这也是3D电影能够使人有立体层次感知的原因。
双目匹配被普遍认为是立体视觉中最困难也是最关键的问题。得到视差数据,通过上述原理中的公式就可以很容易的计算出深度信息
OpenCV中提供了两种立体匹配算法SGBM算法和BM快匹配算法,其中SGBM算法准确性较高,但是运算速度慢。BM算法准确性稍差但运算速度快,可满足实时应用需求。BM算法在OpenCV中通过函数StereoBM()实现。
接下来就是用基于深度学习的立体匹配算法,让精度更高,潜力更高的GA-Net