zoukankan      html  css  js  c++  java
  • 【CCD图像检测】2:黑白图像检测的硬件设计

    CCD图像检测<>

    作者:一点一滴的Beer   指导教师:Chen Zheng  单位:WHU

     

    二、黑白图像检测的硬件设计 

    2.1 电源提供。 

     clip_image002

    6 CCD12V电源电压源 

       因为小车的电池电压为7.2V,而CCD摄像头的工作电压为12V,故需要利用芯片搭建升压电路,如图6所示。

    2.2 视频信号行场同步信号分离。 

     

    clip_image004

    7:视频信号行场同步信号分离电路 

        视频信号每场是是不同的行组成,如图5所示,场与场之间,行与行之间都存在同步信号,单片机通过对这些同步信号的捕捉,来控制图像采集的时序,保证图像采集的正确性。视频信号分离芯片LM1881能将视频信号中的行同步脉冲、消隐脉冲和场同步脉冲提取出来,并将它们转换成数字信号交给单片机的I/O 口。视频信号分离电路如图7所示。

    2.3 行视频信号数字化。 

        由于模拟摄像头采集的图像信号为模拟信号,而计算机系统为离散的数字系统,故需要转换为数字信号才能交付MCU处理。大赛组委会所推荐的芯片XS系列片内集成了8路AD口,同时还具有丰富的IO接口资源,而且大赛中小车赛道色彩构成的简单性,使得视频信号数字化方案变得多样化。小车以模拟CCD摄像头为传感器,模拟式的采集先将一路视频信号引用图2电路,通过其可以将摄像头输出的复合视频信号进行分离,得到独立的同步信号和视频模拟量信号,然后通过逐行采样来完成整幅图像的采集。下面主要介绍三种对行信号的数字化的方法。

    2.3.1片内AD模块。 

        由于XS128本身就含有8路AD,故只需引入一路视频信号至任意一个AD口,然后软件上,先对AD口进行相应的初始化,再在行同步中断函数中执行以下代码即可完成数字化:

    for(i=0;i<column;i++)

    {

    while(ATD0STAT0_SCF!=1);//AD转换等待

    *g_video--=ATD0DR0L;//寄存器读取

    }

        此方法的优点在于,不需要进行额外的外围电路设计,直接引入视频信号,利用XS128的片内资源进行AD转换即可得到图片灰度数据。XS128在超频到64M的情况下,能每行采集96个点,如果对图片横向精度要求不高,选择此方法最为简单。但如果CCD看得比较远,由于图像的几何畸变,会造成远方的黑线最后AD结果只有一个黑点,这样在黑线提取时造成了较高的误判率,此时此方法就不再适用。

      

    2.3.2基于TLC55108位并行AD 

        为了每行信号得到更高的采样精度,在XS128还有多余的IO口前提下,我们可以考虑用片外A/D法。TCL5510为一款8位并行高速AD转换芯片,如果采用独立时钟其AD速度能达到20MSPS,然后将数字信号通过8位数据总线并行输出,直接引入到XS128的一组IO口上,在软件设计上只需对此IO口进行读取即可获得数字信号。相应AD转换电路如图8。

    clip_image006

    8:片外AD转换电路 

        芯片对端口进行读取时,为了防止读取到AD转换的跳变沿,故需要进行时钟同步,XS128含有8路PWM输出,通过对一路PWM进行翻转输出一定频率的脉冲,即可模拟一个同步时钟信号至片外AD模块,较方便地解决了时钟同步问题。在实际情况下,XS128超频到80M时每行能采集240个点,从而远方黑线消失的现象能得到很好的解决。

        除了采样精度高,更重要的是此方法保存的是灰度信息,能极大程度上防止了图像信息丢失,但是外围电路比较复杂,而且占用了较多的IO口资源(需要XS128额外提供一组8位的IO口进行数字信号读取)。

        如果采集的点比较多,对RAM资源不丰富的XS128来说是个灾难。

     

    2.3.3基于电压比较器的硬件二值。 

        以上两种方法最后得到的都是图像的灰度数据,能够比较逼真地反应CCD所见情景。但是由于大赛中,赛道仅由黑白两色组成(如图9),所以即使是灰度数据,我们最后处理时也一般要在软件上进行二值化将图像分割成黑白二色图片。所以,我们可以考虑直接用硬件进行图像二值化,将视频信号转换为一组方波信号,然后直接输入到一位I/O口中,对这一位的端口进行读取,高电平表示1,低电平表示0。

    2.3.3.1硬件二值电路 

        在软件上对灰度图片进行黑白分割时,有两种方法:

        固定阈值法,即高于此阈值电压,即认为是1,否则是0,然后再通过软件进行黑线边缘检测。

       直接通过边沿跳变法来检测黑线边缘,即两个相邻点之间灰度值相差一定时,表示到了黑线边缘。

       以上两种方法都能通过电压比较器电路实现。分别如图10和图11。

    clip_image008

    9:智能车赛道色彩构成 

    clip_image010

    10:固定参考电压二值电路 

    clip_image012

    11:边沿检测的二值电路 

    采用固定参考电压的二值电路设计起来比较简单,对参考阈值电压调结也比较方便-只需调结一个电位器阻值即可(为系统增加一个LCD,可直接在调结电位器后采集到的图像),故具有一定的场地适应性。但在实际使用过程中,我们发现采用固定参考电压的二值电路在CCD视野比较远时,仍然会出现图像无法分割的现象,此时该方法不再适用,故可以考虑采用边沿检测的二值电路。边沿检测二值电路中,将原始视频信号和滞后处理的视频信号输入到电压比较器两端,在视频信号跳变边沿会在两路输入产生幅度差(如图12),然后当幅度相差到一定程度(由滞回电路控制)时,电压比较器输出端便发生电平翻转,最后以方波形式输出视频信号(如图13,注:第一个低电平区为行同步区,第二个为黑线区)。

     

    clip_image014

    图12.原始视频信号(绿色)

    和滞后处理的视频信号(黄色)

    clip_image016

    图13.原始视频信号(绿色)

    和输出方波信号(黄色)

     

     

    2.3.3.2电路中元件参数的整定。 

        首先我们对一般的RC电路的时间常数进行了解,如下面所陈述:

    clip_image018

    14:普通的RC电路 

    clip_image020

       电容两端的输出电压和电源电压的关系如下:

    clip_image022

        电压上升幅度和上升时间(滞后时间)对应关系如下:

    T(/RC)

    1

    2

    3

    4

    5

    UC/US

    0.632

    0.865

    0.95

    0.98

    0.993

    表一:滞后时间表

        黑线的视频信号时间为3~4µs(R2=1.3K)

    clip_image024

    15:赛道中央黑线产生的视频信号

        一般为了获得两组视频信号在同样的时间轴点时获得最大的电压差,就要求,滞后信号尽量滞后。 但也不能太滞后。比如以下情况:(R2=6.4k)

    clip_image026

    16:当R2比较大时的滞后输出信号 

        下面是几张不同滞后电阻时的视频信号输出图:

     

    clip_image028

    1.3K的滞后电阻

    clip_image030

    3K滞后电阻

    clip_image032

    6.4的滞后电阻

    17:电路在不同滞后电阻下的输出波形 

        那么我们计算出一个大致R2 的参考值。

        我们要求在黑线区,滞后信号时间刚好为一个黑线视频信号的时间,也就是大概3~4µs,在保证在下一次上升沿到来前已经达低谷,以保证上升沿的电压差。

        如表一,大概 t=3~5倍RC,我们就可以认为电压已经到了最值。那么,要求滞后视频信号能在T0 = 3~5个RC内能够达到最值,而T0<3~4µs.大致算一下:

    3*10-6 = 4*R2*510*10-12

       得到R2=1.47K 能在3µs时间后,电压达到 原始跳变点的0.98

       得到R2=1.96K 能在4µs(刚好是一个近处的黑线视频信号的宽度)时间后,电压达到原始跳变点的0.98

        所以,一般 R2就取其中的某个值。在实际中,配合LCD,调节R2电位器,结果发现R2=1.85K时有比较好的效果,符合理论计算结果。

       关于R4参数的确定方法。参考:http://www.elecfans.com/article/90/150/2009/2009050756701.html

    clip_image034

    18:滞回电压比较器I/O电压图 

        滞回电压Vh = R4/ (R4+R5) * (Vo_max - Vo_min)

       因为黑线边缘产生约400mV跳变(由示波器上很容易看出),

       所以,滞回电压选择为100-400mV

       实验中,将R4设置为4.5K,产生215mV的滞回电压,一方面能比较好的搞干扰,一方面,使黑线不至于过细

    2.3.3.3硬件二值的特点。

        采用边沿检测电路,通过对两个电位器大小的调整,便能适应不同比赛场地光线,而且能适应CCD的不同视野,具有较强的图片分割能力,具有更强的场地适应性。而对比片外AD,此方案具有以下优点:

    1.电路设计更简单。

    2.占用芯片IO口只有一位,为片外AD的1/8。

    3.不用考虑时钟同步的问题。

    4.横向精度可以视为无限(因为直接以模拟电平信号输入,由MCU的一位端口对电平读取),在满足要求的情况下,MCU不用超频甚至还需要分频,8M频率读端口便能每行采集120多个点,所以不会存在当视野比较远时出现黑线断开的现象。

    5.采用硬件二值,直接对图片进行了正确有效的分割,减少了CPU的运算量,增加了分割的可靠性。

        显然,因为以上优点使得硬件二值的检测方案对于色彩简单的赛道环境拥有极大的优势。但是此方案的检测方式也存在局限性,对纵向的黑线检测具有比较高的准确性,但是在小车运动时对于横向黑线检测会出现不稳定现象(即有检测方式问题,也有CCD本身问题,也和采样行的选择有关系),最明显的是对十字交叉线和起跑线的区分,在检测十字交叉线时,因为CCD摄像头安装方式和球面镜头本身原故就会存在一定的失真,使十字线横向线呈弓形(远处为外弓箭形,近处为内弓箭形)

     

    clip_image036

    clip_image038

    19:用AD模块采集到的正常的十字线和起跑线

    clip_image040

    20:十字交叉线的检测问题

    clip_image042

    21:起跑线的检测问题

        如果出现以上状况,那么起跑线的检测就变得相当困难(基本没法正常检测):一方面有来自十字交叉线的干扰,另外一方面也因为起跑线本身检测的不稳定。于是我们为了解决起跑线问题,额外用AD采集了近处的10行(因为是近处,所以对行的精度要求不高,可以占用较少的内存),单独作为起跑线判断依据。

    2.3.3.4硬件二值的应用展望。

        硬件二值最大的特点是:输出的是模拟TTL电平信号,而这种信号是MCU所能处理和识别的电平信号,这就给硬件处理图像提供了很大的发展空间。图像采集的主要问题就是精度和保真度。保真度和采集方法有关,而精度的提高则很大程度上受到芯片RAM资源的限制。在采用硬件二值进行采集时,图片会无法避免的造成一定失真,但是却基本能满足用户需求,故展望之处可以从提高采集精度上着手。当摄像头视野比较广时,如果采样行比较稀疏,那么,会造成数据的大量丢失,严重时甚至会出现同一图片中黑色引导线不连续的情况,这对黑线提取是极其不利的。下面介绍两种方法来提高精度,分别是硬件层面和软件层面,供大家参考。

    硬件层面:

    (1)将硬件二值后的视频信号直接进入单片机的输入捕捉模块,用硬件来提取我们关心的一些信息,然后再对这些数据分析计算出对自己有用的信息,这样一方面硬件为我们承担了一部分的数据处理,另外一方面,使记录一行视频信号所用的数据变得很少,这对高主频但是却低RAM的XS128芯片来说是个很好的消息,这样我们可以在RAM一定时可以极大提高采集的图像的纵向精度。

    用HCS12单片机输入捕捉来对 微分电路视频输出进行捕捉, 检测到跳变时,就计录当前的TCNT,然后存储在一个数组中,显然,这样一行在理想智能汽车赛道中,最多10个, 就如以下情况(而且发生的可能极小----三条赛道并行,而且不还有一条起跑线,而且CCD的视角把它们全部拍摄进去了)。

    clip_image044

    22:理想赛道环境时的极限情况

    clip_image046

    23:实际赛道环境

        在实际的赛道中,一方面有来自交叉赛道的黑线正常干扰,另外一方面有来自光线的干扰,特别是赛道边缘地带,会有些杂乱的干扰信号,这个对硬件边缘检测计数是极其不利的。在用软件处理时也同样有这样的问题,这个问题是用部分搜索来解决的。因为在近处,CCD因为视野原因,正常情意下基本上不太可能看到赛道外部,于是这样就能确定起始搜索列的位置,然后逐步递推上去在一个小范围内搜索,当然还有些其它容错的思想在此不再赘述。在硬件层面上,同样也能实现逐步搜索:在第一行信号进入时,根据上一行的中心,来对视频信号检测时机进行适当延时,跳过干扰地带后,再对跳变点进行检测。当本行信号检测完毕后,或者,检测的跳变点超过一定数目后,就停止本行检测,再对下一行检测。

        一行只而要以一个大小为10左右的数组就能存储到此极限情况下的有用(边缘跳变)的信息,对于一般存在边缘干扰的情况,通过局部搜索的做法,用10个数据也能存储本行的有用信息。这样,受储存空间限制而无法提高图像精度的矛盾就解决了,以前4K只能存储横向96列的点列40行,现在可以存储新的点列的行数 甚至可以达到320行以上,而CCD的行视频信号只有320行,所以采集多少行已经没有多少意义了。更重要的是,它能把中心用硬件提取出来,我们要做的只是在软件上进行容错和判断即可。而且,这样做,横向的分辨率也没有了意义了,因为16位的TCNT计数,远方的黑线不论有多细,只要CCD能在CRT显示器上看到,用TCNT也一定能记录下来,所以,基本上不存在远方黑线的宽度过小甚至消失的现象.

    软件层面:

    (2)利用新的数据结构,用时间换空间,这样在不采用计数器也能利用有限的空间存储更多的数据,这样就自然提高了图像采集的精度。

    将开关量存储在一个位结构数组中,每8个开关量可以存储在一个位中,于是横向存储空间节省了7/8,这样,可以提高纵身精度和横向精度,但这是以牺牲MCU的计算量为代价的,因为XS128不支持位寻址,所以对图片bit的存取效率会变为原来直接对byte存取的1/3,就是不知道这个牺牲能不能忍受。如果能忍受,图片在4K的空间下,可以存储 160 横向分辨率的图片200多行。

    这个是以时间换取空间,以前片内AD也试过,当时受限于XS128内部的AD频率,而导致 图片bit的存储大大影响了AD转换,所以一行还是采集不到96个点。但是用硬件二值,就不存在AD等待时间,目前8M的频率读取,可以每行采集120个点,如果将频率提高一些,就能够弥补位结构存储时所占用的时间了。所以采集上理论上不会存在问题。

    位结构数据类型如下:

    代码
    typedef unsigned char byte;
    //二值图片 位结构----节省MCU的内存开销(8位的像素值)
    typedef union {
    byte Byte;
    struct {
    byte B0 :1; /* Bit 0 */
    byte B1 :1; /* Bit 1 */
    byte B2 :1; /* Bit 2 */
    byte B3 :1; /* Bit 3 */
    byte B4 :1; /* Bit 4 */
    byte B5 :1; /* Bit 5 */
    byte B6 :1; /* Bit 6 */
    byte B7 :1; /* Bit 7 */
    } Bits;
    } BYTE;

        像操作结构体一样去操作位,然后逐位存储开关量。此方法有一个缺点:运算效率低。因为HCS12系列芯片都不支持位寻址,所以,在对位进行存取时,实际操作还是先读一字节8位,然后再和相应的数据进行位运算提取某一位的数据,这样,数据读取的效率就变得很低了。所以这是一个以时间换取空间的方法,具体在实际中能否应用,就要看它实际应用时的优和劣的对比了。

    2.3.4几种方案比较。

    采集方法

    优点

    缺点

    片内AD

    电路设计简单,直接利用芯片内部集成模块,采集到的图像失真度小。

    图像横向精度难以提高,在处理时会有图像阈值分割的困难。

    片外并行AD

    采集图像失真度小,而且精度可以满足用户需求。

    占用I/O资源过多,电路设计比较繁琐,而且最终也会有图像分割的问题。

    硬件二值

    采用硬件将图片分割,输出为TTL电平,精度可认为是无限的。

    将外界信息直接二值化后交付芯片处理,意味着图片的很多信息的丢失。同时,在小车运动状态下,采集横向黑线会出现不稳定的现象。

  • 相关阅读:
    1093 Count PAT's(25 分)
    1089 Insert or Merge(25 分)
    1088 Rational Arithmetic(20 分)
    1081 Rational Sum(20 分)
    1069 The Black Hole of Numbers(20 分)
    1059 Prime Factors(25 分)
    1050 String Subtraction (20)
    根据生日计算员工年龄
    动态获取当前日期和时间
    对计数结果进行4舍5入
  • 原文地址:https://www.cnblogs.com/beer/p/1781750.html
Copyright © 2011-2022 走看看