一种用CPLD实现视频信号运动检测的方法
如果要保证抽样数据全部都是有效数据,那么必须利用输入的象素数据同步脉冲SPCLK、场同步信号SVS和行同步信号SHS对抽样时刻做严格的同步。这需要消耗额外的CPLD资源,而效果却不一定好。
根据以上规则,实际抽样的数据量为:864×144=124416Byte,需要的SRAM容量为128K。
2.3 程序
下面给出实现以上过程的一部分VHDL程序。
sram_write_controlprocessstore_fieldvalidspclk2line_counter
begin
writing<=valid and spclk2 and spclk and store_field and line_counter0
end process
sram_read_controlprocesscompare_fieldvalidspclk2line_counter
begin
reading<=valid and compare_field and spclk2 and line_counter0
end process
这两个进程用于控制SRAM的读写信号,reading和writing正好和SRAM的读写信号反相。Valid变量指示当前输入的行是否为需要采样的有效行,spclk是象素数据同步脉冲,spclk2是它的二分频,用于指示当前输入数据是否为亮度分量Y。line_counter0=1表示奇数行。store_field和compare_field分别指示本场数据是否需要保存或者需要比较。
update_data_busprocessstore_fieldvalidccd_data
begin
ifstore_field=‘1’and valid=‘1’then
data_sram<=ccd_data
else
data_sram<=“ZZZZZZZZ”
end if
end process
在抽样第一帧数据的时候,直接把数字视频信号输入到SRAM的数据总线上,写操作信号由writing控制。其它时候,数据总线上输出高阻。
update_data_regprocessspclkccd_dataspclk2compare_field
validdata_sram
begin
ifspclk'event and spclk=‘0’then
ifcompare_field=‘1’and valid=‘1’and spclk2=‘1’then
data_sram_reg<=data_sram
ifccd_data<=thresholdthen
data_reg1<=“00000000”
data_reg2<=ccd_data+threshold
elsifccd_data>=255-thresholdthen
data_reg1<=ccd_data-threshold
data_reg2<=“11111111”
else
data_reg1<=ccd_data-threshold
data_reg2<=ccd_data+threshold
end if
end if
end if
end process
SAA7113的象素同步脉冲的下跳边沿是象素数据的有效边沿,进程在compare_field=1时,一方面把抽样数据读入,用寄存器保存用于比较的数据的上限和下限;另一方面从SRAM读入对应数据存入寄存器data_sram_reg,这两个操作为比较数据做好准备。threshold是一个阈值,这里取16,当前后两次抽样差值超过threshold时就认为这两个抽样数据是不等的。在输入数据接近0或者255的时候,需要做特殊处理,避免整型数溢出,影响比较结果。
compare_dataprocessspclk2validcompare_field
begin
ifspclk2'event and spclk2=‘0’then
ifcompare_field=‘0’then
pixels<=“0000000000”
elsifvalid='1'then
ifdata_sram_reg<=data_reg1 or data_sram_reg>=data_reg2then
pixels<=pixels+1
end if
end if
end if
end process
compare_data进程在抽样的间隔(输入为色度分量Cr或者Cb时)对前后两次抽样的数据进行比较,如果比较结果超过允许值,计数器pixels加1,否则不加。
motion_detectprocesspixels
begin
ifpixels>max_pixelsthen
int0<=‘1’
else
int0<=‘0’
end if
end process
max_pixels是一个阈值,表示一帧数据中允许出现的不相等抽样数据的最大数目,当计数器pixels超过max_pixels时,就认为检测到了物体运动,CPLD将int0输出管脚置高,向处理器请求中断。这里max_pixels取600,它可以根据需要设置适当的值。
当CCD摄像头前有物体晃动时,CPLD的int0管脚会连续产生高电平脉冲,这说明运动检测模块已经正常工作起来,同时另一路视频信号经过W99682处理后输送到电视屏幕上,以便观察运动的场景。如果晃动摄像头本身,只要微小的晃动就可以看到类似的效果,因此用这种CPLD实现运动检测是可行的。
事实上,还可以利用同样的原理对CMOS摄像头的输入信号进行运动检测。
当然这种检测方法本身也有不足之处,最主要的一点是实际检测到的只是摄像头前光线亮度的变化,不能智能地判断引起这种变化的原因,也不能判别运动物体的形状。另一方面,从实验结果来看,有时候会出现误判;当运动物体离摄像头比较远时,检测的灵敏度也会降低,出现漏判。误判和漏判是一对矛盾,在实际应用中需要根据实际情况反复调试,选出最佳的阈值,减少这两种情况的发生。