基于opencv的车道线识别 方法二(极易实现(python))

2023-11-01

效果图

在这里插入图片描述
在这里插入图片描述

语言:

      python

平台:

           pycharm

所需的库

				matplotlib
				numpy
				cv2

步骤及原理

1.导入库

import matplotlib.pyplot as plt
import numpy as np
import cv2 as cv

2.二值化

因为车道线的颜色是明显区别于环境的,所以可以通过二值化来实现将车道线与环境分开。
代码及效果如下:

img0=cv.imread('IMG_20210707_151326.jpg',0)  #以灰度图读取原图,后续找出车道线的处理都在这张图的基础上
# cv.imshow('yuantu',img0)
# cv.waitKey(0)
img0=cv.resize(img0,(600,600)) #改为600*600大小的
plt.imshow(img0)   #这里做出说明,用plt显示图片是为了顺利找出roi,因为plt显示图片,鼠标指哪里,就会自动显示改点坐标。
plt.show()
ret,img1=cv.threshold(img0,180,255,cv.THRESH_BINARY)  #二值化
cv.namedWindow('Image',0)
cv.imshow("Image",img1)
cv.waitKey(0)

在这里插入图片描述
在这里插入图片描述

3.提取感兴趣区域

这一部分的操作和上一篇博客一样,可以参考上一篇博客。
代码及效果如下:

mask=np.zeros_like(img1)   #变换为numpy格式的图片
mask=cv.fillPoly(mask,np.array([[[0,460],[580,480],[400,15],[330,15]]]),color=255)   #对感兴趣区域制作掩膜
#在此做出说明,实际上,车载相机固定于一个位置,所以对于感兴趣的区域的位置也相对固定,这个视相机位置而定。
cv.namedWindow('mask',0)
cv.resizeWindow('mask',800,1200)
cv.imshow('mask',mask)
cv.waitKey(0)
masked_edge_img=cv.bitwise_and(img1,mask)   #与运算
cv.namedWindow('masked_edge_img',0)
cv.resizeWindow('masked_edge_img',800,1200)
cv.imshow('masked_edge_img',masked_edge_img)
cv.waitKey(0)

在这里插入图片描述

4.剔除噪点

这里提供两种方法,也都是对于二值图片比较简单有效的方法。因为之前的二值化基本上没留下什么噪点,所以这一步没有明显的效果。但是如果有噪点的话,可以使用如下方法。
1,使用先腐蚀后膨胀的方式
2,直接使用cv.findContours函数,找出连通域,再删除小于阈值的连通域。

方法1的代码及效果:

kernel=np.ones((1,1),np.uint8)   #创建核函数
img2=cv.erode(masked_edge_img,kernel)  #腐蚀
img2=cv.dilate(img2,kernel)       #膨胀
cv.imshow('img2',img2)
cv.waitKey(0)

在这里插入图片描述
方法2的代码及效果:

contours, hierarchy = cv.findContours(masked_edge_img, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)  #找出连通域
# print(len(contours),hierarchy)
for i in range(len(contours)):
    area = cv.contourArea(contours[i])  #将每一个连通域的面积赋值给area
    if area <2:                         # '设定连通域最小阈值,小于该值被清理'
        cv.drawContours(masked_edge_img, [contours[i]], 0, 0, -1)  
cv.namedWindow('masked_edge_img',0)
cv.resizeWindow('masked_edge_img',600,600)
cv.imshow('masked_edge_img',masked_edge_img)
cv.waitKey(0)

在这里插入图片描述

5.找出值不为零的点(即车道线),并将其绘制在原图上。

因为是二值图片,所以很好理解,图中白色的即为车道线,其像素值不为零,故而for循环,做个判断,即可以找出这些点了。
代码如下:

points=[]    #创建一个空列表,用于存放点的坐标信息
for i in range(600):
    for j in range(600):
        if img2[i,j]!=0:
            img[i,j]=(0,0,255)  #将值不为零的点用红色代替在原图上,注意这里的img是600*600的原图
            points.append([i,j])
cv.imshow('image',img)
cv.waitKey(0)

完整代码

import matplotlib.pyplot as plt
import numpy as np
import cv2 as cv

img=cv.imread('IMG_20210707_151326.jpg')
img=cv.resize(img,(600,600))  #将原图改为600*600格式大小的,为了后续方便,最后就是在这张600*600的图上画出车道线
cv.imshow('image',img)
cv.waitKey(0)
img0=cv.imread('IMG_20210707_151326.jpg',0)  #重新以灰度图读取原图,后续找出车道线的处理都在这张图的基础上
# cv.imshow('yuantu',img0)
# cv.waitKey(0)
img0=cv.resize(img0,(600,600)) #改为600*600大小的
plt.imshow(img0)   #这里做出说明,用plt显示图片是为了顺利找出roi,因为plt显示图片,鼠标指哪里,就会自动显示改点坐标。
plt.show()

