基于OpenCV的Python斑马线检测与行人礼让判定实现
本文介绍利用Python和OpenCV进行斑马线检测的完整流程,涵盖灰度转换、高斯滤波、阈值处理及形态学操作。通过轮廓检测与感兴趣区域(ROI)筛选,实现斑马线定位,并结合车辆与行人坐标信息,探讨机动车礼让行行为的判定逻辑,为交通场景分析提供基础技术方案。
斑马线检测基本思路与流程
基本思路
斑马线检测的核心流程依赖于OpenCV图像处理技术,具体包括灰度值转换、高斯滤波去噪、阈值处理、腐蚀与膨胀操作,最后进行轮廓检测。系统通过识别车辆和行人的位置及其相对距离,当检测到车速超过设定阈值且与行人距离较近时,即可判定车辆未礼让行人。

结果示例

实验流程与预处理实现
实验流程
测试策略为先从视频中截取单帧图片进行验证,若处理结果符合预期,再将该逻辑嵌套至视频流处理中,以实现实时检测效果。
预处理阶段包含灰度值转换、高斯滤波去噪、阈值处理以及腐蚀和膨胀操作,具体参数需根据实际需求进行调整。
#灰度值转换
imgGray = cv2.cvtColor(copy_img,cv2.COLOR_BGR2GRAY)
#高斯滤波去噪
imgBlur = cv2.GaussianBlur(imgGray,(5,5),0)
#阈值处理
ret,thresh = cv2.threshold(imgBlur,127,255,cv2.THRESH_BINARY)
#腐蚀
imgEro = cv2.erode(thresh,kernel1,iterations=2)
#膨胀
imgDia = cv2.dilate(imgEro,kernel2,iterations=4)
预处理后的图像效果如下图所示:

轮廓检测与感兴趣区域筛选
轮廓检测
#轮廓检测
_,contouts,hie = cv2.findContours(imgDia,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
cnt = contouts
cv2.drawContours(copy_img, cnt, -1, (0, 255, 0), 2)
全部轮廓检测结果如下图所示:

可见所有轮廓并非目标所需,因此需通过位置判断筛选出感兴趣区域(ROI)。
感兴趣区域
需根据具体图片或视频需求,调整x、y、w、h等坐标与尺寸参数以锁定目标区域。
for i in cnt:
#坐标赋值
x,y,w,h = cv2.boundingRect(i)
#roi位置判断
if y>350 and y<450 and x<1200 and w>50 and h>10:
# 画出轮廓
cv2.drawContours(copy_img, i, -1, (0, 255, 0), 2)
获取ROI后的完整处理结果如下图所示:

完整代码
import cv2
import numpy as np
#定义两个核 (kernel_Ero用于腐蚀,kernel_Dia用于膨胀)
kernel_Ero = np.ones((3,1),np.uint8)
kernel_Dia = np.ones((3,5),np.uint8)
img = cv2.imread("../images/bmx.png")
copy_img = img.copy()
#原图copy修改尺寸
copy_img = cv2.resize(copy_img,(1600,800))
#灰度值转换
imgGray = cv2.cvtColor(copy_img,cv2.COLOR_BGR2GRAY)
#高斯滤波去噪
imgBlur = cv2.GaussianBlur(imgGray,(5,5),0)
#阈值处理
ret,thresh = cv2.threshold(imgBlur,127,255,cv2.THRESH_BINARY)
#腐蚀
imgEro = cv2.erode(thresh,kernel_Ero,iterations=2)
#膨胀
imgDia = cv2.dilate(imgEro,kernel_Dia,iterations=4)
#轮廓检测
_,contouts,hie = cv2.findContours(imgDia,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
cnt = contouts
for i in cnt:
#坐标赋值
x,y,w,h = cv2.boundingRect(i)
#roi位置判断
if y>350 and y<450 and x<1200 and w>50 and h>10:
# 画出轮廓
cv2.drawContours(copy_img, i, -1, (0, 255, 0), 2)
cv2.imshow("img",copy_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
业务场景下的礼让判定逻辑
总结
在常规业务需求中,仅通过上述流程框选目标并不可行。若需准确判别交通场景中机动车是否礼让行人,必须基于坐标进行逻辑判断。具体做法是从第一个斑马线坐标至最后一个斑马线坐标(横向)绘制一个大的矩形框(即ROI区域),随后依据该矩形框的坐标范围,结合机动车已有的坐标信息,进行行为判定以达成业务需求。
最后!!!
首次接触OpenCV,敬请各位视觉领域专家指正,勿怪新手尝试!(/狗头)
代码量较少,泛化能力有限,属于基础做法。但对于初学者而言,学习OpenCV仍具重要价值,关键在于动手实践。
到此这篇关于基于python的opencv图像处理实现对斑马线的检测示例的文章就介绍到这了,更多相关opencv 斑马线检测内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









