吳宗卓
(陜西國防工業職業技術學院,陜西西安,710300 )
在嵌入式技術飛速發展的推動下,嵌入式設備在汽車電子、消費電子以及軍工航天等諸多領域得到了廣泛的應用。基于開源性、可裁剪、可移植、實時性強、內核小等優勢,嵌入式Linux逐漸發展為嵌入式設備的首選操作系統。作為計算機視覺技術中的重要分支之一,雙目立體視覺技術已成為計算機視覺研究的一項重點與熱點,取得的成果值得肯定。以嵌入式Linux操作系統為基礎設計的雙目立體視覺系統,具有突出的非接觸、高精度、深度可感知等優勢。
系統的硬件環境為ARM嵌入式開發平臺,ARM核心板對S3C2440予以采用,液晶屏為SAMSUNG公司推出的UG-32F04,兩個CMOS攝像頭采用webeyeV2000(OV511+OV7620)。
ARM系統的接口與功能模塊豐富,含USB接口、COM接口、JTAC接口等,主頻最高可達203MHz。
系統所用USB接口CMOS攝像頭為webeyeV2000,該設備對OV7620傳感器芯片予以采用,其最大優勢在于Linux操作系統自帶該設備的驅動程序模塊,有利于系統開發周期的大幅度縮短。USB控制器為OV511(片上USB收發器)。
液晶屏為 STN LCD(320×240),是一種 Framebuffer(幀緩沖)設備。用戶可視Framebuffer為顯示內存的一個映像,將其映射于內存地址空間上,便可直接執行讀寫任務,同時,寫操作可在屏幕上得到實時顯示。用戶無需具體的細節,這些全部通過Framebuffer設備驅動實現。
系統軟件設計包括3部分內容:(1)嵌入式操作系統;(2)硬件驅動程序;(3)應用軟件。
嵌入式操作系統對Linux操作系統予以采用,內核版本為Linux-2.6.31,內帶s3c6410評估版源碼包,只需按照外設進行相應驅動部分的修改,可大幅節省開發時間。
Linux下所有設備全被視作文件,與兩個攝像頭相對應的文件分別為“/dev/v41/video0”與“/dev/v41/video1”。攝像頭的 屬 性 可通過 程 序“ioctl(fd,VIDIOCSWIN,&win)”與“ioctl(fd,VIDIOCSPICT,&vpic)”設置,攝像頭所采集數據的讀取則可由程序“read(fd,data,size)”來實現。LCD在 Linux下的設備文件為“/dev/fb0”,液晶屏的參數通過“ioctl(fb.FBIOGET_FSCREENINFO.&fb_finfo)”語句的調用來設置,而利用“fbdev.fb_mem=mmap(NULL.fbdev.fb_size.PROT_READ|PROT_WRITE.MAP_SHARED,fb,0)”可將屏的幀緩存地址映射到一個已知地址,操作此地址亦即對液晶屏進行操作。
Linux操作系統與相應驅動程序設計完成后,需進行應用程序的編寫,以此實現某些特定的功能。系統應用程序的設計主要涉及圖像數據采集、圖像處理、坐標提取以及圖像數據與坐標值輸出等。
MJPG-streamer是開源的、基于命令行的一種能夠提供JPEG圖像流的輕量服務器,可從輸入設備處進行圖像數據的復制,然后傳送至輸出設備。支持MJPG-streamer的輸入設備有CMOS攝像頭、UVC攝像頭、文件輸入等,輸出設備有文件、網絡服務(HTTP、UDP)等。在默認情況下,MJPG-streamer僅支持單設備輸入與多種途徑輸出,由于文章研究的雙目視覺系統需進行兩個CMOS設備輸入與一個Framebuffer輸出,因此需相應地修改MJPG-streamer源代碼。
MJPG-stream的模塊(插件)主要包括以下部分:
(1)mjpg_streamer:主程序,用于其他插件的調用;(2)input_cmos:攝 像 頭 輸 入 插 件;(3)output_frame:Framebuffer服務插件;(4)input_file:以視頻或圖像為輸入;(5)output_file:輸出到JPEG文件。
設計用到input_cmos與output_frame兩個輸入輸出模塊,通過分析MJPG-streamer源代碼,可知各模塊的運行采取的是獨立線程的方式,各線程之間的通信方式為共享內存。輸入插件存儲圖像數據至共享區域中,輸出插件從共享內存區域進行圖像數據的讀取,然后將其寫入網絡終端或磁盤等目標位置中。
通過對源代碼的進一步分析,可知MJPG-streamer支持多個輸入插件,它可將從不同輸入設備讀取到的數據放到不同的內存位置,在此過程中,唯一起到限制性作用的是在輸出時默認只發送第一個設備讀取到的數據。
在對每個來自顯示屏的請求進行響應之時,output_frame都會啟用一個單獨線程進行數據的發送,其中,全部數據都來自第一個輸入插件。為了得到不同輸入設備的數據,顯示屏在請求數據時應指明從哪個設備獲取;同時,若顯示屏啟動兩個獨立線程進行兩個攝像頭數據的分別訪問,便會實現MJPG-streamer的多輸入單插件輸出的功能。該功能通過修改MJPG-streamer下output_frame模塊中的framed.c文件來實現:
(1)增加靜態全局整型變量stream_id定義,進行初始化處理,設置為0,即默認從第一個輸入設備獲取圖像數據流;
(2)對framebuffer請求進行處理?actionstream,進行程序塊內部增加獲取請求的流id功能的判斷:
Else if (strstr (buffer,”GET/?action=stream’)!=NU LL)
{
Char*tmp=strstr (buffer,”stream:”);
If(tmp!=NULL)
{
Stream_id=atoi(tmp+7);}
else
{
Stream)id=0;
}
req.type=A_STREAM;
query_suffixed-255;
}
(3)以stream_id為參數將其傳遞至send_stream函數;
(4)改變顯示屏對應的frame請求。MJPG-streamer安裝根據其說明文檔進行,在源代碼目錄執行make USE_LIBV4L2=true&&make install,此處“USE_LIBV4L2=true”使 用video for linux視頻設備驅動框架,以此實現MJPG-streamer的編譯與安裝。編寫啟動MJPG-streamer雙輸入單輸出的shell腳本文件,該腳本從兩個CMOS設備讀取圖像輸入,分辨率為640×480,每秒 20 幀。
參考文獻
[1]文成維,陳文建,詹冰.嵌入式雙目立體視覺測距系統[J].計算機系統應用,2012(10):143-147.
[2]夏茂盛,孟祥磊,宋占偉,等.基于雙目視覺的嵌入式三維坐標提取系統[J].吉林大學學報,2011(1):61-66.