一種用CPLD實現視頻信號運動檢測的方法
(作者未知) 2009/5/20
(接上頁)alid=‘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是一個閾值,這里。保叮斍昂髢纱纬闃硬钪党^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。叮埃埃梢愿鶕枰O置適當的值。
當CCD攝像頭前有物體晃動時,CPLD的int0管腳會連續(xù)產生高電平脈沖,這說明運動檢測模塊已經正常工作起來,同時另一路視頻信號經過W99682處理后輸送到電視屏幕上,以便觀察運動的場景。如果晃動攝像頭本身,只要微小的晃動就可以看到類似的效果,因此用這種CPLD實現運動檢測是可行的。
事實上,還可以利用同樣的原理對CMOS攝像頭的輸入信號進行運動檢測。
當然這種檢測方法本身也有不足之處,最主要的一點是實際檢測到的只是攝像頭前光線亮度的變化,不能智能地判斷引起這種變化的原因,也不能(未完,下一頁)
|
|
|