模拟摄像头信号采集学习笔记

 https://blog.csdn.net/sements/article/details/84850033


目录

 

 

  • PAL制式简介
  • 同步信号的分离
  • 行、场同步信号与PAL时序关系
  • AD采样
  • 处理流程
  • 附件 摄像头测试图片

 

 

 

 

 

选用摄像头的是“索尼CCD模拟摄像头”,输出PAL制式电视信号(AV) 。 在本文里主要讲述的是模拟摄像头信号的一种采集方法。采用LM1881这款芯片进行视频同步信号分离,片内AD进行采样(亦可用片外AD进行采样,不过需要注意的是单片机对于IO口的读取速度可能不及片外高速AD的速率,这就有可能导致数据混乱)

 

扫描二维码关注公众号,回复: 5651392 查看本文章

 

才疏学浅,必有疏漏,望各位指正

 

 

 

 

 

 

 

 

 

 

 

 

 

  • PAL制式简介

 

首先先看一下从这款摄像头的视频线输出的图像(黄色信号)是什么样的

 

 

图1 黄色为AV信号,蓝色为行同步信号

 

PAL制式的输出信号由 复合同步信号复合消影信号视频信号这3部分组成

 

视频信号: 真正的图像信号, 对于黑白摄像头,图像越黑, 电压越低,图像越白,电压越高。在这里我们通过AD采集来得到亮度信号

 

复合同步信号: 用于控制电视机的电子枪对电子的偏转。当电子枪收到行同步(HSYNC)信号时,电子束就从上一行的最右端移动到下一行的最左端。当电子枪收到场同步(VSYNC)信号时就从屏幕的最右下角移到最左上角。

在这里我们需要用这个信号来控制采集像素的时序。

 

复合消影信号:在图像换行和换场时电子枪回扫时不发射电子。即收到复合同步信号后,电子枪要换位置时是不能发射电子束的,这时候就由这个信号来消隐。在这里我们不用管这个信号,一般用延迟避开即可。

 

 

在PAL制式中,每秒输出25幅画面(25帧),每一幅画面又分为奇场和偶场来显示。

一幅画面一共有625行,但是电子枪会先扫描奇数行 (1,3,5......)形成一场(奇数场),然后再扫描偶数行(2,4,6.....)形成一场(偶数场)。也就是说这两场是一幅画面隔行而来  (具体细节、原因以及电视信号的一些知识请参考“http://courseware.ecnudec.com/zsb/zjx/zjx09/zjx090000.htm”只需要看前面的几章即可,感兴趣可以全看完)

 

 

 

 

行同步信号产生后,经过一段行消影信号后才会不间断的输出那一行上各个像素的亮度,亮度越大,电压越高。

场同步信号产生后,经过一段场消影信号后才会开始从图像的顶端行开始输出每一行的行信号。

 

行同步信号的周期为64uS , 场同步信号的周期是20ms

 

每一帧会扫描625行,但是实际上有用的只有575行 (场消影信号占去)

奇场和偶场每一场会扫描312.5行,实际显示的行数每场为287.5行

 

 

图2 行场同步信号示例

 

接下来将讲解采集的方法,请确保对于PAL制式信号已有一定了解。

 

 

 

 

 

 

 

 

 

 

 

 

  • 同步信号的分离

可以知道,AV信号线中出来的PAL制式信号不仅仅包括我们所需要的视频信号,还包括用于电子枪移动控制的复合同步信号以及复合消影信号。这里我们讲讲如何从PAL信号里如何分离出复合同步信号。

 

LM1881是一款视频同步信号分离芯片,可以将输入的复合视频信号中的行同步信号,场同步信号,奇偶场信号以及突发输出给分离出来。在这里我们只用上行同步信号,场同步信号即可。由于奇偶场中图像差别不是很大,所以我们没有必要一定去采集奇场或者偶场信号,只需要保证采集到某一场的信号即可。

图3 LM1881应用原理图

 

值得注意的是,在LM1881的2脚Video Input引脚上需要用一个620Ω电阻,510pF电容构成一个低通滤波器,配合0.1uF的输入耦合电容来保证进入芯片的信号能被正常分离出同步信号。

其次,在6脚Rset引脚上需要一个680k电阻以及0.1uF电容构成64uS延迟,来保证芯片正常工作。

 

在应用时,我们只需要把摄像头AV视频线的一个分路接入LM1881的2脚,将LM1881的1脚作为行同步信号,3脚作为场同步信号来分别接入单片机的外部中断即可。

 

现在我们知道了可以通过视频同步信号分离芯片来将PAL制式信号里的同步信号分离出来,供给单片机,那么接下来我们来看看行、场同步信号与PAL视频信号的时序关系如何 。

(注意,以下的行、场同步信号都是由LM1881分离得出,不同的同步信号分离芯片得到的结果可能不一样,建议以芯片DataSheet讲述为准)

 

 

 

 

 

  • 行、场同步信号与PAL时序关系

图4  PAL与行同步信号 黄色为PAL某行信号的前半部分,蓝色为行同步信号

 

图中纵向光标a、b分别处在行同步信号的下降沿 以及 某行像素信号开始输出的起始处。在光标a到光标b的这一段内,实际上是没有像素输出的,这一段也就是行消影信号的所在位置 。我们从行同步信号的下降沿开始测量,直到一行最顶端的像素开始输出为止,这里测得的时间大约为9.8us。这个时间我们便可以拿来用作延迟时间,以至于不读取到行消影区。

补充说明:这里要注意,不仅仅消影区部分会是一段平直线,在每一行开始有像素输出的地方开始,直到下一个行同步信号来临的这一段时间内,在图4中用白框框出的部分也会是一段平直线,这一段叫后沿,并不是拍到暗地方造成的低平直线哦。

 

图5 行同步信号持续时间约4.56us

 

一般来说都是用行同步信号的下降沿来做中断触发标志,行同步信号低电平的维持时间可能由于芯片不同或硬件电路原因而导致差异。

 

图6 场同步信号 (蓝色)与PAL信号 (黄色)

 

这里需要注意,场同步信号产生一次表明上一场的结束以及下一场的开始,所以采集到两次场中断则是代表一个完整的场已经完成 。

 

图7 黄色为PAL信号,蓝色为场同步信号

 

注意,这里示波器的时间分度已经转成了200us,要知道每一场里有许多的行输出,所以行信号(光标b右侧)在这里已经被压挤成了一起,不过还是可以看出来每一行的行信号大致的样子。

我们用的是场同步信号的上升沿作为中断触发,如果和行同步信号一样用下降沿来作为触发方式的话为了不读取到无用的场消影信号,我们要多延迟230us的时间(这个230us不同的芯片可能时间不同),这会缩短后期图像算法以及其他操控的时间 ( 时间就是金钱啊 (~ ̄▽ ̄)→))* ̄▽ ̄*)o )

 

 

