基于python的opencv图像处理实现对斑马线的检测示例
作者:舔狗小明 发布时间:2021-07-30 23:02:44
标签:opencv,斑马线,检测
基本思路
斑马线检测通过opencv图像处理来进行灰度值转换、高斯滤波去噪、阈值处理、腐蚀和膨胀后对图像进行轮廓检测,通过判断车辆和行人的位置,以及他们之间的距离信息,当车速到超过一定阈值时并且与行人距离较近时,则会被判定车辆为未礼让行人。
结果示例
实验流程
先通过视频截取一张图片来进行测试,如果结果满意之后再嵌套到视频中,从而达到想要的效果。
1.预处理(灰度值转换、高斯滤波去噪、阈值处理、腐蚀和膨胀)> 根据自己的需求来修改一些值
#灰度值转换
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)
预处理之后(如下图所示):
2.轮廓检测
#轮廓检测
_,contouts,hie = cv2.findContours(imgDia,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
cnt = contouts
cv2.drawContours(copy_img, cnt, -1, (0, 255, 0), 2)
全部的轮廓(如下图所示)
可以看到这并不是我们想要的,所以我们需要判断一下位置,选取我们感兴趣的区域。
3.感兴趣区域
根据自己图片或视频的需求来更改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后完整结果(如下图所示)
4.完整代码
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!所以请各位视觉领域的大佬们勿喷我这个小菜鸡!(/狗头)
代码量非常少,无泛化能力,很low的一种做法。。。不过对于小白的我来说学习opencv还是很有帮助滴!干就完了!奥利给!
来源:https://blog.csdn.net/weixin_44912902/article/details/109010734


猜你喜欢
- 如何在聊天室实现趣味答题并计分功能?这个创意确实很好,我们可用在聊天室框架中加入一隐含帧(5分钟刷新一次)的做法来实现这一功能。questi
- zyw147 提出问题:ASP读取指定xml 的节点?怎么用ASP《不是JS》取出指定的节点? 例如我想取出北京,我在ASP客户端提交的是
- 1. 介绍 SQLite 是一个开源的嵌入式关系数据库,实现自包容、零配置、支持事务的SQL数据库引擎。 其特点是高度便携、使用方便、结构紧
- WxPython界面用pubsub实现多线程控制用WxPython做界面时, 如果数据操作时间比较长,会使 WxPython 界面处于假死状
- 1. Python的文件类型1. 源代码--直接由Python解析vi 1.py #!/usr/bin/pythonprint 'h
- 前言MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库
- 学习前言上一篇讲了如何构建回归算法,这一次将怎么进行简单分类。Keras中分类的重要函数1、np_utils.to_categoricaln
- 前言前一篇autoit实现文件上传打包成.exe可执行文件后,每次只能传固定的那个图片,我们实际测试时候希望传不同的图片。这样每次调用的时候
- 其实和爬取普通数据本质一样,不过我们直接爬取数据会直接返回,爬取图片需要处理成二进制数据保存成图片格式(.jpg,.png等)的数据文本。现
- execute、executeUpdate、executeQuery三者的区别(及返回值)一、boolean execute(String
- 普通滑动验证以http://admin.emaotai.cn/login.aspx为例这类验证码只需要我们将滑块拖动指定位置,处理起来比较简
- 本文实例为大家分享了wxPython整点报时的具体代码,供大家参考,具体内容如下# C盘要有个wav文件,内含报时音频import wx &
- 前言:Event在python线程间同步是一种常用的方法,本博客以生产者线程和工作者线程为例说明Event在线程间进行10次同步的应用。im
- 本文实例讲述了Python计算程序运行时间的方法。分享给大家供大家参考。具体实现方法如下:import timedef start_slee
- 这篇文章主要介绍了通过实例简单了解Python中yield的作用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- DQL简介概念:DQL(data query language)数据查询语言 select操作排序规则:- select 表达式1|字段,.
- 代码实现如下:import win32com.client,os,timedef word_encryption(path, passwor
- 以前在网上看到的最简单的拖动对象的代码,忘记作者叫什么了。原始代码在IE下有些小问题,并且声明了文档类型为xhtml 1.0后,在FF等非I
- 目录ORM是什么实现ORM中的insert功能完善对数据类型的检测抽取到基类中添加数据库驱动执行sql语句添加数据库驱动执行sql语句测试功
- 0. Intro在pytorch或者其他深度学习框架中,有许多超参数需要调整,包括learning_rate,training_data_p