而以上问题在窗宽度等于1像素,即直接使用线性CCD捕捉图像时,可以消除这些缺陷。例如下图所示,拍摄的汽车是属于双向车道的,被白色横线挡住的大卡车是自右向左行驶的,白线前面的车是自左向右行驶的。但是由于每帧像素宽度为1,因此帧排列顺序不会出现上图问题1的效应,只会影响到物体的镜像翻转与否(注意卡车上的字)。
至于物体发生的拉伸形变,可以通过ps缩放简单修正。将运动速度慢而造成影像拉长的物体可以压回正常尺寸,没有信息损失;而运动过快造成的影像缩短,仅使用插值法拉回原本比例则会带来信息损失。
传感器简介 基本原理整个项目最重要的部分就是传感器了,这里使用的是TCD32D线性单色传感器,具有1024个像素单元,最高捕捉速度可以达到每秒大约2000帧。其实目前的科技已经有最多一万个像元,可以达到更高的分辨率,还支持RGB彩色模式,不过这些东西的原理基本都相通。想要TCD132D输出东西,首先需要给它一些信号,如图所示:
这里SH是控制CCD采集光信号,控制积累由光强度转化成的电信号(即积分)所用的时间长度,遇到一个SH下降沿就使得CCD开始把目前积累的电信号往外搬运。因此可以发现,帧率越大,给每个像元的积分时间就越短,相当于感光度变低。在此同时,\phiϕCCD控制搬运的节奏,这个信号变一次,就让下一个像素的信号出来,直到走完所有的像元。但是这上面并不是所有像元都能捕捉到光信号,只有中间部分的1024个可以,其他的只会打酱油。\phiϕM是总时钟,根据图里的比例可以看到,\phiϕCCD变一次,就要对应\phiϕM变4次,就是说\phiϕM的频率需要是\phiϕCCD的4倍。
而这个传感器能接受的这些信号的频率范围如下表前三行所示。可以看到\phiϕM的频率确实是\phiϕCCD的4倍。而\phiϕCCD每变一次就会输出一个数据,即一个\phiϕCCD周期会有2个数据输出,所以数据速率是\phiϕCCD的两倍。一帧有1024个数据,每秒2M个数据即每秒2k个帧,所以这个传感器的极速就是每秒2千帧左右。
这个TCD132D输出的是模拟信号(一个连续区间的电压值),所以需要一个ADC来把电压值转化到0-255之间的数码值。这也就是说,我们需要一个能够支持每秒转化2M个数据的ADC才行。ADC1173可以达到15MHz。而驱动他的方法也很简单,使用一个时钟,在每次时钟下降沿的时候就会把当前的数据采集转化。
Arduino相关实验老潘早些时候用arduino尝试着去驱动TCD132D以及ADC1173,奈何没有示波器,没法查看输出信号是不是符合期望值,arduino mega上面又不带DMC,数据来不及依次捕捉下来。而且对于如何同步列与列之间的数据,我也没什么头绪。这里示范一下使用arduino+ADC1173来把这个CCD当做光线传感器使用的一个例子吧(无奈)。
好在mega上面有很多定时器可以使用,这些定时器被我拿来当做各个时钟了。配置定时器又涉及到了寄存器操作,我的浅见是寄存器就是一堆功能按钮,按下他就会产生相应的功能,这些功能排列组合出来就成了神奇或者诡异的运行姿态。。。使用对应的寄存器的方法就是通过设置某个变量的名字(一般用到的单片机都会把每个寄存器做好名称和底层地址的对应文件给大家)等于一个二进制的数字,这个二进制数字的每一位都对应了这个寄存器里的一个按钮,1就是按下,0就是不按。通过纷杂迷人眼的来回切换这些按钮,这个机器就运转起来了。