基于Opencv和Python的车道线检测系统(带UI界面),附演示视频和下载链接

这篇具有很好参考价值的文章主要介绍了基于Opencv和Python的车道线检测系统(带UI界面),附演示视频和下载链接。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在自动驾驶中,让汽车保持在车道线内是非常重要的,所以这次我们来说说车道线的检测。我们主要用到的是openCV, numpy, matplotlib几个库。主要包括下面这么几个步骤:

  1. 图像加载;
  2. 图像预处理:图片灰度化,高斯滤波;
  3. Cany边缘检测;
  4. 感兴趣区域检测;
  5. 霍夫直线检测 ;
  6. .直线拟合;
  7. 车道线叠加;
  8. 图片和视频测试;
  9. 可视化界面pyqt5

1、实现原理

输入输出

输入:一张摄像机拍摄到的道路图片,图片中需要包含车道线。如下图所示。
车道线检测视频下载,计算机视觉项目实战,opencv,python,音视频
输出:图像坐标系下的左右车道线的直线方程和有效距离。将左右车道线的方程绘制到原始图像上,应如下图所示。
车道线检测视频下载,计算机视觉项目实战,opencv,python,音视频

原始图像

认识图像前,我们需要先回顾一下在初中所学的物理知识——光的三原色,光的三原色分别是红色(Red)、绿色(Green)和蓝色(Blue)。通过不同比例的三原色组合形成不同的可见光色。如下图所示。
车道线检测视频下载,计算机视觉项目实战,opencv,python,音视频
图像中的每个像素点都是由RGB(红绿蓝)三个颜色通道组成。为了方便描述RGB颜色模型,在计算机中约束了每个通道由暗到亮的范围是0~255。

当某个像素点的R通道数值为255,G和B通道数值为0时,实际表现出的颜色就是最亮的红色;当某个像素点的RGB三通道都为255时,所表示的是最亮的白色;当某个像素点的RGB三通道都为0时,就会显示最暗的黑色。在RGB颜色模型中,不会有比[255,255,255]的组合更亮的颜色了。

根据以上理论基础,一幅彩色图像,其实就是由三幅单通道的图像叠加,如下图所示。

车道线检测视频下载,计算机视觉项目实战,opencv,python,音视频
以基于python的OpenCV为例,读取名为test_img.jpg的图片到计算机内存中的代码如下:

import cv2
img = cv2.imread('image_name.jpg')

读取图像后,我们可以将图像看做一个二维数组,每个数组元素中存了三个值,分别是RGB三个通道所对应的数值。

OpenCV定义了,图像的原点(0,0)在图片的左上角,横轴为X,朝右,纵轴为Y,朝下,如下图所示。
车道线检测视频下载,计算机视觉项目实战,opencv,python,音视频

需要注意的是,由于OpenCV的早期开发者习惯于使用BGR顺序的颜色模型,因此使用OpenCV的imread()读到的像素,每个像素的排列是按BGR,而不是常见的RGB,代码编写时需要注意。

灰度处理

考虑到处理三个通道的数据比较复杂,我们先将图像进行灰度化处理,灰度化的过程就是将每个像素点的RGB值统一成同一个值。灰度化后的图像将由三通道变为单通道,单通道的数据处理起来就会简单许多。

通常这个值是根据RGB三通道的数值进行加权计算得到。人眼对RGB颜色的敏感度不同,对绿色最敏感,权值较高,对蓝色最不敏感,权值较低。坐标为(x,y)的像素点进行灰度化操作的具体计算公式如下:

图像灰度处理计算公式

调用OpenCV中提供的cvtColor()函数,能够方便地对图像进行灰度处理

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

由于使用cv2.imread()读到的img的数据排列为BGR,因此这里的参数为BGR2GRAY。

灰度处理后的图像如下图所示:
车道线检测视频下载,计算机视觉项目实战,opencv,python,音视频

边缘提取

为了突出车道线,我们对灰度化后的图像做边缘处理。“边缘”就是图像中明暗交替较为明显的区域。车道线通常为白色或黄色,地面通常为灰色或黑色,因此车道线的边缘处会有很明显的明暗交替。

常用的边缘提取算法有Canny算法和Sobel算法,它们只是计算方式不同,但实现的功能类似。可以根据实际要处理的图像,选择算法。哪种算法达到的效果更好,就选哪种。

以Canny算法为例,选取特定的阈值后,对灰度图像进行处理,即可得到的边缘提取的效果图。

