欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python逆透视变换试验——利用cv2.getPerspectiveTransform和cv2.warpPerspective函数实现

程序员文章站 2023-12-27 09:29:09
...

试验说明

本试验是想模拟自动驾驶识别车道线拟合函数时,可能会用到的一种图像处理手段,即将相机拍摄到的透视图像转换成为逆透视图像(鸟瞰图),便于对车道线的后续处理,同时对基于单目视觉进行测距也有一定的帮助;
python逆透视变换试验——利用cv2.getPerspectiveTransform和cv2.warpPerspective函数实现

生成透视变换矩阵;进行透视变换

cv2.getPerspectiveTransform(src, dst) → retval

获取逆透视变换矩阵函数各参数含义 ;
src:源图像中待测矩形的四点坐标;
sdt:目标图像中矩形的四点坐标

逆透视变换函数各参数含义

cv2.warpPerspective(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) → dst

src:输入图像;
M:变换矩阵;
dsize:目标图像shape;
flags:插值方式,interpolation方法INTER_LINEAR或INTER_NEAREST;
borderMode:边界补偿方式,BORDER_CONSTANT or BORDER_REPLICATE;
borderValue:边界补偿大小,常值,默认为0

如果只是简单地将图像进行变换可以直接选取原图中呈现透视效果的4个点坐标,然后再按照自己的目的将这4个点构成的梯形转换成矩形形式,不过,这样的操作由于选取点坐标具有随机性,带来的误差较大。
例如,我们直接选取棋盘格的四个角点作为透视效果中的4个点,左上:(414,471),右上:(920,471),右下:(1015,756),左下:(330,756);计算出梯形上下边的像素长度为:506 和 685,高为 285;
因此我们可以设计一个矩形作为逆透视变换后的图像大小尺寸,即 cv2.warpPerspective中的dsize,取685*285,效果如下:
python逆透视变换试验——利用cv2.getPerspectiveTransform和cv2.warpPerspective函数实现
python逆透视变换试验——利用cv2.getPerspectiveTransform和cv2.warpPerspective函数实现

进一步,为了尽可能的包含整个图像,我们可以通过相机标定的方式,提前计算出整个图像四个角点的坐标所对应的实际空间尺寸,即此处图像大小为1261*946,四个角点为[0, 0],[1261, 0], [1261, 946], [0, 946],对应的相对距离尺寸为(下图中右图的图像边长对应的实际距离)上底边为135cm,下底边为38cm,高为112cm,按照这种方式获取到的数据点代入程序中处理后则可以获得整个图片的一个逆透视效果,且对测距表达效果有一个指导作用,更形象。

注意:该图像是放置于地面上的标定板,所以可以通过单目视觉方式测出横纵向距离。

python逆透视变换试验——利用cv2.getPerspectiveTransform和cv2.warpPerspective函数实现

对应的逆透视变换程序如下:

import cv2
import numpy as np
#读入图片
img = cv2.imread('3.png')
H_rows, W_cols= img.shape[:2]
print(H_rows, W_cols)

# 原图中的四个角点pts1(对应好即可,左上、右上、左下、右下),与变换后矩阵位置pts2
pts1 = np.float32([[0, 0],[1261, 0], [1261, 946], [0, 946]])
pts2 = np.float32([[0,0],[135*4, 0],[92*4,112*4],[54*4,112*4]])

# 生成透视变换矩阵;进行透视变换
## 说明获取逆透视变换矩阵函数各参数含义 ;src:源图像中待测矩形的四点坐标;  sdt:目标图像中矩形的四点坐标
# cv2.getPerspectiveTransform(src, dst) → retval

M = cv2.getPerspectiveTransform(np.array(pts1), np.array(pts2))
print(M)
## 说明逆透视变换函数各参数含义
# cv2.warpPerspective(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) → dst
# src:输入图像;   M:变换矩阵;    dsize:目标图像shape;    flags:插值方式,interpolation方法INTER_LINEAR或INTER_NEAREST;
# borderMode:边界补偿方式,BORDER_CONSTANT or BORDER_REPLICATE;   borderValue:边界补偿大小,常值,默认为0
dst = cv2.warpPerspective(img, M, (135*4,112*4))

#显示图片
cv2.namedWindow('dst',0)
cv2.namedWindow('original_img',0)
cv2.imshow("original_img",img)
cv2.imshow("dst",dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

上一篇:

下一篇: