智能车制作

标题: 智能车模拟摄像头图像采集方法详解(新增PDF下载版) [打印本页]

作者: superyongzhe    时间: 2008-4-26 00:45
标题: 智能车模拟摄像头图像采集方法详解(新增PDF下载版)
本帖最后由 superyongzhe 于 2009-11-16 23:24 编辑

近几天看到论坛里有很多网友遇到CCD图像采集的麻烦,我在最开始的时候也为这个烦恼过,由于本人比较菜,在度过大概半个月的绝望日夜后,在刚准备放弃时突然发现我已经采集到正确的图像了。特再次分享,希望能解决大家当前遇到的麻烦。
      在采集图像之前,我们首先要知道摄像头输出信号的特性。目前的模拟摄像头一般都是PAL制式的,输出的信号由复合同步信号,复合消隐信号和视频信号。其中的视频信号才是真正的图像信号,对于黑白摄像头,图像越黑,电压越低,图像越白,电压越高。而复合同步信号是控制电视机的电子枪对电子的偏转的,复合消隐信号是在图像换行和换场时电子枪回扫时不发射电子。由于人眼看到的图像大于等于24Hz时人才不会觉得图像闪烁,所以PAL制式输出的图像是25Hz,即每秒钟有25幅画面,说的专业点就是每秒25帧,其中每一帧有625行。但由于在早期电子技术还不发达时,电源不稳定,容易对电视信号进行干扰,而交流电源是50Hz所以,为了和电网兼容,同时由于25Hz时图像不稳定,所以后来工程师们把一副图像分成两场显示,对于一幅画面,一共有625行,但是电子枪先扫描奇数场1,3,5.....,然后再扫描2,4,6.....,所以这样的话,一副图像就变成了隔行扫描,每秒钟就有50场了。其中具体的细节请参考这个网站
电视原理与系统
http://courseware.ecnudec.com/zsb/zjx/zjx09/zjx090000.htm
只用看前面的黑白全电视信号和PAL制式就可以了(当然如果感兴趣可以全部看完)。

     通过上面的内容如果你对PAL制式信号了然于心,那么就可以开始图像的采集了,PAL输出的信号有复合同步信号,复合消隐信号和视频信号。那么我们首先就是要从这三种信号中分理出复合同步信号,复合消隐信号和视频信号,以便我们对AD采样到的值进行存储,从而形成一幅画面。具体如何分离,我们使用的是LM1881视频同步分离器件,具体的硬件连接请参看论坛内相关文章(论坛里有介绍LM1881的文章,自己搜吧,我不重复了)。
   分离出行场同步,奇偶场信号后,就把他们接到单片机的外部中断口,产生中断,在中断服务程序中对AD采集到的数据进行图像存储,从而形成一个二维数组的数字图像。
   下面就说说图像采集方案,方法有多种,但我使用的方案是在行终端中读取AD采样的灰度值,在场同步中交换图像采集和处理缓存指针,并对图像进行处理,然后控制小车,在主函数中只有初始化和键盘扫描和串口输出函数。这样做效率比较高,而且可以把调试和图像采集处理分开,变成起来比较方便。
   大家遇到的还有一个很棘手的问题可能是AD采样频率该设置多大呢?建议大家先通过PLLL超频,然后把AD时钟频率设置的高点才行。
下面就把我的代码贴给大家看看吧。

[attach]709[/attach]

[attach]711[/attach]

[attach]710[/attach]



void vPLLInit(void)//锁相环初始化
{                                  //BUS-CLOCK=PLL-CLOCK/2=32M
   REFDV = 1;  // set the REFDV register 16M*2*(3+1)/(1+1)=64M
   SYNR =3;    // set the SYNR register to give us a 64 MHz PLL-clock.
    asm nop    // nops required for PLL stability.
    asm nop
    asm nop
    asm nop
   while ((CRGFLG&0x08)==0); // wait here till the PLL is locked.
   CLKSEL|=0x80;             // switch the bus clock to the PLL.
}
设置总线时钟为32M

