精华内容
下载资源
问答
  • 交通信号灯的检测与识别

    万次阅读 多人点赞 2018-04-11 09:32:34
    交通信号灯的检测与识别是无人驾驶与辅助驾驶必不可少的一部分,其识别精度直接关乎智能驾驶的安全。一般而言,在实际的道路场景中采集的交通信号灯图像具有复杂的背景,且感兴趣的信号灯区域只占很少的一部分,如下...

    交通信号灯的检测与识别是无人驾驶与辅助驾驶必不可少的一部分,其识别精度直接关乎智能驾驶的安全。一般而言,在实际的道路场景中采集的交通信号灯图像具有复杂的背景,且感兴趣的信号灯区域只占很少的一部分,如下图所示。针对这些难点,国内外的众多研究者提出了相应的解决方案。总的来说,大多基于传统的图像处理方法;但目前也有用强学习能力的卷积神经网络去进行识别,但这类方法往往需要大量的训练样本避免过拟合的风险。截至目前的大多数方法都是在各种颜色空间中利用信号灯颜色的先验进行分割得到兴趣区域,然后再通过信号灯所特有的形状特征和角点特征等进行进一步的判定。比如,Masako Omachi等人提出在RGB色彩空间分割交通信号灯,使用HOUGH变换检测分割出的信号灯所在的圆形区域;徐成等提出在Lab色彩空间分割交通信号灯,使用模板匹配的方法识别交通信号灯的状态;谷明琴等则在HSV色彩空间中使用颜色直方图统计图像的H分量,确定交通信号灯的类型。本博客将基于传统的图像处理算法来进行交通信号灯的识别,重点介绍核心技术。

    这里写图片描述

    正如前面所述,道路场景的多变性与复杂性,使得如何快速、准确地检测与识别交通信号灯,并且有效滤除图像中的干扰区域是交通信号灯检测与识别的关键。在图像处理算法设计中,为了提高算法的准确性与时效性,一般只关注局部感兴趣区域而不是整个图像区域。鉴于此,提出一种基于颜色分割与特征匹配相结合的方法,主要分为如下三个步骤:

    1. 颜色分割

    为了消除噪声,光照等因素的干扰,首先对采集的图像进行直方图均衡化。即:对每一个通道(R,G,B)数据进行直方图均衡化,再合并为一个3通道图像。颜色特征是交通信号灯重要而显著的特征之一。要对交通信号灯进行颜色分割,首先要选择合适的色彩空间。RGB色彩空间中的R、G、B这3个分量之间相关性较高,受光照影响较大,不利于颜色分割。因此,对RGB这3个通道数据进行归一化,即R=R./(R+G+B),G=G./(R+G+B),B=B./(R+G+B)R=R./(R+G+B),G=G./(R+G+B),B=B./(R+G+B);然后,统计了不同环境条件下拍摄的交通信号灯的红色、绿色的R,G,B值,确定交通信号灯的颜色阈值。代码如下

    void CTrafficLightIdentify::segmentImg(Mat& equaled_img, Mat& redMat, Mat& greenMat, Mat& blueMat, Mat& whiteMat)
    {
        Mat square3x3 = Mat(3, 3, CV_8U, cv::Scalar(1));
        Mat diamond = Mat(5, 5, CV_8U, cv::Scalar(1));
        diamond.at<uchar>(0, 0) = 0;
        diamond.at<uchar>(0, 1) = 0;
        diamond.at<uchar>(1, 0) = 0;
        diamond.at<uchar>(4, 4) = 0;
        diamond.at<uchar>(3, 4) = 0;
        diamond.at<uchar>(4, 3) = 0;
        diamond.at<uchar>(4, 0) = 0;
        diamond.at<uchar>(4, 1) = 0;
        diamond.at<uchar>(3, 0) = 0;
        diamond.at<uchar>(0, 4) = 0;
        diamond.at<uchar>(0, 3) = 0;
        diamond.at<uchar>(1, 4) = 0;
    
        redMat = Mat::zeros(m_inMat.rows, m_inMat.cols, CV_8UC1);
        greenMat = Mat::zeros(m_inMat.rows, m_inMat.cols, CV_8UC1);
        whiteMat = Mat::zeros(m_inMat.rows, m_inMat.cols, CV_8UC1);
        blueMat = Mat::zeros(m_inMat.rows, m_inMat.cols, CV_8UC1);
        yelloMat = Mat::zeros(m_inMat.size(), CV_8UC1);
    
        Mat hsvMat;
        cvtColor(m_inMat, hsvMat, CV_BGR2HSV);
    
        int colorH, colorS, colorV;
        int colorB, colorG, colorR;
        float fsumBGR, fRG, fGB, fG, fH, fS;
        bool flagYello;
        unsigned char* outyelloData = (unsigned char*)yelloMat.data;
        unsigned char* outblueData = (unsigned char*)blueMat.data;
        unsigned char* outwhiteData = (unsigned char*)whiteMat.data;
        unsigned char* outredData = (unsigned char*)redMat.data;
        unsigned char* outgreenData = (unsigned char*)greenMat.data;
        unsigned char* rowHSVImgData;
        unsigned char* rowBGRImgData;
        for (int i = 0; i < m_inMat.rows; i++)
        {
            rowHSVImgData = hsvMat.ptr<unsigned char>(i);
            rowBGRImgData = m_inMat.ptr<unsigned char>(i);
            for (int j = 0; j < m_inMat.cols; j++)
            {
                colorH = rowHSVImgData[3 * j];
                colorS = rowHSVImgData[3 * j + 1];
                colorV = rowHSVImgData[3 * j + 2];
    
                colorB = rowBGRImgData[3 * j];
                colorG = rowBGRImgData[3 * j + 1];
                colorR = rowBGRImgData[3 * j + 2];
    
                fH = (float)colorH / 180.0;
                fS = (float)colorS / 255.0;
    
                fsumBGR = colorB + colorG + colorR;
                fRG = (colorR - colorG) / fsumBGR;
                fGB = (colorG - colorB) / fsumBGR;
                fG = colorG / fsumBGR;
    
                if ((fH >= 0.05 && fH <= 0.2) && (fS >= 0.7))
                    *outyelloData = 255;
                if (colorH >= 100 && colorH <= 124 && colorS >= 80 && colorV >= 65)
                    *outblueData = 255;
                if (colorB > 230 && colorG > 230 && colorR > 230) 
                    (*outwhiteData) = 255;
    
                if (fRG > 0.16 && fGB < 0.08 && fG < 0.30 && ((colorH>=0&& colorH<=15)|| (colorH >= 140 && colorH <= 180))) {
                    (*outredData) = 255;
                }
                if (fRG < -0.1 && fGB > 0.002 && fG > 0.08 && (colorH >= 40 && colorH <= 80)) {
                    (*outgreenData) = 255;
                }
    
                outyelloData++;
                outblueData++;
                outwhiteData++;
                outredData++;
                outgreenData++;
            }
        }
        morphologyEx(yelloMat, yelloMat, MORPH_OPEN, square3x3);
        morphologyEx(yelloMat, yelloMat, MORPH_CLOSE, diamond);
    
        morphologyEx(whiteMat, whiteMat, MORPH_OPEN, square3x3);
        morphologyEx(whiteMat, whiteMat, MORPH_CLOSE, diamond);
    
        morphologyEx(redMat, redMat, MORPH_OPEN, square3x3);
        morphologyEx(redMat, redMat, MORPH_CLOSE, diamond);
    
        morphologyEx(greenMat, greenMat, MORPH_OPEN, square3x3);
        morphologyEx(greenMat, greenMat, MORPH_CLOSE, diamond);
    
        morphologyEx(blueMat, blueMat, MORPH_OPEN, square3x3);
        morphologyEx(blueMat, blueMat, MORPH_CLOSE, diamond);
    }

    那么得到的红色分割图像redMat,和绿色分割图像greeMat如下图所示
    这里写图片描述

    2. 感兴趣区域提取

    该步骤的主要目的为对分割的红色通道图像和绿色通道图像,进行联通区域的标定,并提取区域的基本几何特征,比如长度,宽度,长宽比,面积(即白色像素个数)。

    3. 信号灯区域判定与识别

    该步骤在前一步骤的基础上根据信号灯的特有特征过滤出真正的信号灯区域。本技术使用了3个先验知识:信号灯面积;信号灯形状;信号灯的黑色边框。

    • 信号灯面积
      本技术设置的上下限是10,200;可根据实际情况进行设定,过滤面积过大或过小区域。
    • 信号灯形状
      形状特征是交通信号灯重要而显著的另一特征,尽管气候、道路环境等会对采集的交通信号灯产生不同程度的噪声、褪色及形变,但是交通信号灯的形状和几何尺寸不会发生太大的变化。对于圆形交通信号灯使用圆形度检测,过滤圆形度过低的区域,其中圆形度是指候选区域边缘接近圆形的程度 。圆度的定义为CircleMetric=/CircleMetric=潜在白色区域面积/外接矩形框面积,该值如果为0.785,则为圆形;设置的阈值为0.5。
    • 信号灯的黑色边框
      交通信号灯在形状上有个显著的特征,即它的灯板是一个黑色矩形框。根据交通信号灯的设计规范,利用该特征可以将交通信号灯的范围提取出来。本技术采用了SVM分类器,进行识别。
      a. 首先根据一些训练图像建立黑色边框正样本,即在工程中用鼠标框住黑色灯框,在该区域内提取颜色直方图;重复操作,得到正样本集;同样的道理,我们在训练图像中其它区域提取负样本集;最后在颜色直方图的特征空间中学习出分割超平面。其中颜色直方图特征提取如下:

      void CTrafficLightIdentify::calcMatROIHist(Mat& inMat, Rect rectROI, MatND& hisMat)
      {
      if (inMat.channels() != 3)
      {
          AfxMessageBox(_T("请输入3通道彩色图像"));
          return;
      }
      Mat img_roi = inMat(rectROI).clone();
      resize(img_roi, img_roi, Size(64, 48));
      Mat result;
      cvtColor(img_roi, result, CV_BGR2HSV);
      MatND histM;
      // Quantize the hue to 30 levels
      // and the saturation to 32 levels
      int hbins = 30, sbins = 32;
      int histSize[] = { hbins, sbins };
      // hue varies from 0 to 179, see cvtColor
      float hranges[] = { 0, 180 };
      // saturation varies from 0 (black-gray-white) to
      // 255 (pure spectrum color)
      float sranges[] = { 0, 256 };
      const float* ranges[] = { hranges, sranges };
      // we compute the histogram from the 0-th and 1-st channels
      int channels[] = { 0, 1 };
      calcHist(&result, 1, channels, Mat(), // do not use mask
          histM, 2, histSize, ranges,
          true, // the histogram is uniform
          false);
      normalize(histM, histM);  //L2 normalization
      hisMat = histM.reshape(0, 1);
      }

      b. 在识别前加载训练好的SVM文件,而后在之前检测出的白色连通区域的上下位置提取一定大小无重叠区域,在该区域内提取颜色直方图特征;
      c. 根据该颜色直方图特征,根据训练的分割超平面预测其类别;
      d. 如果是,则白色区域可进一步判定为信号灯区域;若不是,则过滤掉该区域。
      最终的识别图如下
      这里写图片描述
      最终的工程界面如图

    如果在redMat 中有筛选出的白色区域,则该信号灯为红灯;在greeMat中则为同样的道理。后续的方案将考虑使用表示能力更鲁棒的特征描述子,甚至基于卷积神经网络的深度学习方法。

    上述框架虽然能达到一定的识别率,但是依然面临两个严峻的挑战:

    • 对视频处理的实时性较差。上述框架对ROI的提取算法涉及到对整个图像的遍历;并且对视频的每一帧进行独立处理,没有考虑帧与帧之间的相关性。
    • 处理不同场景的迁移性较差。上述框架主要基于SVM分类器,而这种传统的机器学习模型的性能主要依赖于训练数据和提取的人工特征。目前的训练数据有限,不能完全表征整个真实数据的分布,导致在其它场景漏检或误检较多;当前的特征主要基于颜色直方图特征,该特征对图像数据较为敏感。比如采用不同的成像传感器或当前采集图像出现极端天气,提取的颜色直方图特征都会给后续的分类器带来误判。

    针对上述挑战,对现有框架进行了改进,设计了交通信号灯识别的自主式学习系统来应对实时性和迁移性差的问题。

    展开全文
  • 基于深度神经网络的交通灯检测算法研究与实现,张逸凡,傅慧源,交通灯检测技术是自动驾驶系统重要组成部分,但是传统方法的交通灯检测技术存在准确率低,算法速度慢等弊端。基于深度神经网络
  • 针对现有交通控制系统无法实现信号故障自主检测与报警缺陷,提出一种交通信号故障检测系统设计方案。该系统通过采集信号电流信息监控其工作状态,并采集信号机控制信号,对不同优先级信号故障进行逻辑...
  • 基于51单片机的交通灯控制系统设计

    万次阅读 多人点赞 2018-11-24 13:38:11
    交通灯是生活中重要系统。本设计为基于51单片机交通灯系统设计,采用模块化、层次化设计。运用单片机AT89C51进行数据分析和处理,为显示提供信号,显示部分采用8位数码管显示倒计时值。系统电路简单、集成度高...

    第一章 硬件设计与原理
    以AT89C51单片机为核心,起着控制作用。系统包括数码管显示电路、复位电路、时钟电路、发光二级管电路和按键电路。设计思路分为六个模块:复位电路、晶振电路模块、AT89C51、数码管显示电路、发光二级管电路和按键电路这六个模块。

    在这里插入图片描述

    1.2 硬件设计分析
    1.2.1 电源的设计
    系统电源使用直流5伏。
    由电脑USB接口提供电源。
    USB是通用串行总线(Universal Serial Bus)接口的简称。它是目前使用比较广泛的电脑接口之一,主要版本有1.0、1.1和最新的2.0三种版本。根据USB总线的工业标准,它可以提供额定功率为5V/500mA的电源供USB设备使用。
    1.2.2 单片机最小系统
    51单片机是对目前所有兼容intel 8031指令系统的单片机的统称。该系列单片机的始祖是intel的8031单片机,后来随着技术的发展,成为目前广泛应用的8为单片机之一。单片机是在一块芯片内集成了CPU、RAM、ROM、定时器/计数器和多功能I/O口等计算机所需要的基本功能部件的大规模集成电路,又称为MCU。51系列单片机内包含以下几个部件:
    一个8位CPU;一个片内振荡器及时钟电路;
    4KB的ROM程序存储器;
    一个128B的RAM数据存储器;
    寻址64KB外部数据存储器和64KB外部程序存储空间的控制电路;
    32条可编程的I/O口线;
    两个16位定时/计数器;
    一个可编程全双工串行口;
    5个中断源、两个优先级嵌套中断结构。
    如图1-2-1所示为AT89C51单片机基本构造,其基本性能介绍如下:
    图1-2-1 AT89C51单片机

    AT89C51本身内含40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中端口,3个16位可编程定时计数器,2个全双工串行通信口,STC89C51RC可以按照常规方法进行编程,但不可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。
    AT89C51的主要特性如下表所示:

    在这里插入图片描述

    AT89C51为40脚双列直插封装的8位通用微处理器,采用工业标准的C51内核,在内部功能及管脚排布上与通用的8xc52相同,其主要用于会聚调整时的功能控制。功能包括对会聚主IC内部寄存器、数据RAM及外部接口等功能部件的初始化,会聚调整控制,会聚测试图控制,红外遥控信号IR的接收解码及与主板CPU通信等。主要管脚有:XTAL1(19脚)和XTAL2(18脚)为振荡器输入输出端口,外接12MHz 晶振。RST/Vpd(9脚)为复位输入端口,外接电阻电容组成的复位电路。VCC(40脚)和VSS(20脚)为供电端口,分别接+5V电源的正负端。P0~P3 为可编程通用I/O脚,其功能用途由软件定义,在本设计中,P0端口(32~39脚)被定义为N1功能控制端口,分别与N1的相应功能管脚相连接,13脚定义为IR输入端,10脚和11脚定义为I2C总线控制端口,分别连接N1的SDAS(18脚)和SCLS(19脚)端口,12脚、27脚及28脚定义为握手信号功能端口,连接主板CPU的相应功能端,用于当前制式的检测及会聚调整状态进入的控制功能。
    P0口:P0口是一组8位漏极开路型双向I/O 口,也即地址/数据总线复用口。作为输出口用时,每位能吸收电流的方式驱动8个TTL逻辑门电路,对端口P0写“1”时,可作为高阻抗输入端用。在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。在Flash 编程时,P0口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。
    P1口:P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。与AT89C51不同之处是,P1.0和P1.1还可分别作为定时/计数器2 的外部计数输入(P1.0/T2)和输入(P1.1/T2EX)。Flash编程和程序校验期间,P1接收低8位地址。
    P2口:P2是一个带有内部上拉电阻的8 位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口P2写“1”,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(IIL)。在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX @DPTR指令)时,P2口送出高8位地址数据。在访问8位地址的外部数据存储器(如执行MOVX @RI指令)时,P2口输出P2锁存器的内容。Flash编程或校验时,P2亦接收高位地址和一些控制信号。
    P3口:P3口是一组带有内部上拉电阻的8位双向I/O口。P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对P3口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。此时,被外部拉低的P3口将用上拉电阻输出电流(IIL)。P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能P3口还接收一些用于Flash 闪速存储器编程和程序校验的控制信号。
    RST:复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。
    ALE/PROG:当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个AL脉冲。对Flash存储器编程期间,该引脚还用于输入编程脉冲(PROG)。如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。该位置位后,只有一条 MOVX 和MOVC指令才能将ALE激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE禁止位无效。
    PSEN:程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89C51由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲。在此期间,当访问外部数据存储器,将跳过两次PSEN信号。
    EA/VPP:外部访问允许。欲使CPU仅访问外部程序存储器(地址为0000H—FFFFH),EA端必须保持低电平(接地)。需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。如EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。Flash存储器编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压Vpp。
    XTAL1:振荡器反相放大器的及内部时钟发生器的输入端。
    XTAL2:振荡器反相放大器的输出端。
    单片机最小原理图如图1-2-2所示。
    图1-2-2 单片机最小系统

    单片机最小系统说明:
    时钟信号的产生:在MCS-51芯片内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,其输出端为引脚XTAL2。而在芯片的外部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激振荡器,这就是单片机的时钟振荡电路。
    时钟电路产生的振荡脉冲经过触发器进行二分频之后,才成为单片机的时钟脉冲信号。
    一般地,电容C2和C3取30pF左右,晶体的振荡频率范围是1.2-12MHz。如果晶体振荡频率高,则系统的时钟频率也高,单片机的运行速度也就快。
    单片机复位使CPU和系统中的其他功能部件都处在一个确定的初始状态下,并从这个状态开始工作。单片机复位条件:必须使9脚加上持续两个机器周期(即24个振荡周期)的高电平。
    1.2.3 显示系统
    数码管是一种半导体发光器件,其基本单元是发光二极管。
    数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,相应字段就不亮。
    数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。
    1) 静态显示驱动:静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动(要知道一个89C51单片机可用的I/O端口才32个呢),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。
    2) 动态显示驱动:数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。
    本设计中数码管采用的是动态驱动方式。
    数码管外形如图1-2-3,数码管电路结构如图1-2-4。

    图1-2-3 数码管外形图
    图1-2-4 数码管电路结构示意图

    在这里插入图片描述
    图1-2-5 数码管显示电路
    1.2.4 发光二级管电路

    图1-2-6 发光二级管电路
    1.2.5 按键电路
    图1-2-7 按键电路

    第二章 软件设计与分析
    2.1 软件设计的组成
    该系统由延时子函数、数码管显示子函数、定时器0中断子函数、主函数和数据定义这几部分组成。
    在这里插入图片描述

    在这里插入图片描述

    //----------------------------------------------------------------------//
    上传过程感觉繁琐,里面可能有不全面的地方,请见谅。下面的是实现的目的。以及电路原理图

    **本次设计的主要目的是设计一个城市十字路口的交通灯控制系统,设计中将交通灯控制系统分为东西方向(主干道)和南北方向(次干道)两个方向,且在东西南北四个路口的每个路口设置红、绿、黄三个交通信号灯(用发光二极管模拟)和一个二位的LED数码显示管。设计的要求是规定在每一段时间内东西和南北两个方向中只有一个方向能够通行,另一个方向处于禁行状态,然后在经过一段时间后,禁行的方向和通行的方向互相转换状态,原来通行的状态变禁行状态,原来禁行的状态变为通行状态,如此循环下去。详细过程如下图2-1:
    状态① 状态②
    图 1图2-1 交通灯状态图
    状态①:东西方向的交通灯黄灯闪烁3秒后,红灯熄灭,绿灯点亮(东西方向允许车辆和行人通行),同时南北方向绿灯熄灭,红灯点亮(南北方向禁止车辆和行人通行),LED数码管倒计时显示40秒,在倒计时3秒时进入状态②。
    状态②:南北方向黄灯闪烁3秒后,红灯熄灭绿灯点亮(南北允许车辆和行人通行);同时东西方向绿灯熄灭,红灯点亮
    (东西方向禁止车辆和行人通行),LED数码管倒计时显示40秒,在倒计时3秒时进入状态①。
    接下来在没有人为干涉下将会一直按照上述进行循环。设计中还外设6个按键实现对交通灯控制系统的调控作用。

    电路原理图

    在这里插入图片描述

    在这里插入图片描述

    //——————————————————————————-——————————//
    相应的代码已经上传

    下载地址
    https://download.csdn.net/download/weixin_43442020/12231456

    下载链接里可以下载,解压后里面有压缩文件,压缩文件里面的资料更详细

    展开全文
  • 基于opencv红绿灯检测(python)

    千次阅读 2020-10-22 21:08:49
    交通信号灯的检测与识别是无人驾驶与辅助驾驶必不可少的一部分,其识别精度直接关乎智能驾驶的安全。一般而言,在实际的道路场景中采集的交通信号灯图像具有复杂的背景,且感兴趣的信号灯区域只占很少的一部分。针对...

    基于opencv的红绿灯检测(python)

    目录

    基于opencv的红绿灯检测(python)

    背景

    1、导入相关库

    2、数据集的准备与读取

    3、数据可视化

     3、图像标准化输入和输出

     4、代码测试

    5、进行图像特征提取

    6、选择图像进行测试

    7、验证测试集图像准确率

    致谢


    背景

    交通信号灯的检测与识别是无人驾驶与辅助驾驶必不可少的一部分,其识别精度直接关乎智能驾驶的安全。一般而言,在实际的道路场景中采集的交通信号灯图像具有复杂的背景,且感兴趣的信号灯区域只占很少的一部分。针对这些难点,国内外的众多研究者提出了相应的解决方案。总的来说,大多基于传统的图像处理方法;但目前也有用强学习能力的卷积神经网络去进行识别,但这类方法往往需要大量的训练样本避免过拟合的风险。截至目前的大多数方法都是在各种颜色空间中利用信号灯颜色的先验进行分割得到兴趣区域,然后再通过信号灯所特有的形状特征和角点特征等进行进一步的判定。比如,Masako Omachi等人提出在RGB色彩空间分割交通信号灯,使用HOUGH变换检测分割出的信号灯所在的圆形区域;徐成等提出在Lab色彩空间分割交通信号灯,使用模板匹配的方法识别交通信号灯的状态;谷明琴等则在HSV色彩空间中使用颜色直方图统计图像的H分量,确定交通信号灯的类型。本项目将基于传统的图像处理算法来进行交通信号灯的识别,重点介绍核心技术。

    正如前面所述,道路场景的多变性与复杂性,使得如何快速、准确地检测与识别交通信号灯,并且有效滤除图像中的干扰区域是交通信号灯检测与识别的关键。在图像处理算法设计中,为了提高算法的准确性与时效性,一般只关注局部感兴趣区域而不是整个图像区域。鉴于此,提出一种基于颜色分割与特征匹配相结合的方法,主要分为如下三个步骤:

    1) 颜色分割

    为了消除噪声,光照等因素的干扰,首先对采集的图像进行直方图均衡化。即:对每一个通道(R,G,B)数据进行直方图均衡化,再合并为一个3通道图像。颜色特征是交通信号灯重要而显著的特征之一。要对交通信号灯进行颜色分割,首先要选择合适的色彩空间。RGB色彩空间中的R、G、B这3个分量之间相关性较高,受光照影响较大,不利于颜色分割。因此,对RGB这3个通道数据进行归一化,即R=R./(R+G+B),G=G./(R+G+B),B=B./(R+G+B),然后,统计了不同环境条件下拍摄的交通信号灯的红色、绿色的R,G,B值,确定交通信号灯的颜色阈值。

    2) 感兴趣区域提取

    该步骤的主要目的为对分割的红色通道图像和绿色通道图像,进行联通区域的标定,并提取区域的基本几何特征,比如长度,宽度,长宽比,面积(即白色像素个数)。

    3) 信号灯区域判定与识别

    该步骤在前一步骤的基础上根据信号灯的特有特征过滤出真正的信号灯区域。本技术使用了3个先验知识:信号灯面积;信号灯形状;信号灯的黑色边框。

    这篇博客介绍的是通过色彩空间识别交通灯。

    1、导入相关库

    import cv2
    import os
    import glob
    import random
    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.image as mpimg
    %matplotlib inline

    import cv2:导入opencv相关库。

    import os:我们在python下写程序,需要对文件以及文件夹或者其他的进行一系列的操作。但是,我们怎么在python中对文件进行操作呢?这就引入了os模块了。

    import glob:glob是python自带的一个文件操作相关模块,用它可以查找符合自己目的文件。

    import random:随机模块

    import numpy as np:numpy科学数据库

    import matplotlib.pyplot as plt:画图所需的matplotlib。

    import matplotlib.image as mpimg:用mpimg导入图片得到的即为三通道数组,直接用plt显示即可。

    %matplotlib inline: 可以在编译器里直接使用,功能是可以内嵌绘图,并且可以省略掉plt.show()这一步。

    2、数据集的准备与读取

    数据采用的是MIT自动驾驶课程的图像,总共三类:红绿黄,1187张图片,其中,723张红色交通灯图片,429张绿色交通灯图片,35张黄色交通灯图片,图片分为测试集和训练集。

    图像数据集链接

    获取数据集地址:

    # Image data directories
    IMAGEDIR_TRAINING = "E:\\car\\traffic_light_classify-master\\traffic_light_classify-master\\traffic_light_images\\training\\"
    IMAGE_DIR_TEST = "E:\\car\\traffic_light_classify-master\\traffic_light_classify-master\\traffic_light_images\\test\\"

     加载图像数据及图像标签

    image_dir:图像存储位置的说明

    #load data
    def load_dataset(image_dir):
        im_list =[]
        image_types= ['red','yellow','green']
        #遍历每个颜色文件夹
        for im_type in image_types:
            file_lists = glob.glob(os.path.join(image_dir,im_type,'*'))
            print(len(file_lists))
            for file in file_lists:
                im = mpimg.imread(file)
                if not im is None:
                    im_list.append((im,im_type))
        return im_list
    IMAGE_LIST = load_dataset(IMAGEDIR_TRAINING)

    glob.glob();返回所有匹配的文件路径列表(list);该方法需要一个参数用来指定匹配的路径字符串(字符串可以为绝对路径也可以为相对路径),其返回的文件名只包括当前目录里的文件名,不包括子文件夹里的文件。

    os.path.join()函数:连接两个或更多的路径名组件

    结果:

    723
    35
    429

    3、数据可视化

    第2部分已经进行了数据的读取,第三部分将用于查看并显示图像,并且为图像添加标题和标注。

    fig,ax = plt.subplots(1,3,figsize=(5,2))
    #red
    img_red = IMAGE_LIST[0][0]
    ax[0].imshow(img_red)
    ax[0].annotate(IMAGE_LIST[0][1],xy=(2,5),color='blue',fontsize='10')
    ax[0].axis('off')
    ax[0].set_title(img_red.shape,fontsize=10)
    #yellow
    img_yellow= IMAGE_LIST[724][0]
    plt.imshow(img_yellow)
    ax[1].imshow(img_yellow)
    ax[1].annotate(IMAGE_LIST[730][1],xy=(2,5),color='yellow',fontsize='10')
    ax[1].axis('off')
    ax[1].set_title(img_yellow.shape,fontsize=10)
    #green
    img_green= IMAGE_LIST[800][0]
    plt.imshow(img_green)
    ax[2].imshow(img_green)
    ax[2].annotate(IMAGE_LIST[800][1],xy=(2,5),color='green',fontsize='10')
    ax[2].axis('off')
    ax[2].set_title(img_green.shape,fontsize=10)
    plt.show()

     .annotate:给图像进行标注

    .set_title:给图像设计标题

    结果:

     3、图像标准化输入和输出

    • 调整图像大小为32x32x3
    • one_hot编码:red:[1,0,0],yellow:[0,1,0],green:[0,0,1]

    代码通过几个函数实现:

    def standardize(image_list):
        standard_list = []
        #Iterate through all the image-label pairs
        for item in image_list:
            image = item[0]
            label = item[1]
            standardized_im = standardize_input(image)
            one_hot_label = one_hot_encode(label)
            standard_list.append((standardized_im,one_hot_label))
        return standard_list
    def standardize_input(image):
        #Resize all images to be 32x32x3
        standard_im = cv2.resize(image,(32,32))
        return standard_im
    def one_hot_encode(label):
        if label=='red':
            return [1,0,0]
        elif label=='yellow':
            return [0,1,0]
        else:
            return [0,0,1]

     4、代码测试

    实现完了上述标准化代码后,我们需要进一步确定我们的代码是正确的,因此接下来我们可以实现一个函数来实现上述代码功能的检验,Python中有一个自带的单元测试框架是unittest模块,用它来做单元测试,它里面封装好了一些校验返回的结果方法和一些用例执行前的初始化操作。

    关于unittest介绍可以参考链接博客https://www.cnblogs.com/feng0815/p/8045850.html

    import unittest
    from IPython.display import Markdown,display
    def printmd(string):
        display(Markdown(string))
    def print_fail():
        printmd('<span style=="color: red;">Test Failed</span>')
    def print_pass():
        printmd('<span style="color:green;">Test Passed</span>')
    class Tests(unittest.TestCase):
        def test_one_hot(self,one_hot_function):
            try:
                self.assertEqual([1,0,0],one_hot_function('red'))
                self.assertEqual([0,1,0],one_hot_function('yellow'))
                self.assertEqual([0,0,1],one_hot_function('green'))
            except self.failureException as e:
                print_fail()
                print('Your function did not return the excepted one-hot label')
                print('\n'+str(e))
                return
            print_pass()
        def test_red_aa_green(self,misclassified_images):
            #Loop through each misclassified image and the labels
            for im,predicted_label,true_label in misclassified_images:
                if(true_label==[1,0,0]):
                    try:
                        self.assertNotEqual(true_label,[0,1,0])
                    except self.failureException as e:
                        print_fail()
                        print('Warning:A red light is classified as green.')
                        print('\n'+str(e))
                        return
            print_pass()
    tests = Tests()
    tests.test_one_hot(one_hot_encode)

    结果

    Test Passed

    测试通过过后进行标准化输入与输出:

    Standardized_Train_List = standardize(IMAGE_LIST)

    5、进行图像特征提取

    • 将彩色RGB空间转换为HSV空间,并且进行显示
    #Visualize
    image_num = 0
    test_im = Standardized_Train_List[image_num][0]
    test_label = Standardized_Train_List[image_num][1]
    #convert to hsv
    hsv = cv2.cvtColor(test_im, cv2.COLOR_RGB2HSV)
    # Print image label
    print('Label [red, yellow, green]: ' + str(test_label))
    h = hsv[:,:,0]
    s = hsv[:,:,1]
    v = hsv[:,:,2]
    # Plot the original image and the three channels
    fig,ax = plt.subplots(1,4,figsize=(20,10))
    ax[0].imshow(test_im)
    ax[0].set_title('Standardized image')
    ax[1].imshow(h,cmap='gray')
    ax[1].set_title('H channel')
    ax[2].set_title('S channel')
    ax[2].imshow(s, cmap='gray')
    ax[3].set_title('V channel')
    ax[3].imshow(v, cmap='gray')

    结果:从图像结果来看读取的是一张红灯图像,对应的Label:

    Label [red, yellow, green]: [1, 0, 0]

     

     也可以测试绿灯:对应的Label:

    Label [red, yellow, green]: [0, 0, 1]

    • HSV色彩空间特征提取

    在图像处理中使用较多的是 HSV 颜色空间,它比 RGB 更接近人们对彩色的感知经验。非常直观地表达颜色的色调、鲜艳程度和明暗程度,方便进行颜色的对比。在 HSV 颜色空间下,比 BGR 更容易跟踪某种颜色的物体,常用于分割指定颜色的物体。HSV 表达彩色图像的方式由三个部分组成:

    • Hue(色调、色相):是色彩的基本属性,就是平常所说的颜色名称,如红色、黄色等。
    • Saturation(饱和度、色彩纯净度):是指色彩的纯度,越高色彩越纯,低则逐渐变灰,取0-100%的数值。
    • Value(明度):取0-100%。

    1. 求图像的平均亮度
    def create_feature(rgb_image):
        hsv = cv2.cvtColor(rgb_image,cv2.COLOR_RGB2HSV)
        sum_brightness = np.sum(hsv[:,:,2])
        area = 3232
        avg_brightness = sum_brightness / area#Find the average
        return avg_brightness

    2、求色彩饱和度

    def high_saturation_pixels(rgb_image,threshold=80):
        high_sat_pixels = []
        hsv = cv2.cvtColor(rgb,cv2.COLOR_RGB2HSV)
        for i in range(32):
            for j in range(32):
                if hsv[i][j][1] > threshold:
                    high_sat_pixels.append(rgb_image[i][j])
        if not high_sat_pixels:
            return highest_sat_pixel(rgb_image)
        sum_red = 0
        sum_green = 0
        for pixel in high_sat_pixels:
            sum_red+=pixel[0]
            sum_green+=pixel[1]
        avg_red = sum_red / len(high_sat_pixels)
        avg_green = sum_green / len(high_sat_pixels)*0.8
        return avg_red,avg_green
    def highest_sat_pixel(rgb_image):
        hsv = cv2.cvtColor(rgb_image,cv2.COLOR_RGB2HSV)
        s = hsv[:,:,1]
     
        x,y = (np.unravel_index(np.argmax(s),s.shape))
        if rgb_image[x,y,0] > rgb_image[x,y,1]*0.9:
            return 1,0 #red has a higher content
        return 0,1
    def estimate_label(rgb_image,display=False):
        return red_green_yellow(rgb_image,display)
    def findNoneZero(rgb_image):
        rows=rgb_image.shape[0]
        cols=rgb_image.shape[1]
        counter = 0
        for row in range(rows):
            for col in range(cols):
                pixels = rgb_image[row,col]
                if sum(pixels)!=0:
                    counter = counter+1
        return counter

    3、确定红色、黄色、绿色的阈值

    使用HSV和实验确定每张图像中的红、绿、黄内容确定阈值。返回基于值的分类。

    这里是通过利用HSV色彩空间对图像进行算数操作:

    cv2.bitwise_and() 函数:

    cv2.bitwise_and()是对二进制数据进行“与”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“与”操作,1&1=1,1&0=0,0&1=0,0&0=0

    OutputArray dst  = cv2.bitwise_and(InputArray src1, InputArray src2, InputArray mask=noArray());//dst = src1 & src2
    

    利用掩膜(mask)进行“与”操作,即掩膜图像白色区域是对需要处理图像像素的保留,黑色区域是对需要处理图像像素的剔除,其余按位操作原理类似只是效果不同而已

    def red_green_yellow(rgb_image,display):
        '''
        Determines the red , green and yellow content in each image using HSV and experimentally
        determined thresholds. Returns a Classification based on the values
        '''
        hsv = cv2.cvtColor(rgb_image,cv2.COLOR_RGB2HSV)
        sum_saturation = np.sum(hsv[:,:,1])# Sum the brightness values
        area = 3232
        avg_saturation = sum_saturation / area #find average
     
        sat_low = int(avg_saturation*1.3)#均值的1.3倍
        val_low = 140
        #Green
        lower_green = np.array([70,sat_low,val_low])
        upper_green = np.array([100,255,255])
        green_mask = cv2.inRange(hsv,lower_green,upper_green)
        green_result = cv2.bitwise_and(rgb_image,rgb_image,mask = green_mask)
        #Yellow
        lower_yellow = np.array([10,sat_low,val_low])
        upper_yellow = np.array([60,255,255])
        yellow_mask = cv2.inRange(hsv,lower_yellow,upper_yellow)
        yellow_result = cv2.bitwise_and(rgb_image,rgb_image,mask=yellow_mask)
        # Red 
        lower_red = np.array([150,sat_low,val_low])
        upper_red = np.array([180,255,255])
        red_mask = cv2.inRange(hsv,lower_red,upper_red)
        red_result = cv2.bitwise_and(rgb_image,rgb_image,mask = red_mask)
        if display==True:
            fig,ax = plt.subplots(1,5,figsize=(20,10))
            ax[0].set_title('rgb image')
            ax[0].imshow(rgb_image)
            ax[1].set_title('red result')
            ax[1].imshow(red_result)
            ax[2].set_title('yellow result')
            ax[2].imshow(yellow_result)
            ax[3].set_title('green result')
            ax[3].imshow(green_result)
            ax[4].set_title('hsv image')
            ax[4].imshow(hsv)
            plt.show()
        sum_green = findNoneZero(green_result)
        sum_red = findNoneZero(red_result)
        sum_yellow = findNoneZero(yellow_result)
        if sum_red >= sum_yellow and sum_red>=sum_green:
            return [1,0,0]#Red
        if sum_yellow>=sum_green:
            return [0,1,0]#yellow
        return [0,0,1]#green

    6、选择图像进行测试

    img_test = [(img_red,'red'),(img_yellow,'yellow'),(img_green,'green')]
    standardtest = standardize(img_test)
    for img in standardtest:
        predicted_label = estimate_label(img[0],display = True)
        print('Predict label :',predicted_label)
        print('True label:',img[1])

    结果:

    7、验证测试集图像准确率

    关于准确的验证流程主要包括:加载测试集、标准化输入输出测试集、对测试集图像进行混洗、遍历所有测试图像对每个图像进行分类,并与真实的标签进行比较,从分类器获得预测的标签,比较真实标签和预测标签,最后计算出图像准确率。

    针对于部分函数,建议读者去查阅相关资料,应该也不是很难。

    code:

    TEST_IMAGE_LIST = load_dataset(IMAGE_DIR_TEST)
    STANDARDIZED_TEST_LIST = standardize(TEST_IMAGE_LIST)
    random.shuffle(STANDARDIZED_TEST_LIST)
    
    def get_misclassified_images(test_images,display=False):
        misclassified_images_labels = []
        for image in test_images:
            im = image[0]
            true_label = image[1]
            assert (len(true_label)==3),'This true_label is not the excepted length (3).'
            predicted_label = estimate_label(im,display=False)
            assert(len(predicted_label)==3),'This predicted_label is not the excepted length (3).'
            if(predicted_label!=true_label):
                misclassified_images_labels.append((im,predicted_label,true_label))
        return misclassified_images_labels
    MISCLASSIFIED = get_misclassified_images(STANDARDIZED_TEST_LIST,display=False)
    total = len(STANDARDIZED_TEST_LIST)
    num_correct = total-len(MISCLASSIFIED)
    accuracy = num_correct / total
    print('Accuracy:'+str(accuracy))
    print('Number of misclassfied images = '+str(len(MISCLASSIFIED))+' out of '+str(total))

    测试集图像结果:

    181
    9
    107
    Accuracy:0.9090909090909091
    Number of misclassfied images = 27 out of 297

    完整代码链接:红绿灯检测代码

    致谢

    红绿灯检测应用

    转 opencv红绿灯检测

    https://blog.csdn.net/weixin_41115751/article/details/84568029

    展开全文
  • 交通灯控制器控制两个主干道交叉路口交通,路口车辆多,直行信号、左转弯信号分开显示,a,b两个主干道通行时间相等,其中指示直行绿灯亮30 s,指示左转弯绿灯亮12 s,绿灯变至红灯时,黄灯亮3 s,以便于...
  • 在单片自动实时检测和控制应用单片机通常是一个核心组成部分,但仅仅控制和改进单片机是不够,因为软件和硬件被纳入一个具体硬件结构。 十字路口车水马龙,很多汽车经过十字路口,车辆在机动车道里行驶,人们在...
  • 交通信号灯的检测与识别是无人驾驶与辅助驾驶必不可少的一部分,其识别精度直接关乎智能驾驶的安全。一般而言,在实际的道路场景中采集的交通信号灯图像具有复杂的背景,且感兴趣的信号灯区域只占很少的一部分。针对...
  • 交通信号状态监测技术是道路交通信号控制关键技术之一,直接关系到道路交通的安全与通畅。文中介绍了一种新型多路交通信号状态监测方法。该方法基于互感检测原理,根据互感器次级输出电流,经信号调理电路处理...
  • 可以比较合理高效的完成交通灯的设计。软件上基于C语言进行开发,整体的设计思路选择模块化的设计思路。把时间控制、数码管控制和案件检测等几个功能分别实现,再统一整合到一个工程中去。可以较为高效和提高程序的...
  •  本次设计为十字路口交通灯控制系统设计,红绿黄灯按指定时序按不同时间循环点亮,并可实现主从道模式和普通模式的检测与转换,智能、安全、高效的指挥交通秩序。  本交通灯系统硬件部分以89C52单片机为核心控制器...
  • 在如今城市中,人口和汽车日益怎张,市区交通也日益拥挤,人们的安全问题也日益...本文主要介绍了该交通灯控制器的设计思路、原理和方法,仿真和实际测试、分析,设计心得体会以及竞争-冒险现象的检测和排除等内容。
  • 本设计就是采用单片机模拟十字路口交通灯的各种状态显示以及倒计时时间。 本设计系统由单片机I/O口扩展系统、交通灯状态显示系统、LED数码显示系统、复位电路等几大部分组成。系统除基本的交通灯功能外,还具有倒...
  • 交通信号识别自主式学习系统

    千次阅读 2018-04-27 17:11:25
    其中算法层面涉及到对交通信号灯的检测与识别,前期对该模块进行了简单算法的设计,主体的识别框架如下图,主要思想是基于滑动窗思想和机器学习模型。当然为了进一步提升算法的效率,采用了基于信号灯颜色的特殊先验...

    自动驾驶中一个核心模块的设计。其中算法层面涉及到对交通信号灯的检测与识别,前期对该模块进行了简单算法的设计,主体的识别框架如下图,主要思想是基于滑动窗思想和机器学习模型。当然为了进一步提升算法的效率,采用了基于信号灯颜色的特殊先验知识进行selective search,过滤掉大部分区域实现算法的加速。


    上述框架虽然能达到一定的识别率,但是依然面临两个严峻的挑战:

    • 对视频处理的实时性较差。上述框架对ROI的提取算法涉及到对整个图像的遍历;并且对视频的每一帧进行独立处理,没有考虑帧与帧之间的相关性。
    • 处理不同场景的迁移性较差。上述框架主要基于SVM分类器,而这种传统的机器学习模型的性能主要依赖于训练数据和提取的人工特征。目前的训练数据有限,不能完全表征整个真实数据的分布,导致在其它场景漏检或误检较多;当前的特征主要基于颜色直方图特征,该特征对图像数据较为敏感。比如采用不同的成像传感器或当前采集图像出现极端天气,提取的颜色直方图特征都会给后续的分类器带来误判。

    针对上述挑战,对现有框架进行了改进,设计了交通信号灯识别的自主式学习系统来应对实时性和迁移性差的问题。首先我们考虑交通场景中视频的特点,当信号灯出现在当前视野中时,在接下来的一段采集时间内都会出现该信号灯;并且帧与帧之间的信号灯位置不会出现很大的偏移(主要取决于采集车和CCD)且呈现一定的运动方向,如下图。那么我们完全可以利用这种特性,在下一帧的检测中取当前信号灯位置处一定的窗口范围,使用mean shift算法在特征空间中搜索所谓的模点(局部极值点)找到信号灯位置;甚至可以在该窗口检测范围内,使用颜色分割,根据颜色判定信号灯的位置和颜色。注意上述策略只适用于信号灯在视野范围内连续出现的帧内检测。当信号灯在某个时间点突然出现,则我们必须利用先前框架的单帧处理检测信号灯。因此,先前框架采用的人工特征和SVM分类器也是至关重要的一环。下面我们重点讨论这一部分,以解决迁移性较差的问题。


    在人工特征方面,似乎颜色特征时信号灯最明显的特征。而其它纹理特征比如sift,LBP等在实验中并没有取得好的效果,还包括HoG特征,Gabor变换,角点特征等。另外值得注意的是,交通场景极为复杂,我们会面临极大的干扰。比如,针对颜色直方图特征,采集场景中会出现大量照明灯光区域,从而照成正负样本空间中类内及其相似而线性不可分的情形。鉴于此,我们采用基于sparse coding的策略,利用学习的字典将低层的颜色直方图特征非线性的映射到更加线性可分的高层特征空间中。而在分类器的训练中,我们采用自主式的训练机制,自发主动的学习并不断更新分类器,以适应数据的变化。在新的场景视频检测中,当已经训练的分类器检测不出信号灯区域且出现大量误检的情况下,我们手工干预标定信号灯区域,而在后续的帧检测中,利用前述的帧相关性进行检测与识别;在确定的检测窗口范围内识别处的信号灯区域作为正样本,而先前训练的分类器检测出的区域且出现在确定的检测窗口范围外的区域作为负样本;收集一定的正负样本后,重新训练分类器,达到更新的效果。


    新的框架目前还处于初步构建中,在实验中实时性得到了保障,并且自发式的学习能不断的自适应新的数据,并不断增强分类器的性能,进一步提升方法的场景迁移性处理能力。但是新的框架也存在缺陷,在漏检的情况下,需要人工干预。后续会不断改进算法,充分利用视频帧在时空上的相关性,甚至利用深度卷积神经网络的特征自学习能力。

    展开全文
  • 两个摄像头,一个广角摄像头,一个长距离摄像头, 这样保证近处并且视野大范围内的交通灯检测 + 远处正前方交通灯检测。 通过当前位置查询高精度地图,得出交通灯相对车辆位置,转化为图像坐标系,投射到两个...
  • 本设计就是采用单片机模拟十字路口交通灯的各种状态显示以及倒计时时间。 本设计系统由单片机I/O口扩张系统、交通灯状态显示系统、LED数码显示管系统、紧急情况中断系统、复位电路等几大部分组成.系统除基本的交通灯...
  • 本次基于单片机的交通信号灯控制系统的设计是在一般交通灯的基础上加上时间的智能控制,从而改变各方向通行的时间。 此次硬件实物的设计分为两部分,一部分是电子器件的设计,另一部分是显示界面的设计。电子器件的...
  • 初学交通信号灯目标检测时,总是苦于找不到合适的交通灯数据集。即使找到了数据集,也往往因为格式不同而无法直接使用。因为大部分目标检测代码都只支持VOC或COCO数据集格式,为了保证程序正常运行,必须先将数据...
  • 针对智能交通系统提出的夜间车流检测问题,提出了一种基于视频虚拟线圈的检测方法。该方法主要包括车灯配对和车辆检测两个部分。车灯配对是根据同一车辆的两个车灯大小和相对位置等特性对车灯进行配对;车辆检测是...
  • (1)交通信号控制器为两相位(基本部分),可设置为三相位或四相位,设有平峰时段、 早高峰时段、午间高峰时段和夜间时段四个时段,时段起止时间可以根据交通工程相关 课程知识确定; (2)通过键盘进行...
  • 红绿灯-源码

    2021-02-15 09:00:30
    交通灯检测 一个Mobileye项目 使用图像处理和机器学习来检测交通信号灯及其与交通信号距离,分为4部分: 使用带自定义高通滤波器卷积检测图像中光源。 使用上一阶段产品作为输入来生成和训练CNN,以得出...
  • 智能城市核心组成部分之一是自动交通管理。这不禁让我思考——我能用我数据科学知识来建立一个车辆检测模型,在智能交通管理中发挥作用吗?想想看,如果你能在红绿灯摄像头中集成车辆检测系统,你可以轻松地同时...
  • ▼利用车辆检测器,实时分析各方向车流状态,通过自适应算法调整各个方向上红绿灯时间长短,达到更好通行能力,缓解交通压力。它与老式红绿灯有何区别?▼以往老式信号时间是固定不变,导致有些路口就算没有...
  • 同时在LED电源驱动部分采用ONSemi开发高性能并带有SPI通讯接口多通道BOOST、BUCK模式LED驱动芯片。该方案符合车厂AEC-Q100认证,适用在自适应远光照明(ADB)、高级前灯照明(AFL)、激光照明等照明系统。采用高亮度...
  • 车辆和交通信号被遮挡。 • 图20:阻塞了总线。 • 图21:左侧人被遮挡了。 像YOLOv3这样基于CNN目标检测方法有一个缺点,即要求特征图生成对目标遮挡具有鲁棒性。而且,仅引发许多特征图并不能提高性能...
  • 智能城市核心组成部分之一是自动交通管理。这不禁让我思考——我能用我数据科学知识来建立一个车辆检测模型,在智能交通管理中发挥作用吗?想想看,如果你能在红绿灯摄像头中集成车辆检测系统,你可以轻松地同时...
  • TensorFlow 对象检测 API 教程2

    千次阅读 2018-02-10 23:17:15
    紧接上一篇,此时,已经选择了一个预先训练好模型,以适应新对象检测任务。在这篇文章中,将向展示如何将数据集转换为 TFRecord 文件,以便于调整模型。...在本教程中,创建了一个可识别交通灯状态的交通灯分...
  • 交通灯的通行与禁止时间控制显示中,通常要么东西、南北两方向各50秒;要么根据交通规律,东西方向60秒,南北方向40秒,时间控制都是固定的。交通灯的时间控制显示,以固定时间值预先“固化”在单片机中,每次只是...
  • 这个项目主要针对传统红绿灯固定时间周期变化不足,设计出基于路况变化动态...每个十字路口为一个最小调节系统,每个十字路口具有四个传感器分别检测四个方向驶入车流量与车速。每个传感器与邻近红绿灯公用一
  • 该方案分为前端图像处理和后端数据统计两个部分,主要包括实时视频采集、红绿灯时间检测、行人检测和数据统计。系统对YOLOv3算法进行了改进,使用VOC数据集训练了只仅能检测人物模型并且将视频流抽帧检测,大大...

空空如也

空空如也

1 2 3 4
收藏数 62
精华内容 24
关键字:

交通灯的检测部分