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

效果图

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

语言:

      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)
  • 4
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,我可以帮您回答这个问题。基于OpenCV的车辆识别可以分为以下几个步骤: 1. 数据集准备:首先需要收集大量的车辆图片作为训练数据,并标注每张图片中车辆的位置。可以使用一些开源的数据集,例如KITTI、PASCAL VOC、COCO等。 2. 特征提取:使用OpenCV提供的特征提取算法,例如HOG、SURF、SIFT等,从车辆图片中提取特征。 3. 训练模型:使用机器学习算法,例如SVM、神经网络等,对提取的特征进行训练,得到车辆识别模型。 4. 目标检测:使用训练好的模型对新的车辆图片进行识别,检测出车辆的位置。 下面是一个简单的基于OpenCV的车辆识别代码示例: ```python import cv2 # 加载训练好的车辆识别模型 car_cascade = cv2.CascadeClassifier('cars.xml') # 加载测试图片 img = cv2.imread('test.jpg') # 转换为灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 检测车辆 cars = car_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30)) # 在图片中标记车辆位置 for (x, y, w, h) in cars: cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 2) # 显示图片 cv2.imshow('Car detection', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 其中,`cars.xml`是训练好的车辆识别模型,`test.jpg`是待识别的车辆图片。`detectMultiScale`方法OpenCV提供的目标检测算法,可以检测出图片中的车辆位置。最后,通过`rectangle`方法在图片中标记出车辆位置,并将结果显示出来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值