void vECTInit(void)//定时器初始化
{
  TIOS =0x00;    //设为输入捕捉
  TSCR1=0x80;    //定时器使能
  TSCR2=0x83;    //允许定时器溢出中断,定时器时钟32M/(2^3)=4M
  TCTL4=0xAA;    //触发电平:下降沿
  TIE  =0x07;    //开中断
  TFLG1=0xFF;    //清除中断标志
}

输入捕捉的1,2通道接行场中断。

void vADInit(void)//AD转换初始化程序
{
//ATD1设置
//上电,标志位快速清零,忽略外部触发,执行一次停止,中断禁止。
  ATD1CTL2  = (ATD1CTL2_AFFC_MASK | ATD1CTL2_ADPU_MASK);

//转换序列长度为1,FIFO模式,Freeze模式下继续转换。|ATD0CTL3_FIFO_MASK
  ATD1CTL3  = (ATD1CTL3_S1C_MASK);

//8位精度,2AD采样周期,采样长度8。
//ATDClock=[BusClock*0.5]/[PRS+1]  ; PRS=15, divider=32
  ATD1CTL4  =(ATD1CTL4_SRES8_MASK|ATD1CTL4_PRS0_MASK);
   
//右对齐无符号,扫描模式连续采样,单通道采样//多通道采样|ATD0CTL5_MULT_MASK。
  ATD1CTL5  = (ATD1CTL5_DJM_MASK|ATD1CTL5_SCAN_MASK);

//禁止数字输入缓冲
ATD1DIEN=0x00;
}

ATD1的0通道用于AD转换

下面是真正的图像采集程序  
//当前采样图像的行和列。
unsigned int ui_SampleRow=0,ui_SampleColumn=0;

//图像数据缓存
unsigned char uca_Buffer1[IMAGE_ROW][IMAGE_COLUMN];
unsigned char uca_Buffer2[IMAGE_ROW][IMAGE_COLUMN];

//指向当前采集数据采样缓存首地址的指针
unsigned char *puca_BufferSample=&uca_Buffer1[0][0];
//指向当前处理数据采样缓存首地址的指针
unsigned char *puca_BufferProcess=&uca_Buffer2[0][0];

//用于图像采集和处理交换缓存。(注意:在每次交换指针后保证puca_BufferTemp与puca_BufferSample相同)
unsigned char *puca_BufferTemp=&uca_Buffer1[0][0];

#pragma CODE_SEG NON_BANKED
//输入捕捉2通道中断函数,行同步 ,用于数据采集。
void interrupt 10 vIC2ISR(void)   
{
  unsigned char ucTemp;
  unsigned char *pucTemp;
  TFLG1_C2F=1;
  
  if(ui_SampleRow>=SAMP_ROW_START&&ui_SampleRow<SAMP_ROW_MAX)
  {
    if(ui_SampleRow%SAMP_ROW_SEP==0)
    {
      for(ui_SampleColumn=0;ui_SampleColumn<SAMP_COL_MAX;ui_SampleColumn++)
      {
        while(!ATD1STAT1_CCF0);
        if(ui_SampleColumn>=SAMP_COL_START)
        {
          if(ui_SampleColumn%SAMP_COL_SEP==0)
          {
            pucTemp=puca_BufferSample
              +((ui_SampleRow-SAMP_ROW_START)/SAMP_ROW_SEP)*IMAGE_COLUMN
              +(ui_SampleColumn-SAMP_COL_START)/SAMP_COL_SEP;
            *pucTemp=ATD1DR0L;
          }
        }
      }
    }
  }
  ucTemp=ATD1DR0L;
  ui_SampleRow++;               //采样行坐标加一。
}
//输入捕捉1通道中断函数,场同步,交换缓存以及图像处理和模型车控制。
void interrupt 9 vIC1ISR(void)   
{     
  TFLG1_C1F=1;
  ui_SampleRow=0;               //把采样行坐标清零。
  ui_SampleColumn=0;

//交换图像采集和处理缓存
  puca_BufferSample=puca_BufferProcess;
  puca_BufferProcess=puca_BufferTemp;
  puca_BufferTemp=puca_BufferSample;
  
//系统时间加一。
  ul_SystemTime+=1;
  
//开中断,允许行信号中断进行采样。
  EnableInterrupts;
   
  if(uc_CarState==STATE_START)
  {
//    PORTB_BIT1=1;
   //分析图像,获取路径参数,根据路径参数控制模型车。。
    vImageProcess();
   
    //根据路径参数控制模型车。
    vAutoControl();
//    PORTB_BIT1=0;
  }
}


