python opencv 前视图转化为鸟瞰图

想要把前视图转化为鸟瞰图,有两种做法

1.在没有标定的情况下,只能选取四个点对了

  1. 在有标定的情况下,可以直接使用标定的参数

这里主要介绍1
1.没有标定的情况下,主要用到了两个函数

 M = cv2.getPerspectiveTransform(src, dst)
 warped = cv2.warpPerspective(img, M, (img.shape[1], img.shape[0] + 1080))

 cv2.getPerspectiveTransform 从四个点对中计算透视变换,返回值为3*3的透视变换矩阵
cv2.warpPerspective 计算透视变换后的图像

这里自己遇到的坑是,在计算透视变换矩阵的时候,怎么获取那四个点对,翻了很多blog,都没搞清,最后认认真真的找了一个认认真真的阅读之后,总算摸到门道了,有了一种融会贯通的感觉。

现在的目标是将图像由前视图转化为鸟瞰图,根据先验知识,在鸟瞰图下,长方形物体显示出来肯定是长方形,因此,我们只要在前视图中找到一个正方形的物体,并指定他在俯视图中的坐标就可以了,这里有个但是,由于先验信息里面只有矩形这个信息,具体的长宽比什么的,以及实际的大小未知,所以转化到鸟瞰图下并不能反应物体的真实长度。

这里怎么定义转化后的坐标要自己把握

原图

比如说转化到黄色的坐标(内接矩形),这时候就会内缩,图像出现黑边


转化到黄色坐标

如果转化到蓝色的,那么能看到的方位就很小了,只有当前车道了(外接矩形)


转化到蓝色坐标

dst的坐标也可以自己写,想要转成多大的图像也可以自己填

比如说根据车道的宽度和虚线的长度,可以大概估算出实际长宽比,一个车道宽度为3.75米 这种城市道路一般虚线是两米,间隔4米(高速一般是69,也就是15米)大概估计一下,高度是12米,也就是说长宽比为12:7,想要显示出4个车道,图像的宽度为1920,折算了一下,目标图像的坐标大概是(这里要注意,图像的坐标是从左上角开始算的)


自定义

坐标定义代码:


src = np.float32([(1242,1949),(1961,1949), (2695, 2542), (133, 2542)])

#内接矩形

dst = np.float32([(1242, 1949), (1961, 1949), (1961, 2542), (1242, 2542)])

#外接矩形

dst = np.float32([(132, 1949), (2695, 1949), (2695, 2542), (133, 2542)])

#自定义

dst = np.float32([(480,1560-1080), (1440,1560-1080), (1440,3096-1080), (480,3096-1080)])

2.使用标定参数来转化

这个转化就是真实的了,因为知道相机的内参,还有相机的pitch角以及相机距离地面的高度

matlab里面转的,要标定的参数

https://ww2.mathworks.cn/help/driving/ref/birdseyeview.transformimage.html

可以参考的透视变换

https://github.com/ckirksey3/lane-detection-with-opencv

你可能感兴趣的:(python opencv 前视图转化为鸟瞰图)