Loading... ## 基于透视变换的单目摄像头单一平面障碍物深度信息获取算法 ### 简介 透视变换是一种几何变换,用于将图像从一个视角转换到另一个视角。传统竞速组智能车组别经常使用“逆透视”的思路将摄像头的画面重新透视,以得到赛道的俯视视角。受其启发,本文通过透视变换将位于同一水平面上的障碍物投影到俯瞰视角,以得到其位于摄像机所在平面上的深度信息。 ### 数学说明 透视变换通过一个3x3的变换矩阵实现。矩阵将原图像中的齐次坐标转换为目标图像中的齐次坐标。假设我们有一个点的原始坐标 $(x, y)$,在透视变换后的坐标为 $(x', y')$,则它们的关系可以表示为: $$ \begin{bmatrix} x' \\ y' \\ \omega \end{bmatrix} = \begin{bmatrix} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} $$ 其中 $(x′,y′)$的实际坐标可以通过归一化得到:$x'=\frac{x'}{\omega}, y'=\frac{y'}{\omega}$。 可以通过给定的点的对应关系来求解这个3x3的透视变换矩阵(其中$a_{33}$为1)。则需要至少4对点的对应关系才能确定唯一的矩阵。每对点关系提供两个独立的方程,因此4对点会提供8个方程,正好可以求出矩阵中的8个独立参数。 ### 定义源和目标点 定义原始图像和输出图像中的四个角点,包括其在图片中的位置和希望得到鸟瞰图中的点位。这些点将用于计算透视变换矩阵。 ![原始图像的四个角点](https://hibanaw.com/usr/uploads/2024/05/953037875.jpg) ```python mid = 100 # 定义原始图像中四个角的坐标 src_points = np.float32([(247, 306), (568, 305), (291, 258), (435, 257)]) # 定义输出图像中对应的四个角的坐标 dst_points = np.float32([(mid-10, 50), (mid+40, 50), (mid-10, 100), (mid+40, 100)]) ``` `src_points`定义了原始图像中我们感兴趣的四个角点,而`dst_points`定义了在输出俯视图中相应的角点位置。 便于后续计算,这里使用的是摄像头物理空间的以cm为单位的实际距离。 ### 计算透视变换矩阵 使用 OpenCV 的`getPerspectiveTransform`函数计算透视变换矩阵。 ```python matrix = cv2.getPerspectiveTransform(src_points, dst_points) ``` 该矩阵描述了从原图像到俯视图的转换关系。 ### 对图像应用逆透视变换 有了转换矩阵后,我们可以对原图像应用透视变换,将其转换为俯视图。 ```python inversed = cv2.warpPerspective(image, matrix, output_size) ``` `cv2.warpPerspective`函数根据给定的变换矩阵将原图像映射到新的视角。这一步的结果是一个新的图像,展示了原图像在俯视视角下的效果。 ### 点的透视变换 需要将俯视图中具体的某个点转换回原图像中的位置,OpenCV没有给出封装好的算法。根据刚刚的数学原理写出以下算法。 <div class="hideContent">此处内容需要评论回复后方可阅读。</div> 这段代码定义了一个函数`inverse_perspective_point`,它接收变换矩阵和一个点的坐标,返回透视变换后在原图像中的位置。 ![透视变换后在原图像中的位置](https://hibanaw.com/usr/uploads/2024/05/528730914.png) ### 应用示例 在实际应用中,我们可以利用上述技术,将原图中的障碍物位置投影到相对小车的位置上。这将是单目摄像头单一平面特征点视觉SLAM的基础。 © 允许规范转载 赞 6 富婆饿饿饭饭
10 条评论
୧(๑•̀⌄•́๑)૭
牛的牛的
其实之后加入rm的团队发现透视变换的二维图像处理是一个很基本的知识,rm这边姿态解算之类的也在用
厉害
请问输出俯视图的四个初始角点的值该怎么确定,例如您的博文中的dst_points = np.float32([(mid-10, 50), (mid+40, 50), (mid-10, 100), (mid+40, 100)]),谢谢!ヾ(≧∇≦*)ゝ
我们是实际测量的,mid就是车辆当前的位置,mid-10是点在车左侧10cm的意思,以此类推。实际上没有对单位的严格要求,保证四个点构成与真实图像相似的四边形就能完成正确的透视变换。我们这样主要是计算出投影后的相对位置便于后续建图和搜索。
好的,感谢!
mid这里准确来说是mid=0时,mid-10是测量得到的位置,但是为了在图像上显示出来(图像中x>0)所以定义了一个mid偏移量
厉害
一个缺点是,摄像机视角很低的时候,稍微移动摄像机角度就会对真实的透视矩阵产生较大变化,预测结果准确性对摄像机角度十分敏感。