下面是我的小车程序,其中AD,输入捕捉和PLL初始化函数在Drives.c中,图像采集在Interrupts.c中。

[attach]102[/attach]
作者: superyongzhe    时间: 2008-4-26 01:25
标题: Re:CCD图像采集解决方案
<>还有一个《数字视频基本知识探讨》.pdf上传了好几次都没有成功,大家去网上搜一搜,这篇文章很实用。</P>
作者: superyongzhe    时间: 2008-4-26 01:31
标题: Re:CCD图像采集解决方案
<>&nbsp;&nbsp;&nbsp; 我想大家肯定还遇到一个问题,那就是如何知道自己采集的图像是否正确呢?可以使用串口,大家把我那个程序里面的printp.c</P><P>复制到你的工程里,再把includes.h里面的声明添加到你的程序里,在串口初始化程序里设置好波特率(如何设置可参考《单片</P><P>机嵌入式在线开发方法》一书中的相关内容,也可以看芯片资料)。上位机可以使用“串口助手就可以了”,很简单的。如果大</P><P>家还有什么问题就赶快提出来把,我尽量给大家解决,因为这里面前车的东西比较繁杂,我一下说不清楚。最好有个电视机,能</P><P>够看到摄像头摄在那里,这样会更容易校对。</P>
作者: qfnuyan    时间: 2008-4-26 19:58
标题: Re:CCD图像采集解决方案
<>谢谢!!太感谢了,正为此发愁呢,调了好几天都没有调出来,试一下</P>
作者: ldsun    时间: 2008-4-28 22:56
标题: Re:CCD图像采集解决方案
挺不错的,这几天在弄图像采集这一块。有一点,好像你们都不用Processor Expert的?<br>我觉得这个很方便,容易上手呵。<br>
作者: dendily    时间: 2008-5-4 00:20
标题: Re:CCD图像采集解决方案
十分感谢!很不错!
作者: yaofanglover    时间: 2008-5-24 00:23
标题: Re:CCD图像采集解决方案
<>你的<A target=_blank href="http://download.intelligentcar.cn/bbsupfile//upfile/SmartCarII_5_1.rar" target=_blank>SmartCarII_5_1.rar</A>下载不了啊,不知道是怎么回事啊</P>
作者: 山中石头    时间: 2008-6-9 07:57
提示: 作者被禁止或删除 内容自动屏蔽
作者: 山中石头    时间: 2008-6-20 06:19
提示: 作者被禁止或删除 内容自动屏蔽
作者: ydlysf    时间: 2008-7-2 02:12
标题: Re:CCD图像采集解决方案
好好好好好好
作者: xixihaha    时间: 2008-7-9 08:02
标题: Re:CCD图像采集解决方案
好啊.谢谢楼主
作者: 123220063    时间: 2008-10-4 17:52
标题: Re:CCD图像采集解决方案
pucTemp=puca_BufferSample<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +((ui_SampleRow-SAMP_ROW_START)/SAMP_ROW_SEP)*IMAGE_COLUMN<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +(ui_SampleColumn-SAMP_COL_START)/SAMP_COL_SEP;<BR>这个直接用简单点的语句表达行不嘛&nbsp; 弄的我们这些初学者不是太明白
作者: HCS12    时间: 2008-12-6 06:04
标题: Re:CCD图像采集解决方案
感谢LZ啊
作者: 德律风根    时间: 2008-12-12 05:31
标题: Re:CCD图像采集解决方案
谢谢共享
作者: qijitao    时间: 2009-1-11 02:59
标题: Re:CCD图像采集解决方案
<>太好了 感谢你</P><P>&nbsp;</P>
作者: 新兴MCU    时间: 2009-1-18 00:34
标题: Re:CCD图像采集解决方案
不错啊~~~~~~~~~~顶~~~~~~~~
作者: 灰色的土    时间: 2009-1-28 19:05
标题: Re:CCD图像采集解决方案
刚学,有点明白。用用……
作者: lyzhappy    时间: 2009-2-8 10:40
好样的!
作者: Jecely    时间: 2009-2-11 01:39
无私者无敌!
作者: mc0511    时间: 2009-2-12 19:35
今天调了一天摄像头,没有调出来,终于遇到有现成的程序了
作者: redfox302    时间: 2009-2-20 13:06
乐于奉献啊
作者: redfox302    时间: 2009-2-20 14:53
楼主的图像处理程序也太难理解了
能不能结合你的程序介绍介绍膨胀腐蚀算法
最后调试结果咋样啊
感觉完全看不懂哎~~
先谢谢了啊
作者: 云波    时间: 2009-2-20 22:31
很不错啊!让人恍然大悟 !
作者: wangguobin    时间: 2009-2-21 17:22
不错,好
作者: wendyilc    时间: 2009-2-21 19:07
强烈支持
作者: trybest    时间: 2009-2-21 22:56
顶楼主
作者: aderly    时间: 2009-2-21 22:56
谢啦
作者: 小惠19999    时间: 2009-2-27 16:16
谢谢   好人啊!!!!!!!!!!!!!!
作者: buptxiaoluo    时间: 2009-3-1 12:28
楼主好样的
谢谢
作者: buptxiaoluo    时间: 2009-3-1 12:29
下载了程序
再次表示感谢
作者: chenyw    时间: 2009-3-1 20:13
不错!
作者: a414737842    时间: 2009-3-4 20:01
太感谢你了
作者: more_dragon    时间: 2009-3-5 20:43
多些啊
作者: zf12862177    时间: 2009-3-9 15:02
楼主。我太奇怪了。我怎么看不懂你的文件的 包含关系。我觉得好混乱啊。。。
作者: 草竹    时间: 2009-3-10 10:36
真的不错!!!~~!~!
作者: wind_1987    时间: 2009-3-11 19:21
调试时,S12的SCI不是标准的RS232口,而笔记本电脑也没有RS232接口,两者之间怎么建立联系呢?
谢谢!
作者: liujiejesse    时间: 2009-3-12 13:10
顶一个~~
作者: liujiejesse    时间: 2009-3-12 13:26
AD转换模块
作者: liujiejesse    时间: 2009-3-12 13:42
Processor Expert
作者: huangchengnan    时间: 2009-3-13 16:34
你用的是什么型号的摄像头?
  能用你的程序做ov7620的采集么?
