Python----计算机视觉处理(Opencv:道路检测之道路透视变换)

发布于:2025-04-02 ⋅ 阅读:(37) ⋅ 点赞:(0)

一、透视变换

        对于道路检测来说,为了方便车辆进行行驶,道路上都有车道线,为了更加方便对道路线进行检测,首先我们要把到路线平视图转变为俯视图,以便后期处理更加方便,如下图所示,该为虚拟场景的驾驶车辆第一人称图。

我们要把这张图片装变为第三人称视角的俯瞰图,如下图所示 

二、操作方式

   

导入模块

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

网站公告

今日签到

点亮在社区的每一天
去签到