当前位置: 首页 > news >正文

OpenCV-Python小应用(六):车道线检测

OpenCV-Python小应用(六):车道线检测

    • 前言
    • 前提条件
    • 实验环境
    • 基于霍夫变换的车道线检测
    • 参考文献

前言

  • 本文是个人使用OpenCV-Python的应用案例,由于水平有限,难免出现错漏,敬请批评改正。
  • 更多精彩内容,可点击进入OpenCV-Python小应用专栏或我的个人主页查看

前提条件

  • 熟悉Python

实验环境

  • Python 3.6.13 (面向对象的高级语言)
  • OpenCV 3.4.10(python第三方库)pip3 install opencv-python==3.4.10.37

基于霍夫变换的车道线检测

  • 主要思路:利用霍夫变换将图片中的所有直线找出,并通过区域坐标过滤掉不是车道线的直线。这属于传统算法的范畴,有一定的局限性。
  • 霍夫变换相关知识点,可查阅OpenCV-Python快速入门(十五):霍夫变换
import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图片
img = cv2.imread('lane.jpg')
# 灰度图
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 边缘检测
edges = cv2.Canny(gray,50,150,apertureSize = 3)
# BGR -> RGB
img_RGB=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
img_Show=img_RGB.copy()
# 概率霍夫变换
'''
lines =cv2.HoughLinesP(image, rho, theta, threshold, minLineLength, maxLineGap)
参数:
    image 是输入图像,即源图像,必须为 8 位的单通道二值图像。
        对于其他类型的图像,在进行霍夫变换之前,需要将其修改为这个指定的格式。
    rho 为以像素为单位的距离 r 的精度。一般情况下,使用的精度是 1。
    theta 是角度𝜃的精度。一般情况下,使用的精度是 np.pi/180,表示要搜索可能的角度。
    threshold 是阈值。该值越小,判定出的直线越多;值越大,判定出的直线就越少。
    minLineLength 用来控制“接受直线的最小长度”的值,默认值为 0。
    maxLineGap 用来控制接受共线线段之间的最小间隔,即在一条线中两点的最大间隔。
            如果两点间的间隔超过了参数 maxLineGap 的值,就认为这两点不在一条线上。默认值为 0。
返回值:
    lines 是由 numpy.ndarray 类型的元素构成的,其中每个元素都是一对浮点数,表示检测到的直线的参数,即(r, θ)。
'''
lines = cv2.HoughLinesP(edges,1,np.pi/180,1,minLineLength=55,maxLineGap=9)

for line in lines:
    x1,y1,x2,y2 = line[0]
    if x1 < 150 or x1 > 500 or x2 > 500 or y2 < 500: # 过滤多余的直线
        continue
    # print(x1,y1,x2,y2)
    cv2.line(img_RGB,(x1,y1),(x2,y2),(255,0,0),10)

# 显示图片
plt.figure(figsize=(40, 40))
plt.subplot(121)
plt.title("Origin")
plt.imshow(img_Show)
plt.subplot(122)
plt.title("Result")
plt.imshow(img_RGB)
plt.show()

在这里插入图片描述

参考文献

[1] https://opencv.org/
[2] 李立宗. OpenCV轻松入门:面向Python. 北京: 电子工业出版社,2019

  • 更多精彩内容,可点击进入OpenCV-Python小应用专栏或我的个人主页查看

相关文章:

  • 微信小程序介绍
  • matlab实现MCMC的马尔可夫转换MS- ARMA - GARCH模型估计
  • 华为云桌面Workspace,让你的办公更加舒适惬意
  • 基于优先级的时间片轮转调度算法(C语言实现)
  • 43特征01——特征值特征向量: 特征多项式、特殊矩阵 的特征值与特征向量、Hamilton-Cayley 定理
  • [毕业设计]机器学习的运动目标跟踪-opencv
  • Ubuntu 软件管理学习笔记
  • python中pytest库用法详解
  • CSRF漏洞简介
  • C/C++航空客运订票系统
  • 编译原理之词法分析器随笔和简单实现
  • 47 - 父子间的冲突
  • 单片机和ARM A的区别
  • STC 51单片机40——汇编语言 串口 接收与发送
  • python破解wifi教程
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • bearychat的java client
  • egg(89)--egg之redis的发布和订阅
  • es6(二):字符串的扩展
  • exports和module.exports
  • JavaScript对象详解
  • PHP 的 SAPI 是个什么东西
  • Python 反序列化安全问题(二)
  • React-生命周期杂记
  • spring boot下thymeleaf全局静态变量配置
  • vue2.0项目引入element-ui
  • 对JS继承的一点思考
  • 给新手的新浪微博 SDK 集成教程【一】
  • 判断客户端类型,Android,iOS,PC
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 阿里云重庆大学大数据训练营落地分享
  • 整理一些计算机基础知识!
  • #pragma once
  • $.ajax()方法详解
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (十六)一篇文章学会Java的常用API
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转)JAVA中的堆栈
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .libPaths()设置包加载目录
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .net 托管代码与非托管代码
  • @staticmethod和@classmethod的作用与区别
  • @test注解_Spring 自定义注解你了解过吗?
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • [2018][note]用于超快偏振开关和动态光束分裂的all-optical有源THz超表——
  • [22]. 括号生成
  • [Gamma]阶段测试报告
  • [JavaWeb学习] Spring Ioc和DI概念思想
  • [JS真好玩] 掘金创作者必备: 监控每天是谁取关了你?
  • [LeetCode] NO. 387 First Unique Character in a String
  • [LOJ161] 仙人掌计数
  • Maven知识点汇总
  • CUBA与Spring相比,有很大的不同吗?
  • Android 检测软键盘的弹起与隐藏
  • 报表工具分析报告
  • ansible-playbook 部署zabbix服务端和客户端
  • 正则表达式——WPF输入控件TextBox 限定输入特定字符
  • 仿有道词典 ListView item飞入效果
  • 三种主流RIA开发平台评测报告
  • dockerfile构建zabbix的 agent端和server端镜像
  • WPF中TextBox文件拖放问题