low_threshold = 40
high_threshold = 150
canny_image = cv2.Canny(gray, low_threshold, high_threshold)

车道线检测视频下载,计算机视觉项目实战,opencv,python,音视频

感兴趣区域选择

边缘提取完成后,需要检测的车道线被凸显出来了。为了实现自车所在车道的车道线检测,我们需要将感兴趣的区域(Region of Interest)提取出来。提取感兴趣区域最简单的方式就是“截取”。

首先选定一个感兴趣区域,比如下图所示的蓝色三角形区域。对每个像素点的坐标值进行遍历,如果发现当前点的坐标不在三角区域内,则将该点涂“黑”,即将该点的像素值置为0。

车道线检测视频下载,计算机视觉项目实战,opencv,python,音视频
为了实现截取功能,可以封装一下OpenCV的部分函数,定义一个region_of_interest函数:

def region_of_interest(img, vertices):
    #定义一个和输入图像同样大小的全黑图像mask,这个mask也称掩膜
    #掩膜的介绍,可参考:https://www.cnblogs.com/skyfsm/p/6894685.html
    mask = np.zeros_like(img)   
 
    #根据输入图像的通道数,忽略的像素点是多通道的白色,还是单通道的白色
    if len(img.shape) > 2:
        channel_count = img.shape[2]  # i.e. 3 or 4 depending on your image
        ignore_mask_color = (255,) * channel_count
    else:
        ignore_mask_color = 255


    #[vertices]中的点组成了多边形,将在多边形内的mask像素点保留,
    cv2.fillPoly(mask, [vertices], ignore_mask_color)
 
    #与mask做"与"操作,即仅留下多边形部分的图像
    masked_image = cv2.bitwise_and(img, mask)


    return masked_image

封装完函数后,我们将感兴趣的区域输入,实现边缘提取后的图像的截取。

#图像像素行数 rows = canny_image .shape[0]  540行
#图像像素列数 cols = canny_image .shape[1]  960列
left_bottom = [0, canny_image .shape[0]]
right_bottom = [canny_image .shape[1], canny_image .shape[0]]
apex = [canny_image .shape[1]/2, 310]
vertices = np.array([ left_bottom, right_bottom, apex ], np.int32)
roi_image = region_of_interest(canny_image, vertices)

截取后的图像入下图所示:
车道线检测视频下载,计算机视觉项目实战,opencv,python,音视频

霍夫变换

经过灰度处理、边缘检测、感兴趣区域截取后,我们终于将左右车道线从复杂的图像中提取出来了。接下来,我们使用霍夫变换来提取图像中的直线(段)。

霍夫变换是一种特征检测方法,其原理和推导过程可以参看经典霍夫变换(Hough Transform)。

在图像中使用霍夫变换不仅能够识别图像中的直线,还能识别出图像中的圆、椭圆等特征。OpenCV为我们提供了霍夫变换检测直线的函数,可以通过设置不同的参数,检测不同长度的线段。由于车道线存在虚线的可能,因此线段的检测长度不能设置地太长,否则短线段会被忽略掉。

OpenCV的霍夫变换直线检测函数使用方法如下:

rho = 2 # distance resolution in pixels of the Hough grid
theta = np.pi/180 # angular resolution in radians of the Hough grid
threshold = 15     # minimum number of votes (intersections in Hough grid cell)
min_line_length = 40 #minimum number of pixels making up a line
max_line_gap = 20    # maximum gap in pixels between connectable line segments

Hough Transform 检测线段,线段两个端点的坐标存在lines中

lines = cv2.HoughLinesP(roi_image, rho, theta, threshold, np.array([]),
                            min_line_length, max_line_gap)

封装一个绘图函数,实现把线段绘制在图像上的功能,以实现线段的可视化

def draw_lines(img, lines, color=[255, 0, 0], thickness=2):
    for line in lines:
        for x1,y1,x2,y2 in line:
            cv2.line(img, (x1, y1), (x2, y2), color, thickness) # 将线段绘制在img上

将得到线段绘制在原始图像上

import numpy as np
line_image = np.copy(img) # 复制一份原图,将线段绘制在这幅图上
draw_lines(line_image, lines, [255, 0, 0], 6)

结果如下图:
车道线检测视频下载,计算机视觉项目实战,opencv,python,音视频
可以看出,虽然右车道线的线段不连续,但已经很接近我们想要的输出结果了。

数据后处理

霍夫变换得到的一系列线段结果跟我们的输出结果还是有些差异。为了解决这些差异,需要对我们检测到的数据做一定的后处理操作。