2# superyongzhe
作者: huangchengnan    时间: 2009-3-13 16:38
大哥,能否帮个忙把你的原理图发给我?我急着救命啊,最近搞了好久都没效果,谢谢了
   我的邮箱huangchengnan@126.com
作者: huangchengnan    时间: 2009-3-13 16:43
还有啊,ccd和cmos在采集程序上有什么区别么?
    ov7620能用你那个程序采集么?我是新手,谢谢你帮忙哦
作者: e2zone    时间: 2009-3-13 21:21
............................
作者: e2zone    时间: 2009-3-13 21:21
回一个帖子就有一个威望吗?
作者: 学做智能车    时间: 2009-3-14 22:40
太牛了!这是我见到的最有含金量的帖子!
作者: 草竹    时间: 2009-3-20 09:37
好好好
作者: xfh168168    时间: 2009-3-20 14:28
1# superyongzhe 很好的资料 学习中
作者: mbs123456789    时间: 2009-3-21 15:52
我们也困惑于此,先行用了
谢谢
作者: wengfeng    时间: 2009-3-22 12:42
aho
作者: wengfeng    时间: 2009-3-22 12:42
aho
作者: pengzhen_lin    时间: 2009-3-31 20:04
好好好
作者: gf128    时间: 2009-4-1 23:01
非常有帮助,谢谢
作者: jian1999jian    时间: 2009-4-2 08:38
haohaohao
作者: 786892880    时间: 2009-4-5 15:41
多谢啦
作者: 星星    时间: 2009-4-7 20:20
楼主太好了!
作者: lll_hit    时间: 2009-4-18 18:09
谢谢,正想找点ccd方面的资料呢
作者: guiji1106    时间: 2009-4-21 13:20
lz大好人啊!
作者: liuxiangliao    时间: 2009-4-23 20:46
hao   支持
作者: rong    时间: 2009-6-8 16:39
谢谢了!
作者: qitong111    时间: 2009-6-16 18:22
感动就一个字~~~~顶~~·
作者: herojohy    时间: 2009-7-2 08:38
这两天正做着CCD,受用了,多谢LZ
作者: zrs62123    时间: 2009-7-9 12:26
很好的文章
作者: tlong_1919    时间: 2009-8-12 20:08
谢谢
作者: chenboss    时间: 2009-8-19 21:34
tai hao le
xiexie
作者: wangguoxiao    时间: 2009-11-14 18:02
好,顶~~~~~~~~
作者: 467513422    时间: 2009-11-16 13:56
先浏览一下了啊
作者: 401    时间: 2009-11-17 18:22
Thank you!
作者: lizhuoqi    时间: 2009-11-19 13:46
好贴就要顶一下!
作者: lj00000lj    时间: 2009-11-20 22:19
谢谢,值得分享!
作者: aderly    时间: 2009-11-21 14:59
非常感谢
作者: pdh1988    时间: 2009-11-23 11:05
好好哦啊
作者: caishichang    时间: 2009-11-23 19:55
非常感谢   太好了
作者: qijitao    时间: 2009-11-24 21:21
谢谢 楼主分享 学习了~~
作者: liyuqi    时间: 2009-11-25 10:36
非常感谢~极具参考价值~楼主辛苦~
作者: chihua    时间: 2009-11-26 17:31
谢谢楼主分享
作者: 花花1098    时间: 2009-12-4 14:41
先下了,学习学习·····················
作者: alaso12    时间: 2009-12-8 15:45
很好!!感谢lz分享!!
作者: ydmsz    时间: 2009-12-9 10:58
3Q !!!!
作者: 超群天晴    时间: 2009-12-10 08:21
我们才刚刚开始,我也打算做摄像组的,
作者: changjiang    时间: 2009-12-11 20:38
这个程序如果用到xs128单片机上改动得多吗?主要该改哪些寄存器啊?
作者: deng    时间: 2009-12-12 18:01
收藏
作者: zdhly0401    时间: 2009-12-12 20:17

