一、透视变换
对于道路检测来说,为了方便车辆进行行驶,道路上都有车道线,为了更加方便对道路线进行检测,首先我们要把到路线平视图转变为俯视图,以便后期处理更加方便,如下图所示,该为虚拟场景的驾驶车辆第一人称图。
我们要把这张图片装变为第三人称视角的俯瞰图,如下图所示
二、操作方式
导入模块
import cv2
import numpy as np
输入图像
img=cv2.imread('15.png')
绘出透视变换线
height,width,_=img.shape
cv2.line(img,(width//2-75,height//2),(0,height),(0,0,255),2)
cv2.line(img,(width//2+
透视变换矩阵
src=np.float32(
[
[width//2-75,height//2],
[width//2+100,height//2],
[0,height],
[width,height]
]
)
dst=np.float32(
[
[0,0],
[width,0],
[0,height],
[width,height]
]
)
M=cv2.getPerspectiveTransform(src,dst)
进行透视变换
img_wrp=cv2.warpPerspective(img,M,(width,height),flags=cv2.INTER_LINEAR)
输出图像
cv2.imshow('img',img)
cv2.imshow('img_wrp',img_wrp)
cv2.waitKey(0)
完整代码
import cv2
import numpy as np
img = cv2.imread('15.png')
# 获取图像的高度和宽度
height, width, _ = img.shape
# 在图像中心绘制一条红色直线,起点为 (width//2-75, height//2),终点为 (0, height)
cv2.line(img, (width // 2 - 75, height // 2), (0, height), (0, 0, 255), 2)
# 在图像中心绘制另一条红色直线,起点为 (width//2+100, height//2),终点为 (width, height)
cv2.line(img, (width // 2 + 100, height // 2), (width, height), (0, 0, 255), 2)
# 定义源点坐标,进行透视变换的起始位置
src = np.float32(
[
[width // 2 - 75, height // 2], # 线段起点
[width // 2 + 100, height // 2], # 线段终点
[0, height], # 左下角坐标
[width, height] # 右下角坐标
]
)
# 定义目标点坐标,透视变换后的目标位置
dst = np.float32(
[
[0, 0], # 目标左上角点
[width, 0], # 目标右上角点
[0, height], # 目标左下角点
[width, height] # 目标右下角点
]
)
# 计算透视变换矩阵 M
M = cv2.getPerspectiveTransform(src, dst)
# 应用透视变换,生成新图像 img_wrp
img_wrp = cv2.warpPerspective(img, M, (width, height), flags=cv2.INTER_LINEAR)
# 显示原图和透视变换后的图像
cv2.imshow('img', img)
cv2.imshow('img_wrp', img_wrp)
# 等待按键后关闭窗口
cv2.waitKey(0)
三、库函数
3.1、line()
cv.line( img, pt1, pt2, color[, thickness[, lineType[, shift]]] ) -> IMG
方法 | 描述 |
---|---|
img | 该图像 |
pt1 | 线段的第一个点 |
pt2 | 线段的第二个点 |
color | 线条颜色 |
thickness | 线条粗细 |
lineType | 线路的类型。请参见 LineTypes |
shift | 点坐标中的小数位数 |
3.2、getPerspectiveTransform()
cv.getPerspectiveTransform( src, dst[, solveMethod] ) -> retval
方法 | 描述 |
---|---|
src | 源图像中四边形顶点的坐标。 |
dst | 目标图像中相应四边形顶点的坐标。 |
solveMethod | 传递给 cv::solve 的方法 (DecompTypes) |
3.3、warpPerspective()
cv.warpPerspective( src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]] ) -> DST
方法 | 描述 |
---|---|
src | 输入图像 |
dst | 输出图像,其大小为 dsize 且类型与 src 相同 |
M | 3*3变换矩阵 |
dsize | 输出图像的大小 |
flags | 插值方法(INTER_LINEAR 或 INTER_NEAREST)和可选标志 WARP_INVERSE_MAP 的组合,将 M 设置为逆变换 |
borderMode | 像素外插法(BORDER_CONSTANT 或 BORDER_REPLICATE)。 |
borderValue | 在恒定边界的情况下使用的值;默认情况下,它等于 0 |