实现以下两步后处理,才能真正得到我们的输出结果。

(1)计算左右车道线的直线方程:根据每个线段在图像坐标系下的斜率,判断线段为左车道线还是右车道线,并存于不同的变量中。随后对所有左车道线上的点、所有右车道线上的点做一次最小二乘直线拟合,得到的即为最终的左、右车道线的直线方程。
(2)计算左右车道线的上下边界:考虑到现实世界中左右车道线一般都是平行的,所以可以认为左右车道线上最上和最下的点对应的y值,就是左右车道线的边界。

基于以上两步数据后处理的思路,我们重新定义draw_lines()函数,将数据后处理过程写入该函数中。

def draw_lines(img, lines, color=[255, 0, 0], thickness=2):
    left_lines_x = []
    left_lines_y = []
    right_lines_x = []
    right_lines_y = []
    line_y_max = 0
    line_y_min = 999
    for line in lines:
        for x1,y1,x2,y2 in line:
            if y1 > line_y_max:
                line_y_max = y1
            if y2 > line_y_max:
                line_y_max = y2
            if y1 < line_y_min:
                line_y_min = y1
            if y2 < line_y_min:
                line_y_min = y2
            k = (y2 - y1)/(x2 - x1)
            if k < -0.3:
                left_lines_x.append(x1)
                left_lines_y.append(y1)
                left_lines_x.append(x2)
                left_lines_y.append(y2)
            elif k > 0.3:
                right_lines_x.append(x1)
                right_lines_y.append(y1)
                right_lines_x.append(x2)
                right_lines_y.append(y2)
    #最小二乘直线拟合
    left_line_k, left_line_b = np.polyfit(left_lines_x, left_lines_y, 1)
    right_line_k, right_line_b = np.polyfit(right_lines_x, right_lines_y, 1)
 
    #根据直线方程和最大、最小的y值反算对应的x
    cv2.line(img,
             (int((line_y_max - left_line_b)/left_line_k), line_y_max),
             (int((line_y_min - left_line_b)/left_line_k), line_y_min),
             color, thickness)
    cv2.line(img,
             (int((line_y_max - right_line_b)/right_line_k), line_y_max),
             (int((line_y_min - right_line_b)/right_line_k), line_y_min),
             color, thickness)

根据对线段的后处理,即可得到符合输出要求的两条直线方程的斜率、截距和有效长度。将后处理后的结果绘制在原图上,如下图所示:
车道线检测视频下载,计算机视觉项目实战,opencv,python,音视频

处理视频

视频其实就是一帧帧连续不断的图像,使用读取视频的库,将视频截取成一帧帧图像,然后使用上面的灰度处理、边缘提取、感兴趣区域选择、霍夫变换和数据后处理,得到车道线检测结果,再将图片结果拼接成视频,就完成了视频中的车道线检测。

2、安装使用步骤

Requirements - 必要条件

  • python 3.x
  • numpy
  • matplotlib
  • opencv-python
  • pyqt5

Usage - 用法

  1. install.
$ cd LaneDetectionV1.0
$ pip install -r requirements.txt
  1. Test.
    车道线检测视频下载,计算机视觉项目实战,opencv,python,音视频
# picture test
$ python .\lanedetection.py -i ./assets/1.jpg -o ./assets/1_out.jpg
# video test 
$ python .\lanedetection.py -i ./assets/project_video.mp4 -o ./assets/project_video_out.mp4
  1. Visualization.
# install package
$ pip install pyqt5
# run
$ python mainwindow.py

车道线检测视频下载,计算机视觉项目实战,opencv,python,音视频
车道线检测视频下载,计算机视觉项目实战,opencv,python,音视频
车道线检测视频下载,计算机视觉项目实战,opencv,python,音视频
参考链接:https://zhuanlan.zhihu.com/p/630083399文章来源地址https://www.toymoban.com/news/detail-762946.html