作者: 王怀玉    时间: 2009-12-15 20:27
谢啦,挺好,嘿嘿down走了
作者: xab1987    时间: 2009-12-16 18:23
提示: 作者被禁止或删除 内容自动屏蔽
作者: 姚先生    时间: 2009-12-18 15:35
谢了 但我应该怎么才能 看到 图像  或者是和PC机连接??
作者: pengzhen_lin    时间: 2009-12-21 10:11
想问一下数字摄像头怎样取图像?
作者: g280045620    时间: 2009-12-21 17:48
谢谢分享!!!
作者: 小怪兽AK    时间: 2009-12-24 23:55
顶了我
作者: alaso12    时间: 2009-12-25 22:38

作者: quyuandemeng    时间: 2009-12-27 17:35
楼主好强啊!
作者: 云飞扬    时间: 2009-12-29 19:11
很好很强大!
作者: zysunshine    时间: 2010-1-5 18:43
正在搞这块呢,呵呵,谢谢,先学习下
作者: tjjnb    时间: 2010-1-6 23:16
感激不尽哈 正起步中 还请版主多多关照
作者: 蓝海之鸟    时间: 2010-1-9 00:18
谢谢啊
作者: sjywangyi513    时间: 2010-1-10 09:03
好好好
作者: justinhit    时间: 2010-1-11 19:24
受教,呵呵
作者: snna719    时间: 2010-1-12 09:59
十分感谢!
作者: nwancheng    时间: 2010-1-13 20:16
谢谢楼主   在菜鸟中起步
作者: QJ1016    时间: 2010-1-13 20:41
感激啊!
作者: laozi1231234    时间: 2010-1-15 21:14
好东西,谢谢分享




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2