0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

关于Python对交通路口的红绿灯进行颜色检测

新机器视觉 来源:CSDN技术社区 作者:2cy- 2021-10-13 09:32 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

转自|Python联盟

1.视频读取

首先把视频读取进来,因为我测试的视频是4k的所以我用resize调整了一下视频的分辨大小

cap = cv2.VideoCapture('video/小路口.mp4')while True:    ret,frame = cap.read()    if ret == False:        break    frame = cv2.resize(frame,(1920,1080))    cv2.imshow('frame',frame)    c = cv2.waitKey(10)    if c==27:break

imshow()

2.截取roi区域

截取roi的区域,也就是说,为了避免多余的干扰因素我们要把红绿灯的位置给截取出来

截取后的roi

3.转换hsv颜色空间

HSV颜色分量范围

(详细参考:https://www.cnblogs.com/wangyblzu/p/5710715.html)
一般对颜色空间的图像进行有效处理都是在HSV空间进行的,然后对于基本色中对应的HSV分量需要给定一个严格的范围,下面是通过实验计算的模糊范围(准确的范围在网上都没有给出)。

H: 0— 180

S: 0— 255

V: 0— 255

此处把部分红色归为紫色范围(如下图所示):

da25da02-14b7-11ec-8fb8-12bb97331649.png

上面是已给好特定的颜色值,如果你的颜色效果不佳,可以通过python代码来对min和max值的微调,用opencv中的api来获取你所需理想的颜色,可以复制以下代码来进行颜色的调整。
1.首先你要截取roi区域的一张图片
2.读取这张图然后调整颜色值

颜色调整代码如下:

(详细参考:https://www.bilibili.com/video/BV16K411W7x9)

import cv2import numpy as np
def empty(a):    pass
def stackImages(scale,imgArray):    rows = len(imgArray)    cols = len(imgArray[0])    rowsAvailable = isinstance(imgArray[0], list)    width = imgArray[0][0].shape[1]    height = imgArray[0][0].shape[0]    if rowsAvailable:        for x in range ( 0, rows):            for y in range(0, cols):                if imgArray[x][y].shape[:2] == imgArray[0][0].shape [:2]:                    imgArray[x][y] = cv2.resize(imgArray[x][y], (0, 0), None, scale, scale)                else:                    imgArray[x][y] = cv2.resize(imgArray[x][y], (imgArray[0][0].shape[1], imgArray[0][0].shape[0]), None, scale, scale)                if len(imgArray[x][y].shape) == 2: imgArray[x][y]= cv2.cvtColor( imgArray[x][y], cv2.COLOR_GRAY2BGR)        imageBlank = np.zeros((height, width, 3), np.uint8)        hor = [imageBlank]*rows        hor_con = [imageBlank]*rows        for x in range(0, rows):            hor[x] = np.hstack(imgArray[x])        ver = np.vstack(hor)    else:        for x in range(0, rows):            if imgArray[x].shape[:2] == imgArray[0].shape[:2]:                imgArray[x] = cv2.resize(imgArray[x], (0, 0), None, scale, scale)            else:                imgArray[x] = cv2.resize(imgArray[x], (imgArray[0].shape[1], imgArray[0].shape[0]), None,scale, scale)            if len(imgArray[x].shape) == 2: imgArray[x] = cv2.cvtColor(imgArray[x], cv2.COLOR_GRAY2BGR)        hor= np.hstack(imgArray)        ver = hor    return ver
#读取的图片路径path = './green.jpg'cv2.namedWindow("TrackBars")cv2.resizeWindow("TrackBars",640,240)cv2.createTrackbar("Hue Min","TrackBars",0,179,empty)cv2.createTrackbar("Hue Max","TrackBars",19,179,empty)cv2.createTrackbar("Sat Min","TrackBars",110,255,empty)cv2.createTrackbar("Sat Max","TrackBars",240,255,empty)cv2.createTrackbar("Val Min","TrackBars",153,255,empty)cv2.createTrackbar("Val Max","TrackBars",255,255,empty)
while True:    img = cv2.imread(path)    imgHSV = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)    h_min = cv2.getTrackbarPos("Hue Min","TrackBars")    h_max = cv2.getTrackbarPos("Hue Max", "TrackBars")    s_min = cv2.getTrackbarPos("Sat Min", "TrackBars")    s_max = cv2.getTrackbarPos("Sat Max", "TrackBars")    v_min = cv2.getTrackbarPos("Val Min", "TrackBars")    v_max = cv2.getTrackbarPos("Val Max", "TrackBars")    print(h_min,h_max,s_min,s_max,v_min,v_max)    lower = np.array([h_min,s_min,v_min])    upper = np.array([h_max,s_max,v_max])    mask = cv2.inRange(imgHSV,lower,upper)    imgResult = cv2.bitwise_and(img,img,mask=mask)

    imgStack = stackImages(0.6,([img,imgHSV],[mask,imgResult]))    cv2.imshow("Stacked Images", imgStack)cv2.waitKey(1)

运行代码后调整的结果(如下图所示),很明显可以看到绿色已经被获取到。

da35e1a4-14b7-11ec-8fb8-12bb97331649.png

4.二值图像颜色判定

因为图像是二值的图像,所以如果图像出现白点,也就是255,那么就取他的max最大值255,视频帧的不断变化然后遍历每个颜色值

red_color = np.max(red_blur)green_color = np.max(green_blur)if red_color == 255:  print('red')elif green_color == 255:print('green')

5.颜色结果画在图像上

用矩形框来框选出红绿灯区域

cv2.rectangle(frame,(1020,50),(1060,90),(0,0,255),2) #按坐标画出矩形框cv2.putText(frame,"red",(1020,40),cv2.FONT_HERSHEY_COMPLEX,1,(0,0,255),2)#显示red文本信息

6.完整代码

import cv2import numpy as np
cap = cv2.VideoCapture('video/小路口.mp4')while True:    ret,frame = cap.read()    if ret == False:        break    frame = cv2.resize(frame,(1920,1080))    #截取roi区域    roiColor = frame[50:90,950:1100]    #转换hsv颜色空间    hsv = cv2.cvtColor(roiColor,cv2.COLOR_BGR2HSV)
    #red    lower_hsv_red = np.array([157,177,122])    upper_hsv_red = np.array([179,255,255])    mask_red = cv2.inRange(hsv,lowerb=lower_hsv_red,upperb=upper_hsv_red)    #中值滤波    red_blur = cv2.medianBlur(mask_red, 7)    #green    lower_hsv_green = np.array([49,79,137])    upper_hsv_green = np.array([90,255,255])    mask_green = cv2.inRange(hsv,lowerb=lower_hsv_green,upperb=upper_hsv_green)    #中值滤波    green_blur = cv2.medianBlur(mask_green, 7)
    #因为图像是二值的图像,所以如果图像出现白点,也就是255,那么就取他的max最大值255    red_color = np.max(red_blur)    green_color = np.max(green_blur)    #在red_color中判断二值图像如果数值等于255,那么就判定为red    if red_color == 255:        print('red')                        #。。。这是我经常会混淆的坐标。。。就列举出来记一下。。。                        #      y  y+h x  x+w                        #frame[50:90,950:1100]
                        #     x   y    x+w  y+h        cv2.rectangle(frame,(1020,50),(1060,90),(0,0,255),2) #按坐标画出矩形框        cv2.putText(frame, "red", (1020, 40), cv2.FONT_HERSHEY_COMPLEX, 1, (0, 0, 255),2)#显示red文本信息    #在green_color中判断二值图像如果数值等于255,那么就判定为green    elif green_color == 255:        print('green')        cv2.rectangle(frame,(1020,50),(1060,90),(0,255,0),2)        cv2.putText(frame, "green", (1020, 40), cv2.FONT_HERSHEY_COMPLEX, 1, (0, 255, 0),2)
    cv2.imshow('frame',frame)    red_blur = cv2.resize(red_blur,(300,200))    green_blur = cv2.resize(green_blur,(300,200))    cv2.imshow('red_window',red_blur)    cv2.imshow('green_window',green_blur)
    c = cv2.waitKey(10)    if c==27:break
编辑:jq
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73151
  • python
    +关注

    关注

    57

    文章

    4858

    浏览量

    89586
  • 4K
    4K
    +关注

    关注

    2

    文章

    535

    浏览量

    61027
  • HSV
    HSV
    +关注

    关注

    0

    文章

    10

    浏览量

    2804

原文标题:基于Python对交通路口的红绿灯进行颜色检测

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【EASY EAI Nano-TB(RV1126B)开发板试用】命令行功能测试-红绿灯按钮项目-Python实现简单的Web服务器

    0接上文【EASY EAI Nano-TB(RV1126B)开发板试用】命令行功能测试-红绿灯按钮项目性能优化-系统性能、网络配置、安全检及cpu温度采集互联网在过去30年里已经大大地改变了我们
    发表于 11-16 16:35

    【EASY EAI Nano-TB(RV1126B)开发板试用】命令行功能测试-红绿灯按钮项目性能优化-系统性能、网络配置、安全检及cpu温度采集

    接上文【EASY EAI Nano-TB(RV1126B)开发板试用】命令行功能测试-shell脚本进行IO控制-红绿灯按钮项目 一、实验名称 1、开发板板载资源系统性能、网络配置、安全检 2:温度
    发表于 11-05 13:48

    【EASY EAI Nano-TB(RV1126B)开发板试用】命令行功能测试-shell脚本进行IO控制-红绿灯项目-实现开机起动

    0接上文【EASY EAI Nano-TB(RV1126B)开发板试用】命令行功能测试-shell脚本进行IO控制-红绿灯项目 Linux 起动系统下 init 系统大多数 Linux 发行版
    发表于 11-03 17:25

    【EASY EAI Nano-TB(RV1126B)开发板试用】命令行功能测试-shell脚本进行IO控制-红绿灯按钮项目

    0接上文【EASY EAI Nano-TB(RV1126B)开发板试用】命令行功能测试-shell脚本进行IO控制-红绿灯项目-实现开机起动 EASYEAINano-TB(RV1126B)是一款专为
    发表于 11-03 10:00

    【EASY EAI Nano-TB(RV1126B)开发板试用】命令行功能测试-shell脚本进行IO控制-红绿灯项目

    Nano-TB(RV1126B)开发板,通过GPIO控制实现红绿灯板的三种颜色LED灯交替闪烁功能。开发板使用SSH进行远程控制通过WiFi连接。 硬件 EASY EAI Nano-TB
    发表于 11-02 18:34

    【EASY EAI Nano-TB(RV1126B)开发板试用】命令行功能测试-shell脚本进行IO控制-灯闪

    GPIO引脚连接到* 红绿灯板 :一个简单的外部设备,包含红、绿、黄三个LED灯上,以控制其色彩的变换效果。 红绿灯红绿灯板 3V3 接EASY EAI Nano-TB(RV1126B)开发板
    发表于 11-01 21:26

    明治案例 | 红绿灯不再“迷糊”:色标传感器ESE让指示灯检测稳、准、快

    在电动剃须刀生产线的末端环节,充电状态检测与即时包装的衔接效率直接影响整体产能与出货质量。本文期内容小明将聚焦某制造工厂的实际案例,解析明治ESE系列色标传感器如何通过对指示灯颜色的精准检测,实现
    的头像 发表于 10-28 07:34 163次阅读
    明治案例 | <b class='flag-5'>红绿灯</b>不再“迷糊”:色标传感器ESE让指示灯<b class='flag-5'>检测</b>稳、准、快

    车联网与智慧交通

    信号灯可以根据实时交通流量调整红绿灯时长,有效缓解道路拥堵;智慧公交系统能够让乘客实时查看车辆到站情况;ETC电子收费系统大幅提升高速路的通行效率;而智慧停车则通过传感器和物联网技术,引导车主快速找到空余车位。随着车路
    的头像 发表于 10-24 14:59 320次阅读

    海康威视全新推出大模型高阶智控信号机

    红绿灯变“聪明”的关键之一就在于信号机的“自适应控制”,它通过雷达、摄像机等传感器,实时“记录”车流变化,通过交通供需模型,自动调节红绿灯的周期和各个方向的绿灯时长。例如哪个方向
    的头像 发表于 09-29 17:11 838次阅读

    易华录助力厦门交警打造智慧红绿灯

    交通信号灯是城市交通管理的重要基础设施,是服务于产业发展和市民出行的温度计。厦门市公安局交警支队携手易华录持续提升信号调控技术手段,创新道路交通管理模式,着力推进红绿灯“智控”能力建设
    的头像 发表于 09-28 09:31 426次阅读

    Momenta MNP记忆领航辅助驾驶系统轻松应对城市复杂路况

    城市通勤是无数司机每天的“必修课”。路口眼花缭乱的红绿灯、随处可见的临时停车、突然闯入视野的行人或车辆,以及夜晚有限的视线和各种意外状况……这些日常驾驶中的琐碎现象,总在不经意间消耗着驾驶者的精力。
    的头像 发表于 07-07 16:33 1067次阅读

    使用PLC实现红绿灯控制示例

    如图为一个红绿灯的控制时序图,启动信号导通后,红绿灯程序开始动作。
    的头像 发表于 05-29 09:45 1172次阅读
    使用PLC实现<b class='flag-5'>红绿灯</b>控制示例

    【ELF 2学习板试用】命令行功能测试-shell脚本进行IO控制-红绿灯按钮项目

    接上文[【ELF 2学习板试用】命令行功能测试-shell脚本进行IO控制-红绿灯项目(https://bbs.elecfans.com/jishu_2475305_1_1.html) 红绿灯按钮
    发表于 02-06 15:39

    【ELF 2学习板试用】命令行功能测试-shell脚本进行IO控制-红绿灯项目

    ) 红绿灯项目 硬件 ELF 2学习板 :一款用于嵌入式系统学习的开发板。 红绿灯板 :一个简单的外部设备,包含红、绿、黄三个LED灯。 连接1* ELF 2学习板 红绿灯板 连接2 红绿灯
    发表于 02-06 11:55

    基于CNN和英特尔开发板的红绿灯控制系统设计

    随着中国经济的快速增长和城市化进程的加速,城市交通拥堵、交通事故频发以及环境污染等问题日益严重,尤其是在大城市中,这些问题表现得尤为突出。交通拥堵不仅影响了市民的日常出行效率,更是严重影响了紧急车辆
    的头像 发表于 12-20 10:47 2473次阅读
    基于CNN和英特尔开发板的<b class='flag-5'>红绿灯</b>控制系统设计