基于PXA255的自動聚焦及圖像采集模塊設計
引言
目前市場上流行的攝像手機一般都不具備自動聚焦功能,這對于傳感器分辨率在30萬像素以下的攝像手機來說影響不大,但隨著百萬像素手機的面世,以及手機錄像功能的采用,人們對攝像頭的自動聚焦功能越來越關注。本文在xhyper255開發板的基礎上,結合項目開發的需要,在開發板上移植qt/embedded作為嵌入式gui,并設計了自動聚焦和圖像采集子模塊,其中自動聚焦部分通過verilog
hdl在開發板上的fpga上實現,圖像采集部分利用linux內核提供的video 4 linux接口實現。最后的采集程序界面采用嵌入式qt設計工具designer進行設計。

圖1 硬件平臺結構圖

圖2 dct變換模塊

圖3 dct變換流程圖

圖4 自動聚焦流程圖
基于圖像處理的
自動聚焦系統算法
與傳統的自動聚焦算法相比,基于圖像處理的自動聚焦算法的實現不需要額外的信號源和相應的接收傳感器,這有利于縮小器件的體積以降低成本,并降低器件的功耗。
在這類算法中,分析處理模塊直接對獲得的視頻圖像進行處理,以得到相應的判決函數,驅動控制模塊則根據得到的聚焦判決函數信息來驅動步進電機,帶動鏡頭前后移動,直到獲得聚焦清楚的圖像。因此,構造合理的判決函數就成了基于圖像處理的自動聚焦算法的關鍵所在。理想的聚焦判決函數應該具有單峰性、無偏性并能反映離焦的極性,同時應具有較強的抗干擾能力。
在對目前的自動聚焦判決函數做相應的對比后,結合本系統的特點選擇2d-dct變換去除其中的低頻成分,其余部分相加作為判決函數。2d-dct變換的公式如式1所示。
(1)
這里c(0)=1/,c(u)=c(v) (u,v≠0)
自動聚焦系統的實現
開發平臺的搭建如圖1所示。
采用xhyper255嵌入式開發板,圖像采集子系統采用如下硬件搭建:30萬像素cmos圖像傳感器ov7620、 mcs51單片機、usb控制器ov511+、
步進電機和變焦鏡頭。
ov7620的主要特性為:單片數字式彩色圖像傳感器;1/3光學格式;數字視頻輸出格式: 1~500倍的自動曝光范圍;自動增益和自動白平衡;能進行亮度、對比度、飽和度、伽馬校正等多種調節功能。664×492的圖像陣列掃描出原始的r、g、b彩色圖像信號,經模擬處理電路進行曝光、校正、白平衡調整等處理后根據輸出要求可以轉換成yuv等多種信號輸出形式。ov511+是為cmos圖像傳感器設計的專用usb接口控制芯片。
dct變換的fpga實現
2d-dct變換是視頻壓縮中的常用變換。在壓縮過程中,將一幅圖像分成許多8×8的小塊進行變換。8×8的2d-dct變換如式(2)所示:
(2)
這里c(0)=1/,c(u)=c(v)=1 (u,v≠0時)。
變換后去除其中的直流成份,其余的部分相加作為聚焦判決函數。函數最大值處即為焦點所處位置。
1. 塊準備:給定的大小為640×480的彩色圖像矩陣,將其分為三個矩陣,分別為亮度矩陣(y),每個的大小為8×8,共4800個;剩下的同相矩陣(i)和正交矩陣(q)分化為兩組1200個矩陣,每個大小為8×8,使用下列矩陣將rgb分量映射到y,i,q分量上:
y=0.30r+0.59g+0.11b
i=0.60r-0.28g-0.32b
q=0.21r-0.52g+0.31b
對每個8×8矩陣y,i,q分量計算dct,要計算2d-dct,先對矩陣每行進行1d-dct,然后對結果矩陣按列進行1d-dct計算。
2. dct模塊設計:dct系數采用case語句用查找表結構實現,程序源代碼不在此詳述。
dct變換的實現過程為:串行數據首先放到輸入緩沖(采用環形寄存器來構造),然后進行求積、求和運算,最終以并行數據的形式輸出。這些操作要在控制模塊下完成,以保證時序的正確。
dct變換模塊的框圖如圖2所示。8×8dct變換實際上就是64個像素點的并行運算。對每個象素點所作的運算為:輸入數據和dct系數相乘,而后相加得到最后結果。流程如圖3所示。
由公式可知,需要計算8×8=64次,每計算一次后,將i,j,u,v做相應變化,并重新在系數表中找到相應的系數,和新的數據相乘,作下一次運算。
自動聚焦的實現
去除每個8×8矩陣中的低頻成分。然后把相應的高頻成分相加,所得的和做為自動聚焦的判決函數,傳輸到cpu。編程實現一路pwm信號輸出,控制步進電機的步長和方向。實現自動聚焦。自動聚焦的流程如圖4所示。
圖像采集的實現
圖像采集程序的編寫基于linux內核中提供的video4linux 接口。video4linux是2.2.0版本之后linux內核提供給網絡攝像頭、視頻采集卡、電視卡等設備軟件開發的接口標準。這個標準為內核、驅動、應用程序提供一個api進行交流。目前的最新video4linux版本為v4l2。
使用雙urb輪流通信
對于對時間敏感而對數據的正確性要求不高的圖像采集應用,usb總線定義了isoc傳輸模式,usb攝像頭應當使用這種傳輸方式。為了盡可能快地得到圖像數據,應當在urb中指定usb_iso_asap標志。
urb->transfer_flags=usb_iso_asap;
//盡可能快地發出本urb
linux系統中任何usb傳輸都通過urb實現。為提高速度,可以考慮擴大urb的緩沖,也可以建立兩個urb,在等待一個urb被回收時,也就是圖像正在被傳感器采集時,處理、初始化另一個urb,并在回收后立刻將其發出。兩個urb交替使用,大大減少了額外時間。
使用內存映射并用
雙幀緩沖提高效率
linux系統通過read,write等來實現對硬件的操作,它們通過copy_to_user()、copy_from_user()等函數在內核和用戶內存空間中互相拷貝。但是對于視頻采集這類需要大量高速傳輸數據的應用來說,這種方法耗費的硬件資源過大,通過內存映射的方法可以使這一問題得到有效解決。首先使用vmalloc()申請足夠大的核態內存,將其作為圖像數據緩沖空間,兩個urb帶回的圖像數據在這里暫存;然后使用remap_page_range()函數將其逐頁映射到用戶空間中。戶態的圖像采集處理程序使用mmap()函數,直接讀寫內核圖像緩沖內存,大大減少額外開銷。另外,為了進一步提高幀速率,本文采用雙幀緩沖方式進行圖像采集。
結語
本系統只需在dct算法的實現和圖像采集接口實現上根據具體的硬件條件作些修改,就可應用于大多數智能產品的開發(如基于嵌入式linux的智能手機的開發),因此具有較好的市場應用前景。
評論