ret,img1=cv.threshold(img0,180,255,cv.THRESH_BINARY)  #二值化
cv.namedWindow('Image',0)
cv.imshow("Image",img1)
cv.waitKey(0)
# cv.destroyAllWindows()

'''2.roi_mask(提取感兴趣的区域)'''
mask=np.zeros_like(img1)   #变换为numpy格式的图片
mask=cv.fillPoly(mask,np.array([[[0,460],[580,480],[400,15],[330,15]]]),color=255)   #对感兴趣区域制作掩膜
#在此做出说明,实际上,车载相机固定于一个位置,所以对于感兴趣的区域的位置也相对固定,这个视相机位置而定。
cv.namedWindow('mask',0)
cv.resizeWindow('mask',800,1200)
cv.imshow('mask',mask)
cv.waitKey(0)
masked_edge_img=cv.bitwise_and(img1,mask)   #与运算
cv.namedWindow('masked_edge_img',0)
cv.resizeWindow('masked_edge_img',800,1200)
cv.imshow('masked_edge_img',masked_edge_img)
cv.waitKey(0)

'剔除小连通域1'
contours, hierarchy = cv.findContours(masked_edge_img, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE)  #找出连通域
# print(len(contours),hierarchy)
for i in range(len(contours)):
    area = cv.contourArea(contours[i])  #将每一个连通域的面积赋值给area
    if area <2:                         # '设定连通域最小阈值,小于该值被清理'
        cv.drawContours(masked_edge_img, [contours[i]], 0, 0, -1)
cv.namedWindow('masked_edge_img',0)
cv.resizeWindow('masked_edge_img',600,600)
cv.imshow('masked_edge_img',masked_edge_img)
cv.waitKey(0)
img2=masked_edge_img

'找出车道线每个点的坐标,并绘制在原图上'
points=[]    #创建一个空列表,用于存放点的坐标信息
for i in range(600):
    for j in range(600):
        if img2[i,j]!=0:
            img[i,j]=(0,0,255)  #将值不为零的点用红色代替在原图上,注意这里的img是600*600的原图
            points.append([i,j])
cv.imshow('image',img)
cv.waitKey(0)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于opencv的车道线识别 方法二(极易实现(python)) 的相关文章