以上就是行、场同步信号和PAL信号的大致时序讲解,建议在考虑用延迟的方法避开消影区前先用示波器好好测量一下消影区的大概长度,然后自己慢慢调整,知道找到最适宜的时间。

 

  • AD采样

经过前面的PAL制式讲解,行同步信号,场同步信号以及消影信号的大致讲解,大家应该对于信号的构成有了一定的了解。接下来讲讲如何采集每一行上像素的信号。

 

图8 某行信号前段部分

 

之前介绍过,图像照射在CCD上,亮度越大,则电平越高,亮度越暗,则电平越低。但是这里的高和低是有一定的限度的。

首先,看到横向光标b所在的位置,约为480mV,但是这个不是我们说的表示“暗”的低电平,这一段是同步信号的所在电平位置。从白色箭头所指处(这里是部分摄像头区域照到部分亮光出产生的一段高峰)往后才是视频数据。而白色箭头所指的这一段横线的电平才是我们所说的表示“暗”的低电平,而表示“亮”的电平自然可以知道是光标a所在的由于照到亮光而产生的高峰的电平,约3.04V.

(注意,这个数值并不是绝对的,由于用来做AD参考电压范围的参考,所以建议亲自测量下为准)

之后,我们就可以根据这个来做AD参考电压范围的界定了,同时也可以用来做二值化阈值的判断标准。

 

 

 

 

相信大家会想到,既然它是不断的输出每一行上的像素亮度,那么如果我AD的采样速率越快,那不是可以理论上采集到更多的行像素吗?

的确,但是需要考虑到的一点是单片机的读取速度。无论是对于片外AD还是片内AD来说,单片机的读取速度才是应该把握住的上限,如果AD转换的速率超过了单片机的读取速率的话,很有可能将会导致读取出来的数据出现混杂的错误,这样反而得不偿失。

 

 

 

 

 

  • 处理流程

以上就大致的讲完了要进行模拟摄像头PAL制式信号的采集的基本要素,在实地采集之前,有一个问题不容忽视,那就是单片机的速率。

前面介绍过,行中断的周期为64us,场中断的周期为20ms。按照普通的想法,每来一次行中断便不断读取AD转换出来的值作为这一行上面的像素。但是这有一个问题,64us里单片机能够读取到有效的转换值实在太少,有时想要多读一些却发现采集到了前面的行消影区或者后沿上的“暗”电平。过少的一行像素用作道路识别或者其他方面实在难以接受。

举个例子,假设每行采集10个点,圆圈代表采集的像素点。

          图9 相机视角

由于行中断每64us便会产生一次,所以一行里面能采集到的像素就很少。然而在一场里面会有很多行,场中断20ms一次。所以如果用普通的方法来采集的话便会造成图像很窄但比较长 (马脸)。

但是,如果我们转过来想一下,将行中断里采集到的数据作为图像一列的像素,每来一次行中断则变成采集下一列的像素,那么从相机视角采集回来的图像就会变成这样

       图10 上述方法采集回来的图像

可以发现,使用该方法采回来的图像解决了普通方法只能采集“马脸”的问题。但是新的问题是图像不仅仅旋转了,还发生了翻转。发生旋转的问题好解决,我们只需要将摄像头旋转一下即可。而发生翻转的问题我们只需要将原本从图像数组开头开始储存,一直到图像数组末尾位置的储存顺序颠倒一下,改为从图像数组末尾开始,向数组头的位置储存即可。

 

      图11 水平翻转后的图像

旋转摄像头就能得到和原图像方向相同的图像了。

 

并且,我们也可以选择某些行进行采集,某些行不进行采集,这样既可以保证采集到足够的行数,同时也可以减轻负担。

 

解决了这个问题,剩下的就好办了。

 

 

 
   

场中断:  计数进入行中断次数

If     ( 第一次进场中断 场首 )

重置行、列像素指针

延迟,避免采集到场消影区

打开行中断

else (第二次进场中断 场尾)

关闭行中断

关闭场中断

归零场中断计数

标识已是新图像

 

 

 
   

行中断:  延迟,避免采集到行消影区

行像素指针++

If     ( 该行进行采集 )

For(列像素指针 = 0;列像素指针 < 图像高度 ; 列像素指针++)

等待AD转换完成
       储存图像

 

 

这里贴一下我写的处理代码

来张效果图     

六、附件 摄像头测试图片

猜你喜欢

转载自blog.csdn.net/u013662665/article/details/84850033