到了这里,关于基于Opencv和Python的车道线检测系统(带UI界面),附演示视频和下载链接的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于深度学习的跌倒检测系统(UI界面+YOLOv5+训练数据集)

    摘要:跌倒监测系统用于智能化监测是否有行人跌倒,通过YOLOv5的深度学习技术对视频、图片、摄像头等画面进行跌倒检测,分析并安全提醒。在介绍算法原理的同时,给出 P y t h o n 的实现代码、 P y Q t 的UI界面及训练数据集。跌倒监测系统主要用于日常生活中行人跌倒情况

    2023年04月18日
    浏览(49)
  • 基于深度学习的智能PCB板缺陷检测系统(Python+清新界面+数据集)

    摘要:智能PCB板缺陷检测系统用于智能检测工业印刷电路板(PCB)常见缺陷,自动化标注、记录和保存缺陷位置和类型,以辅助电路板的质检。本文详细介绍智能PCB板缺陷检测系统,在介绍算法原理的同时,给出 P y t h o n 的实现代码以及 P y Q t 的UI界面和训练数据集。在界面

    2024年01月23日
    浏览(47)
  • 基于深度学习的安全帽检测系统(YOLOv5清新界面版,Python代码)

    摘要:安全帽检测系统用于自动化监测安全帽佩戴情况,在需要佩戴安全帽的场合自动安全提醒,实现图片、视频和摄像头等多种形式监测。在介绍算法原理的同时,给出 P y t h o n 的实现代码、训练数据集,以及 P y Q t 的UI界面。安全帽检测系统主要用于自动化监测安全帽佩

    2023年04月08日
    浏览(56)
  • 基于深度学习的水果检测与识别系统(Python界面版,YOLOv5实现)

    摘要:本博文介绍了一种基于深度学习的水果检测与识别系统,使用YOLOv5算法对常见水果进行检测和识别,实现对图片、视频和实时视频中的水果进行准确识别。博文详细阐述了算法原理,同时提供Python实现代码、训练数据集,以及基于PyQt的UI界面。通过YOLOv5实现对图像中存

    2024年02月02日
    浏览(42)
  • 深度学习目标检测-钢材缺陷检测系统上位机ui界面

    之前写过这个博客: 工业缺陷检测项目实战(二)——基于深度学习框架yolov5的钢铁表面缺陷检测 里面介绍了使用yolov5进行训练的步骤。今天我们一起学习利用qt将缺陷检测封装为一个系统。 首先看看效果: 我们运行,先可以看到登录界面: 如果密码和账号输入错误,会提示警

    2023年04月15日
    浏览(35)
  • 基于YOLOv8的摔倒行为检测系统(Python源码+Pyqt6界面+数据集)

    💡💡💡 本文主要内容:通过实战基于YOLOv8的摔倒行为检测算法,从数据集制作到模型训练,最后设计成为检测UI界面 人体行为分析AI算法,是一种利用人工智能技术对人体行为进行检测、跟踪和分析的方法。通过计算机视觉、深度学习和模式识别等技术,可以实现对人体姿态

    2024年01月25日
    浏览(51)
  • 基于深度学习的花卉检测与识别系统(YOLOv5清新界面版,Python代码)

    摘要:基于深度学习的花卉检测与识别系统用于常见花卉识别计数,智能检测花卉种类并记录和保存结果,对各种花卉检测结果可视化,更加方便准确辨认花卉。本文详细介绍花卉检测与识别系统,在介绍算法原理的同时,给出 P y t h o n 的实现代码、训练数据集,以及 P y

    2024年01月19日
    浏览(37)
  • 基于YOLOv8的PCB缺陷检测系统(Python源码+Pyqt6界面+数据集)

    💡💡💡 本文摘要:基于YOLOv8的PCB缺陷检测系统,并阐述了整个数据制作和训练可视化过程, 最后通过Pyside UI界面进行展示。 博主简介 AI小怪兽,YOLO骨灰级玩家,1)YOLOv5、v7、v8优化创新,轻松涨点和模型轻量化;2)目标检测、语义分割、OCR、分类等技术孵化,赋能智能制

    2024年04月10日
    浏览(68)
  • 毕业设计选题-基于深度学习的车道线检测算法识别系统 人工智能 机器学习 卷积神经网络

    目录 前言 课题背景和意义 实现技术思路 一、车道线检测方法 1.1 卷积神经网络 1.2 注意力机制 二、 数据集 三、实验及结果分析 3.1 实验环境搭建 3.2 模型训练 实现效果图样例 最后     📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学

    2024年02月22日
    浏览(74)
  • 深度学习目标检测-钢材缺陷检测系统上位机ui和web界面

    之前写过这个博客: 工业缺陷检测项目实战(二)——基于深度学习框架yolov5的钢铁表面缺陷检测 里面介绍了使用yolov5进行训练的步骤。今天我们一起学习利用qt将缺陷检测封装为一个系统。 首先看看效果: 我们运行,先可以看到登录界面: 如果密码和账号输入错误,会提示警

    2024年02月01日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包