用户登录  |  用户注册
首 页商业源码原创产品编程论坛
当前位置:PB创新网文章中心解决方案电子通信

一种用CPLD实现视频信号运动检测的方法

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2009-01-10 23:54:21
对于以上的抽样规则,有必要说明一下。最终的抽样数据并非全部都是有效数据,其中还包括了一部分消隐期的数据。这样做是可以理解的,因为运动检测的结果是根据两帧被抽样数据的差值来判定的,虽然消隐期的数据是无效的,但是每次消隐期的数据是相同的,两次抽样数据相减结果是零,并不会影响结果的判定。之所以对一场的行进行抽样,主要是为了减小抽样数据量,使数据总量不超过128K SRAM的容量。

如果要保证抽样数据全部都是有效数据,那么必须利用输入的象素数据同步脉冲SPCLK、场同步信号SVS和行同步信号SHS对抽样时刻做严格的同步。这需要消耗额外的CPLD资源,而效果却不一定好。

根据以上规则,实际抽样的数据量为:864×144=124416Byte,需要的SRAM容量为128K。

2.3 程序

下面给出实现以上过程的一部分VHDL程序。

sram_write_controlprocessstore_fieldvalidspclk2line_counter

begin

writing<=valid and spclk2 and spclk and store_field and line_counter0

end process

sram_read_controlprocesscompare_fieldvalidspclk2line_counter

begin

reading<=valid and compare_field and spclk2 and line_counter0

end process

这两个进程用于控制SRAM的读写信号,reading和writing正好和SRAM的读写信号反相。Valid变量指示当前输入的行是否为需要采样的有效行,spclk是象素数据同步脉冲,spclk2是它的二分频,用于指示当前输入数据是否为亮度分量Y。line_counter0=1表示奇数行。store_field和compare_field分别指示本场数据是否需要保存或者需要比较。

update_data_busprocessstore_fieldvalidccd_data

begin

ifstore_field=‘1’and valid=‘1’then

data_sram<=ccd_data

else

data_sram<=“ZZZZZZZZ”

end if

end process

在抽样第一帧数据的时候,直接把数字视频信号输入到SRAM的数据总线上,写操作信号由writing控制。其它时候,数据总线上输出高阻。

update_data_regprocessspclkccd_dataspclk2compare_field

validdata_sram

begin

ifspclk'event and spclk=‘0’then

ifcompare_field=‘1’and valid=‘1’and spclk2=‘1’then

data_sram_reg<=data_sram

ifccd_data<=thresholdthen

data_reg1<=“00000000”

data_reg2<=ccd_data+threshold

elsifccd_data>=255-thresholdthen

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_dataprocessspclk2validcompare_field

begin

ifspclk2'event and spclk2=‘0’then

ifcompare_field=‘0’then

pixels<=“0000000000”

elsifvalid='1'then

ifdata_sram_reg<=data_reg1 or data_sram_reg>=data_reg2then

pixels<=pixels+1

end if

end if

end if

end process

compare_data进程在抽样的间隔(输入为色度分量Cr或者Cb时)对前后两次抽样的数据进行比较,如果比较结果超过允许值,计数器pixels加1,否则不加。

motion_detectprocesspixels

begin

ifpixels>max_pixelsthen

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摄像头的输入信号进行运动检测。

当然这种检测方法本身也有不足之处,最主要的一点是实际检测到的只是摄像头前光线亮度的变化,不能智能地判断引起这种变化的原因,也不能判别运动物体的形状。另一方面,从实验结果来看,有时候会出现误判;当运动物体离摄像头比较远时,检测的灵敏度也会降低,出现漏判。误判和漏判是一对矛盾,在实际应用中需要根据实际情况反复调试,选出最佳的阈值,减少这两种情况的发生。



上一页  [1] [2] 

Tags:

作者:佚名

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
PB创新网ourmis.com】Copyright © 2000-2009 . All Rights Reserved .
页面执行时间:4,531.25000 毫秒
Email:ourmis@126.com QQ:2322888 蜀ICP备05006790号