随机推荐

  • Android音视频开发(2)常用的系统播放器MediaPlayer

    1 状态图及生命周期 MediaPlayer是一个多媒体播放类 通过它控制音视频流或本地音视频资源的播放过程 它分为很多状态 如下图所示 图中的单箭头弧代表同步函数调用 双箭头弧代表异步函数调用 1 1 Idle状态 End状态以及生命周期
  • PromptDet: Towards Open-vocabulary Detection using Uncurated Images (ECCV2022)

    PromptDet Towards Open vocabulary Detection using Uncurated Images eccv2022 本文作者的核心目的是 在使用最少的人工成本下 来定位和识别 novel categori
  • AntD Pro登录页面,调用接口实现与服务器的交互

    AntD Pro登录 实现的功能 登录界面样式部分 点击提交 发送请求 server层接收请求 发送请求 调用后端接口 model层接收服务器返回的数据 并对数据进行处理 前端页面返回结果 渲染界面 总结 实现的功能 登录界面样式 判断登录
  • c++11 智能指针 (std::shared_ptr)(三)

    定义于头文件
  • 利用tcpcopy引流做模拟在线测试

    一 工具介绍 Tcpcopy是一个分布式在线压力测试工具 可以将线上流量拷贝到测试机器 实时的模拟线上环境 达到在程序不上线的情况下实时承担线上流量的效果 尽早发现bug 增加上线信心 Tcpcopy是由网易技术部于2011年9月开源的一个
  • Access Token 机制详解

    我们在访问很多大公司的开放 api 的时候 都会发现这些 api 要求传递一个 access token 参数 这个参数是什么呢 需要去哪里获取这个 access token 呢 access token 是在 Oauth2 0 协议中 客
  • 台式电脑如何截屏_台式电脑截图方法:电脑怎么截屏及电脑截图按什么快捷键...

    Windows电脑截图的常用方法 一 键盘按Print Screen SysRq 键截屏 在电脑键盘F12右侧第一个键 Print Screen SysRq 按下Print Screen SysRq 键可以截取电脑显示屏全部并复制成功 只需
  • Spring Test 整合 JUnit 4 使用总结

    1 加入依赖包 使用Spring的测试框架需要加入以下依赖包 JUnit 4 官方下载 http www junit org Spring Test Spring框架中的test包 Spring 相关其他依赖包 不再赘述了 就是contex
  • 【线性代数】线性代数的几何意义

    目录 向量 线性变化与矩阵引入 矩阵乘法运算 行列式 逆矩阵 秩 点积 点积的几何理解 叉积 叉积的算术和几何意义 基变换 特征值和特征向量 函数与向量空间 线性代数可以说是学习计算机不可或缺的基础知识 计算机中很多复杂的运算都要依靠线性代
  • 网络安全-漏洞扫描

    利用漏洞扫描设备接入被测对象网络 通过指定 IP 地址范围等配置方法确保漏洞扫描设备仅对目标测试设备进行扫描 并生成扫描报告 扫描基于漏洞扫描设备内置漏洞知识库 通过采集信息 执行漏洞检测脚本对目标服务器 终端 的操作系统 应用程序 数据库
  • JVM的双亲委派模型

    定义与本质 类加载器用来把类文件加载到JVM内存中 从JDK1 2开始 类加载过程采用双亲委派模型 保证Java平台安全 父类委托的定义 一个类加载器在接到加载类请求的时候 首先不会去加载这个类 而是把这个类加载请求委托给父类去完成 近依次
  • TensorFlow 实战案例:CNN-LSTM 混合神经网络气温预测(附 Python 完整代码)

    大家好 今天和各位分享一下如何使用 Tensorflow 构建 CNN卷积神经网络和 LSTM 循环神经网络相结合的混合神经网络模型 完成对多特征的时间序列预测 本文预测模型的主要结构由 CNN 和 LSTM 神经网络构成 气温的特征数据具
  • 二进制格雷码与自然二进制码之间的转换

    什么是格雷码 格雷码 又叫循环二进制码或反射二进制码 格雷码是我们在工程中常会遇到的一种编码方式 它的基本的特点就是任意两个相邻的代码只有一位二进制数不同 二进制格雷码与自然二进制码的互换 1 二进制码转换成二进制格雷码 法则是保留二进制码
  • 基于深度学习的目标跟踪(Yolov3+deepsort)

    最近有个计数的项目刚好可以用到目标跟踪 先跑通测试一下 感觉还不错 项目代码在这里 主要参考的是一下两个项目改的 deep sort https github com nwojke deep sort keras yolov 3 https
  • 前端常用的一些正则表达式

    在线测试正则的网址 https regexr com 1 正整数 1 9 D 正整数不仅需要判断当前输入的全是数字 还需要保证第一位数字不是0 具体使用方式 直接在方法中写的话
  • Web前端学习(HTML)学习---下(表格标签,列表标签,表单标签)案例

    作者 旧梦拾遗186 专栏 C语言编程 小比特成长日记 前言 趁年轻 余额不足可以挣 电量不足可以充 时间匆匆不再回来 趁年轻就去多付出 不攀比 不抱怨 不计较 多付出 因为有一种努力叫靠自己 前一篇文章我们着重学习了HTML中的 标题标签
  • CSS--滑动门和过渡效果

    滑动门 滑动门出现的背景 制作网页时 为了美观 常常需要为网页元素设置特殊形状的背景 比如微信导航栏 有凸起和凹下去的感觉 最大的问题是里面的字数不一样多 咋办 为了使各种特殊形状的背景能够自适应元素中文本内容的多少 出现了CSS滑动门技术
  • Blender常用快捷键整理

    物体操作快捷键 即选中物体 G键 移动物体 R键 旋转物体 S键 缩放物体 移动 旋转或缩放物体时 按下X Y或Z键 按X Y或Z轴方向移动 旋转或缩放 TAB键 切换为编辑模式 CTRL A 弹出应用菜单 物体模式旋转缩放后应用旋转与缩放
  • 人工智能在通信领域的应用

    人工智能的出现使得各个行业都有了新的发展方向 通过和人工智能结合 使得自己的行业打破传统的方式 以一种新的姿态进入人们的视线中 现在我们都离不开通信技术 很多人对于人工智能给通信领域带来什么的改变 在这篇文章中我们会详细的介绍这一问题 大家
  • 基于opencv的车道线识别 方法二(极易实现(python))

    基于opencv的车道线识别 方法二 效果图 语言 平台 所需的库 步骤及原理 1 导入库 2 二值化 3 提取感兴趣区域 4 剔除噪点 5 找出值不为零的点 即车道线 并将其绘制在原图上 完整代码 效果图 语言 python 平台 pyc