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

    文章

    4753

    浏览量

    68365
  • python
    +关注

    关注

    56

    文章

    4783

    浏览量

    84473
  • 4K
    4K
    +关注

    关注

    2

    文章

    523

    浏览量

    59822
  • HSV
    HSV
    +关注

    关注

    0

    文章

    10

    浏览量

    2596

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

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

收藏 人收藏

    评论

    相关推荐

    使用Python进行串口通信的案例

    当然!以下是一个使用Python进行串口通信的简单示例。这个示例展示了如何配置串口、发送数据以及接收数据。我们将使用 pyserial 库,这是一个非常流行的用于串口通信的Python库。 首先,你
    的头像 发表于 11-22 09:11 88次阅读

    使用Python进行图像处理

    下面是一个关于使用Python在几行代码中分析城市轮廓线的快速教程。
    的头像 发表于 11-07 10:14 143次阅读
    使用<b class='flag-5'>Python</b><b class='flag-5'>进行</b>图像处理

    基于51单片机的路口交通灯控制系统仿真

    按键按下,所有路口红灯亮,车辆禁行。(6)特种车辆通行按键分为东西和南北两个按键,东西按键按下,东西向绿灯全亮;南北按键按下,南北向绿灯全亮,20S后恢复。设计介绍51单片机简介51单片是一种低功耗
    的头像 发表于 10-22 14:10 102次阅读
    基于51单片机的<b class='flag-5'>路口交通</b>灯控制系统仿真

    现代摩比斯公司推出新一代高亮度LED灯:色散角大幅提升

    在科技日新月异的今天,每一个细微的创新都可能引领行业的变革。近日,现代摩比斯公司宣布成功研发出一种全新的LED灯,这款灯具不仅适用于红绿灯,也完美适配于汽车尾灯,其色散角的显著提升更是为交通照明领域带来了新的突破。
    的头像 发表于 10-14 16:42 952次阅读

    【星闪派物联网开发套件体验连载】智能交通

    感谢电子发烧友,感谢润和软件,提供星闪派物联网开发套件试用。 本次试用计划: 用星闪派物联网开发套件,先实现本地交通灯项目,接入WiFi连上云端,本地红绿灯状态上传云端,云端显示,云端远程控制红绿灯
    发表于 10-05 13:00

    防反接电路、防倒灌电路、过流保护和ESP相关知识

    ,电路也不会受损,电器照样能用。 防倒灌电路呢,它有点像交通路口红绿灯。在一个系统中,如果有多个电源同时工作,有时候一个电源的电压可能会高于另一个,这时候如果不加控制,电流就会从高压往低压流,这就
    发表于 09-15 07:29

    TomTom交通技术支持Miovision交通信号预测和车联网(V2X) 解决方案系列

    拥堵和排放,改善公共安全。 Miovision支持的产品如奥迪的红绿灯信息等,这项首创的技术可帮助驾驶员
    的头像 发表于 07-02 15:40 1158次阅读

    2024智慧交通路灯行业发展趋势及市场现状分析

    灯市场规模将达2432亿元。 当下智能汽车和智慧交通路灯的数字化发展,正在从解决单一场景问题,向大规模的群体智慧转变。再看腾讯的步伐,腾讯发力产业互联网以来,深耕交通出行领域,致力于将交通OS、实时孪生等技术与具体场景
    的头像 发表于 05-10 16:49 701次阅读

    STM32 ST-LINK Utility 4.2烧程序,过程中ST LINK的红绿灯一直不停闪烁,显示烧录成功芯片没有反应为什么?

    用的是STM32 ST-LINK Utility 4.2烧程序,这个软件可以识别芯片,过程中ST LINK的红绿灯一直不停闪烁,最后显示烧录成功,但是芯片没有反应
    发表于 03-20 07:35

    干货!89C51单片机模拟交通灯控制,原理图,仿真程序等完整资料

    是对通行时间做调整,交通管制键是对红绿灯系统进行强制设置。 当系统上电或手动复位之后,默认模式下会按照断电前程序里记录的参数运行。若此时设置键按下,则进入通行时间设置状态,数码管上显示原本记录的时间并闪烁
    发表于 03-14 18:23

    揭秘 “红绿灯倒计时” 原理

    如今,高德“红绿灯倒计时”功能已服务遍布全国范围内近240个城市的8万多个红绿灯路口,未来还将进一步拓展至更高数量级。
    的头像 发表于 02-21 17:19 1788次阅读

    创维液晶电视不开机故障维修方法

    图1是一台送修的创维32寸液晶电视,型号是32L28RM,故障现象是不开机,有时会开机,不开机时红绿灯交替闪烁。
    的头像 发表于 01-26 09:19 2095次阅读
    创维液晶电视不开机故障维修方法

    【飞腾派4G版免费试用】红绿灯项目-2飞腾派 openkylin 进行IO控制2

    | 接上文【飞腾派4G版免费试用】红绿灯项目-2飞腾派 openkylin 进行IO控制
    发表于 01-17 19:46

    【飞腾派4G版免费试用】红绿灯项目-2飞腾派 openkylin 进行IO控制

    接上文[【飞腾派4G版免费试用】2飞腾派 openkylin 进行IO控制-灯闪(https://bbs.elecfans.com/jishu_2405776_1_1.html) 红绿灯项目
    发表于 01-13 22:34

    红绿蓝交替变化的原理

    红绿蓝交替变化是指通过控制红、绿、蓝三原色的不同亮度和混合比例,来呈现出各种不同的颜色效果。这种变化在许多领域都有应用,包括电子显示、照明设计、艺术创作等等。下面将详细介绍红绿蓝交替变化
    的头像 发表于 01-04 09:24 1132次阅读