单目视觉

单目视觉系统一般由一个相机或者一个相机与一个陀螺仪组成。

相机 完成图像识别任务 完成定位任务(一般基于PNP) 将目标定位在相机坐标系内 陀螺仪 将相机坐标系内的坐标转换到世界坐标系

深度信息

装甲板深度信息是指装甲板相对于机器人摄像头的距离信息,通常以深度图像或点云的形式表示。

OpenCV中的仿射变换和透视变换

Mat cv::getAffineTransform(InputArray src, InputArray dst) 计算仿射变换矩阵 输入一组原始点(src)和一组对应后的变换点(dst) 需要注意输入为三对点 Mat cv::getPerspectiveTransform(InputArray src, InputArray dst, int solveMethod = DECOMP_LU) 计算透视变换矩阵 输入一组原始点和一组对应后的变换点 需要注意输入的为四对点 void cv::warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags = INTER_LINEAR, int borderMode = BORDER_CONSTANT, const Scalar & borderValue = Scalar()) 对一张图像进行仿射变换 src为输入的图像 dst为变换后的输出图像 M为仿射变换矩阵 dsize为输出图像的大小 void cv::warpPerspective(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags = INTER_LINEAR, int borderMode = BORDER_CONSTANT, const Scalar & borderValue = Scalar() ) 对一张图片进行透视变换 具体参数与仿射变换中描述的相同

PNP测距

在计算机视觉中,我们经常需要测量自己与目标之间的距离,对于单目视觉体系,最常用的方法就是PNP算法。 PNP算法是用来解决PNP问题的。简单来说,PNP问题就是在已知 n 个三维空间点坐标(相对于某个指定的坐标系A)及其二维投影位置的情况下,如何估计相机的位姿(即相机在坐标系A下的姿态)。 P3P算法 PNP算法 PNP算法通过至少四个点的约束,求出世界坐标系到相机坐标系的旋转矩阵和平移向量。 其声明如下: 其中objectPoints为视觉坐标系中的点 imagePoints为像素坐标系中的点 cameraMatrix为相机内参 disCoeffs为相机畸变矩阵 rvec为求出来的旋转向量 tvec为求出来的平移向

通过图像坐标系中的N个点与世界坐标系中的N的点的对应关系求解相机的世界坐标 世界坐标系的N个对应点需要在同一平面内 这种方法有较好的测距精度,但对于测量角度容易受误差影响

旋转矩阵与旋转向量

三维空间中的旋转矩阵有 9 个量,而三维空间中的旋转只有 3 个自由度,因此我们很自然的想到,是否可以用更少的量描述一个三维运动。 事实上,对于坐标系的旋转,任意旋转都可以用一个旋转轴和一个旋转角来刻画。于是,我们可以使用一个方向与旋转轴一直,长度等于旋转角的向量描述旋转运动,这个向量成为旋转向量。 通过这样的方式,我们就可以只通过一个三维的旋转向量和一个三维的平移向量描述三维空间中刚体的运动。 旋转矩阵和旋转向量是可以互相转化的,有旋转向量推导旋转矩阵的公式也被成为罗德里格斯公式: (R = cos \theta I + (1 - cos \theta ) n n^T + sin \theta n^{\wedge}) 而旋转角$ \theta $也可以有公式 (\theta = arccos(\frac{tr(R) - 1}{2})) 计算得到。