周文博 張勇 孫良義 蘇軍
摘 ?要:針對(duì)現(xiàn)有的視頻傳輸系統(tǒng)存在的技術(shù)復(fù)雜、研發(fā)周期長(zhǎng)、研制成本高等問(wèn)題,本文以嵌入式技術(shù)為基礎(chǔ)結(jié)合開(kāi)源高效的OpenCV(Open Source Computer Vision Library)視頻覺(jué)庫(kù),設(shè)計(jì)和實(shí)現(xiàn)了一種可應(yīng)用于艦載無(wú)人機(jī)的無(wú)線視頻傳輸系統(tǒng)。該系統(tǒng)采用Client/Server的架構(gòu)模式,以嵌入式ARM(Advanced RISC Machine)開(kāi)發(fā)板做為視頻信息采集的硬件平臺(tái),通過(guò)搭建的MJPG-streamer服務(wù)器軟件對(duì)視屏模塊采集的信息進(jìn)行處理和傳輸;以Visual Studio 2010作為軟件開(kāi)發(fā)平臺(tái),利用OpenCV技術(shù)構(gòu)建了客戶端視頻實(shí)時(shí)顯示與存儲(chǔ)軟件;測(cè)試表明:該系統(tǒng)能有效實(shí)現(xiàn)視頻信息的采集、處理、傳輸,以及實(shí)時(shí)顯示與存儲(chǔ);系統(tǒng)運(yùn)行穩(wěn)定,遠(yuǎn)程獲取得到視頻數(shù)據(jù)清晰流暢;系統(tǒng)軟硬件成本較低且采用免費(fèi)跨平臺(tái)的開(kāi)源控件簡(jiǎn)單易于推廣使用,具備一定的實(shí)用價(jià)值。
關(guān)鍵詞:艦載無(wú)人機(jī);視頻傳輸;OpenCV;ARM
中圖分類號(hào):TP391 ? ? 文獻(xiàn)標(biāo)識(shí)碼:A
Research on the Application of Embedded Wireless Video Transmission
System in Shipboard Unmanned Aerial Vehicle
ZHOU Wenbo, ZHANG Yong, SUN Liangyi, SU Jun
(Unit 91388 of PLA, Zhanjiang 524022, China)
1325157181@qq.com; 1845971@qq.com; 26900939@qq.com; soldierales@163.com
Abstract: Aiming at the defects of the existing video transmission systems, such as complex technology, long period of development and high development cost, this paper designs and implements a wireless video transmission system which can be applied to shipborne Unmanned Aerial Vehicle (UAV), based on embedded technology and efficient Open Source Computer Vision Library (OpenCV). Adopting the Client / Server architecture and using the embedded ARM (Advanced RISC Machine) development board as the hardware platform for video information collection, this system processes and transmits information collected by the video module through the MJPG-streamer server software. Taking Visual Studio 2010 as the software development platform, this system uses OpenCV technology to build the real-time display and storage software of the client video. The experiment result shows that this system can effectively collect, process, transmit, real-time display and store video information. This system also runs stably with clear and smooth video data. This system is easy to be widely applied because of its low cost of hardware and software with free cross-platform open source control.
Keywords: shipborne UAV; video transmission; OpenCV; ARM
1 ? 引言(Introduction)
艦載無(wú)人機(jī)[1]是一種可裝備在驅(qū)逐艦、護(hù)衛(wèi)艦和海事船[2]等水面平臺(tái),用以執(zhí)行空中航拍、海洋監(jiān)測(cè)、海事執(zhí)法和搜索救援等任務(wù)的特殊無(wú)人機(jī),與有人駕駛飛機(jī)相比,其具有使用成本低、機(jī)動(dòng)性能好、智能化程度高且容易布放與回收等特點(diǎn),在民用和軍用領(lǐng)域應(yīng)用前景廣闊。實(shí)時(shí)有效獲取艦載無(wú)人機(jī)作業(yè)現(xiàn)場(chǎng)的視頻圖像數(shù)據(jù),對(duì)其加以分析處理不僅能有效提升艦載無(wú)人機(jī)在海域空域中偵查搜索、目標(biāo)識(shí)別及跟蹤監(jiān)測(cè)等多方面的性能,同時(shí)高清的視頻圖像還能為后方指控人員制定決策提供參考依據(jù),根據(jù)作業(yè)現(xiàn)場(chǎng)情況變化實(shí)時(shí)調(diào)整任務(wù)。然而現(xiàn)有視頻傳輸系統(tǒng)采用的技術(shù)大多較為復(fù)雜、技術(shù)整合難度大、研制周期長(zhǎng)、研發(fā)成本高[3],因此,研究艦載無(wú)人機(jī)視頻傳輸技術(shù),進(jìn)一步降低其研制和使用成本,對(duì)于促進(jìn)艦載無(wú)人機(jī)技術(shù)的應(yīng)用和發(fā)展具有重要意義。
基于上述背景,本文設(shè)計(jì)和實(shí)現(xiàn)了一種可應(yīng)用于艦載無(wú)人機(jī)的嵌入式Linux無(wú)線視頻傳輸系統(tǒng),該系統(tǒng)通過(guò)嵌入式ARM開(kāi)發(fā)板搭載的視頻模塊實(shí)現(xiàn)對(duì)無(wú)人機(jī)作業(yè)現(xiàn)場(chǎng)視頻信息的采集,采用MJPG-streamer[4]視頻服務(wù)器對(duì)采集到的視頻信息進(jìn)行處理和傳輸,利用OPenCV[5]技術(shù)實(shí)現(xiàn)采集的圖像數(shù)據(jù)在遠(yuǎn)程客戶端實(shí)時(shí)顯示與存儲(chǔ)。
2 ? 系統(tǒng)總體設(shè)計(jì)(Overall system design)
視頻傳輸系統(tǒng)采用服務(wù)器與客戶端(Client/Sever)結(jié)構(gòu),服務(wù)器端負(fù)責(zé)艦載無(wú)人機(jī)視頻圖像信息的采集、壓縮編碼和傳輸,客戶端負(fù)責(zé)實(shí)現(xiàn)數(shù)據(jù)的顯示與存儲(chǔ)。其中服務(wù)器端主要包含嵌入式ARM開(kāi)發(fā)板、無(wú)線通信模塊和視頻模塊等硬件,采用嵌入式Linux作為服務(wù)器端的操作系統(tǒng),通過(guò)MJPG-streamer視頻服務(wù)器將采集的視頻信息編碼處理以流的形式經(jīng)無(wú)線模塊傳輸至客戶端??蛻舳擞布饕蔁o(wú)線通信模塊和PC(Personal Computer)機(jī)組成,以Visual Studio 2010作為客戶端軟件開(kāi)發(fā)平臺(tái),利用OpenCV技術(shù)實(shí)現(xiàn)圖像數(shù)據(jù)在客戶端的顯示和存儲(chǔ),系統(tǒng)的總體設(shè)計(jì)如圖1所示。
系統(tǒng)選用OK6410嵌入式開(kāi)發(fā)板作為服務(wù)器端的硬件平臺(tái),其搭載基于ARM1176JZF-S內(nèi)核的SamsungS3C6410微處理器,主頻標(biāo)配為533MHz,最高可運(yùn)行至667MHz,開(kāi)發(fā)板支持硬件編解碼,外圍配置USB Host、USB Device、Audio、SD/MMC/SDIO等多種接口,支持WinCE6.0、Linux3.0.1、Android2.3.4等多種操作系統(tǒng),開(kāi)發(fā)板在音視頻處理[6]、圖像顯示方面性能優(yōu)異,已有較多的成功應(yīng)用案例。
系統(tǒng)采用BL-LW05-2M模塊作為無(wú)線通信模塊,該模塊采用RalinkRT3070L芯片實(shí)現(xiàn)信息的收發(fā),最大可實(shí)現(xiàn)150M/bps的傳輸速率,具有Infrastructure Mode、AdHoc Mode和AP三種工作模式,兼容Linux、Windows、Wince等多種操作系統(tǒng),開(kāi)發(fā)設(shè)計(jì)方便。
視頻模塊選用LogitechC270高清USB網(wǎng)絡(luò)攝像頭,其具備動(dòng)態(tài)130萬(wàn)像素、最高30幀/s的圖像輸出速率,采用USB2.0傳輸接口,便于與ARM開(kāi)發(fā)板搭載連接,且作為標(biāo)準(zhǔn)的UVC設(shè)備,在Linux操作系統(tǒng)下可以免驅(qū)使用。
3 ?服務(wù)器端軟件實(shí)現(xiàn)(Server-side software implementation)
3.1 ? 嵌入式Linux系統(tǒng)的移植
在OK6410開(kāi)發(fā)板上移植嵌入式Linux系統(tǒng)步驟包括安裝交叉編譯組件、Uboot編譯、kernel編譯和最小文件系統(tǒng)的制作等步驟。具體過(guò)程簡(jiǎn)述如下:
(1)將交叉編譯組件源碼解壓至虛擬機(jī)ubnutu系統(tǒng)中的/usr/local/arm文件夾下,在etc/profile文件中設(shè)置交叉編譯器的搜索路徑。
(2)將開(kāi)發(fā)板提供的Uboot源碼拷貝至虛擬機(jī)解壓,將相關(guān)參數(shù)配置成與開(kāi)發(fā)板相對(duì)應(yīng)的版本,執(zhí)行“make”命令,對(duì)Uboot進(jìn)行編譯,得到其鏡像文件。
(3)解壓嵌入式Linux的內(nèi)核源碼,執(zhí)行“make menuconfig”命令對(duì)內(nèi)核進(jìn)行裁剪配置,執(zhí)行“make zImage”命令生成內(nèi)核鏡像文件。
(4)執(zhí)行“make menuconfig”命令對(duì)BusyBox進(jìn)行配置,然后執(zhí)行“make”命令對(duì)BusyBox進(jìn)行編譯,根據(jù)生成的文件配置項(xiàng)目所需的最小文件系統(tǒng)。
(5)將Uboot鏡像文件、內(nèi)核鏡像文件和最小文件系統(tǒng)燒寫到嵌入式OK6410開(kāi)發(fā)板上,至此Linux系統(tǒng)在服務(wù)器硬件平臺(tái)上的移植工作完成。
3.2 ? 無(wú)線網(wǎng)卡驅(qū)動(dòng)的移植
為了確保無(wú)線通信模塊的正常使用,需要在嵌入式開(kāi)發(fā)板上移植無(wú)線通信模塊驅(qū)動(dòng),將驅(qū)動(dòng)源碼拷貝內(nèi)核目錄下,解壓后使用cd命令進(jìn)入驅(qū)動(dòng)模塊的文件夾,對(duì)makefile文件進(jìn)行如下修改:
(1)進(jìn)行芯片選型設(shè)置CHIPSET = 3070,硬件平臺(tái)選型設(shè)置PLATFORM= SMDK。
(2)在如下位置處添加內(nèi)核源碼路徑和交叉編譯器路徑:
ifeq ($(PLATFORM),SMDK)
LINUX_SRC = 內(nèi)核源碼路徑
CROSS_COMPILE = 交叉編譯器的路徑
(3)執(zhí)行“make”命令,對(duì)驅(qū)動(dòng)進(jìn)行編譯,將生成的rt3070sta.ko文件拷貝至開(kāi)發(fā)板上,即可完成無(wú)線網(wǎng)卡驅(qū)動(dòng)的移植。
3.3 ? MJPG-streamer服務(wù)器移植
MJPG-streamer是一款免費(fèi)開(kāi)源的視頻流服務(wù)器軟件,該軟件采用LinuxC語(yǔ)言編寫,在不同的計(jì)算機(jī)平臺(tái)間具有較好的移植性,繼承自u(píng)vc_streamder組件,能較好兼容Linux_uvc的攝像頭,通過(guò)V4L2接口從視頻模塊采集視頻信息,具備利用視頻模塊的硬件壓縮功能實(shí)現(xiàn)對(duì)圖片信息的處理,能有效降低服務(wù)器端CPU的載荷,提高系統(tǒng)的運(yùn)行效率;其將采集的圖像數(shù)據(jù)處理生成為JPEG格式,以數(shù)據(jù)流的形式通過(guò)網(wǎng)絡(luò)發(fā)送至客戶端,用戶只需通過(guò)IP地址即可在客戶端的瀏覽器實(shí)現(xiàn)對(duì)視頻數(shù)據(jù)流的實(shí)時(shí)獲取。MJPG-streamer服務(wù)器軟件視頻信息處理流程如圖2所示。
MJPG-streamer基于jpeg庫(kù)來(lái)處理視頻圖像數(shù)據(jù),為確保Mjpeg-streamer在嵌入式ARM開(kāi)發(fā)板上能正常運(yùn)行必須先移植jpeg庫(kù),具體過(guò)程如下:
(1)jpeg庫(kù)的編譯與移植
首先,配置jpeg庫(kù),添加交叉編譯組件的搜索路徑和交叉編譯后文件的保存目錄。
其次,分別執(zhí)行“make”“make install”命令。
最后,將編譯生成的文件拷貝到開(kāi)發(fā)板。
(2)MJPG-streamer編譯與移植
首先,將服務(wù)器源碼頂層文件夾及plugins文件夾中各子文件夾中make文件中的編譯器修改為開(kāi)發(fā)板指定的交叉編譯版本。
其次,對(duì)plugins目錄下input_uvc文件夾中Makfile文件進(jìn)行修改,添加對(duì)jpeg庫(kù)的支持。
最后,執(zhí)行編譯命令,將生成的.so文件拷貝到開(kāi)發(fā)板對(duì)應(yīng)的目錄下,至此MJPG-streamer移植工作完成。
4 ? 客戶端軟件實(shí)現(xiàn)(Client software implementation)
本文以Visual Studio 2010作為客戶端軟件開(kāi)發(fā)平臺(tái),結(jié)合Visual Studio 2010平臺(tái)下的MFC(Microsoft Foundation Class)技術(shù)和OPenCV機(jī)器視覺(jué)庫(kù),實(shí)現(xiàn)艦載無(wú)人機(jī)無(wú)線視頻傳輸系統(tǒng)客戶端軟件的開(kāi)發(fā)。
MFC是微軟基礎(chǔ)類庫(kù)的簡(jiǎn)稱,其以C++類的形式封裝了Windows API(Application Programming Interface),庫(kù)中包含大量Windows句柄封裝類、Windows的內(nèi)建控件和組件的封裝類[7],使用該類庫(kù)進(jìn)行軟件開(kāi)發(fā)可以在很大程度上的減小程序設(shè)計(jì)人員的工作量。
OpenCV為開(kāi)源的跨平臺(tái)計(jì)算機(jī)視覺(jué)庫(kù),該庫(kù)采用C及C++語(yǔ)言編寫,庫(kù)內(nèi)的代碼經(jīng)過(guò)優(yōu)化,具有較高計(jì)算效率,其提供友好的機(jī)器視覺(jué)接口函數(shù),能有效縮短復(fù)雜機(jī)器視覺(jué)產(chǎn)品的研發(fā)時(shí)間[8]。
4.1 ? 視頻數(shù)據(jù)實(shí)時(shí)顯示
本文基于OpenCV庫(kù)中的VideoWrite類實(shí)現(xiàn)視頻信息的實(shí)時(shí)顯示,該類提供了從攝像機(jī)和視頻文件獲取視頻數(shù)據(jù)的接口,用以讀取和控制視頻流、處理每一幀圖像;為達(dá)到實(shí)時(shí)采集與顯示的效果,使用Visual Studio 2010提供的軟件定時(shí)器,設(shè)置每10毫秒從視頻數(shù)據(jù)流中讀取當(dāng)前每一幀視頻數(shù)據(jù),并將其在Visual Studio 2010的Picture控件中周期性的更新顯示出來(lái)。無(wú)線視頻傳輸系統(tǒng)的實(shí)時(shí)顯示功能實(shí)現(xiàn)步驟如下:
(1)使用VideoCapture類的Open()函數(shù)實(shí)現(xiàn)對(duì)視頻服務(wù)器的視頻流獲取。
capture.open("http://192.168.***.**:8080/?action=stream?dummy=param.mjpg");
(2)創(chuàng)建視頻播放顯示的窗口。
namedWindow("ImageShow");
hWnd = (HWND)cvGetWindowHandle
("ImageShow");
hParent=::GetParent(hWnd);
::SetParent(hWnd,GetDlgItem(IDC_STATIC)->m_hWnd);
::ShowWindow(hParent,0);
通過(guò)namedWindow()函數(shù)指定ImageShow為視屏顯示的窗口,并獲取該窗口的指針hWnd,為了使視頻數(shù)據(jù)能在基于MFC類庫(kù)編寫的軟件界面上顯示,使用SetParent()函數(shù)將MFC的Picture控件設(shè)置為ImageShow窗口的父窗口。
(3)設(shè)置軟件定時(shí)器。
SetTimer(1,10,NULL);
使用SetTimer()函數(shù)創(chuàng)建一個(gè)ID號(hào)為1的定時(shí)器,設(shè)置該定時(shí)器每10毫秒觸發(fā)一次MFC類的WM_TIMER消息并通過(guò)OnTimer()函數(shù)對(duì)觸發(fā)的消息進(jìn)行響應(yīng)和處理。
(4)編寫OnTimer()函數(shù)響應(yīng)定時(shí)器1的觸發(fā)消息,實(shí)現(xiàn)對(duì)視頻數(shù)據(jù)的實(shí)時(shí)獲取和顯示。
Void CvideoDlg::OnTimer(UINT_PTR nIDEvent)
{
……
case 1:// 對(duì)定時(shí)器1的觸發(fā)消息進(jìn)行響應(yīng)
{
//采集每一幀圖像并對(duì)其進(jìn)行顯示
}
……
}
可在OnTimer()函數(shù)中對(duì)獲取到的每一幀視頻數(shù)據(jù)進(jìn)行處理,如圖像去抖、特征點(diǎn)提取、目標(biāo)監(jiān)測(cè)等相關(guān)操作,直至完成數(shù)據(jù)的采集、處理和播放。
(5)視頻采集結(jié)束后,終止定時(shí)器。
KillTimer(1);
視頻數(shù)據(jù)實(shí)時(shí)顯示功能實(shí)際測(cè)試效果分別如圖3和圖4所示。
圖3和圖4分別為室內(nèi)環(huán)境下和戶外遠(yuǎn)程測(cè)試環(huán)境下的視頻數(shù)據(jù)采集和實(shí)時(shí)顯示情況,由圖3和圖4可知客戶端獲取得到的視頻數(shù)據(jù)清晰,系統(tǒng)運(yùn)行流暢無(wú)卡頓。
4.2 ? 視頻數(shù)據(jù)的保存
本文基于OpenCV庫(kù)中的VideoWrite類實(shí)現(xiàn)視頻信息的寫入存儲(chǔ),為確保視頻數(shù)據(jù)的連續(xù)不間斷保存,使用Visual Studio 2010提供的軟件定時(shí)器,設(shè)置了每10毫秒從視頻流中獲取一幀圖像數(shù)據(jù),然后將每一幀圖像數(shù)據(jù)經(jīng)VideoWrite類write()函數(shù)周期性寫入事先指定的視頻文件。視頻保存功能實(shí)現(xiàn)步驟如下:
(1)使用VideoWrite類的Open()函數(shù)對(duì)即將保存的視頻數(shù)據(jù)進(jìn)行文件名、視頻編碼格式、幀率、保存視頻的高度和寬度等參數(shù)進(jìn)行設(shè)置。
time=CTime::GetCurrentTime();
m_strTime = time.Format("%Y年%m月%d日%H時(shí)%M分%S秒");
sprintf(vname,"E:\\robot%s.avi", m_strTime);
fps = capture.get(CAP_PROP_FPS);
size((int)capture.get(CAP_PROP_FRAME_WIDTH),(int)capture.get(CAP_PROP_FRAME_HEIGHT));
writer.open(vname,CV_FOURCC('M', 'J', 'P', 'G'), 25, size);
(2)創(chuàng)建軟件定時(shí)器。
SetTimer(2,10,NULL);
創(chuàng)建一個(gè)ID號(hào)為2的軟件定時(shí)器,設(shè)置觸發(fā)時(shí)間為10毫秒。
(3)根據(jù)需要在MFC提供的回調(diào)函數(shù)OnTimer()中實(shí)現(xiàn)將視頻信息的周期性寫入指定的視頻保存文件,代碼如下:
Void CvideoDlg::OnTimer(UINT_PTR nIDEvent)
{
……
case 2://對(duì)定時(shí)器2的觸發(fā)消息進(jìn)行響應(yīng)
{
//處理每一幀圖像,將其按規(guī)定的格式寫入指定的文件
}
……
}
(4)視頻數(shù)據(jù)存儲(chǔ)完成時(shí),關(guān)閉定時(shí)2。
KillTimer(2);
視頻保存測(cè)試效果如圖5所示。
5 ? 結(jié)論(Conclusion)
本文設(shè)計(jì)和實(shí)現(xiàn)了一種可應(yīng)用于艦載無(wú)人機(jī)的基于嵌入式Linux技術(shù)的無(wú)線視頻傳輸系統(tǒng)。該系統(tǒng)采用Client/Sever的架構(gòu)模式,以嵌入式RAM開(kāi)發(fā)板作為視頻信息采集的硬件平臺(tái),通過(guò)搭建MJPG-streamer服務(wù)器軟件對(duì)視屏模塊采集的信息進(jìn)行處理和傳輸;以Visual Studio 2010作為遠(yuǎn)程客戶端開(kāi)發(fā)平臺(tái),利用OpenCV技術(shù)構(gòu)建了客戶端視頻實(shí)時(shí)顯示和存儲(chǔ)軟件;測(cè)試表明:該系統(tǒng)能有效實(shí)現(xiàn)視頻信息的采集、處理、傳輸以及顯示和存儲(chǔ)功能,系統(tǒng)運(yùn)行穩(wěn)定,遠(yuǎn)程客戶端獲取得到的視頻信息清晰流暢,系統(tǒng)軟硬件成本較低且采用免費(fèi)跨平臺(tái)的開(kāi)源控件簡(jiǎn)單易于推廣使用,具備一定的實(shí)用價(jià)值。
參考文獻(xiàn)(References)
[1] 劉振興,戴耀.艦載無(wú)人機(jī)系統(tǒng)電子對(duì)抗作戰(zhàn)運(yùn)用研究[J].飛航導(dǎo)彈,2017(3):53-56.
[2] 陳劍棟,蔡程,上官信.淺談無(wú)人機(jī)在海事監(jiān)管領(lǐng)域的應(yīng)用[J].珠江水運(yùn),2019,480(08):38-40.
[3] 姜永成,周正干,任福君.基OpenC的移動(dòng)機(jī)器人視頻流采集與處理[J].機(jī)床與液壓,2010,038(015):40-43.
[4] 宋蘊(yùn)璞,陳元.基于嵌入式Linux及MJPG-streamer的雙目立體視覺(jué)系統(tǒng)設(shè)計(jì)[J].物聯(lián)網(wǎng)技術(shù),2016,6(3):102-104.
[5] 卓磊,周律,楊麗紅.基于穿線法的計(jì)算器數(shù)字識(shí)別[J].軟件工程,2018(12):1-3.
[6] 楊東瓊,云利軍,王坤.Linux和OK6410環(huán)境下視頻圖像的采集與顯示[J].云南師范大學(xué)學(xué)報(bào):自然科學(xué)版,2016,36(170):52-57.
[7] 王偉.雷達(dá)模擬器系統(tǒng)研制與開(kāi)發(fā)[D].荊州:長(zhǎng)江大學(xué),2013.
[8] 吳昭質(zhì).火災(zāi)視頻識(shí)別及遠(yuǎn)程智能報(bào)警系統(tǒng)[D].南京:南京郵電大學(xué),2015.
作者簡(jiǎn)介:
周文博(1986-),男,碩士,助理工程師.研究領(lǐng)域:嵌入式開(kāi)發(fā),視頻監(jiān)控.
張 ?勇(1977-),男,碩士,工程師.研究領(lǐng)域:嵌入式開(kāi)發(fā),無(wú)線電導(dǎo)航定位.
孫良義(1981-),男,本科,工程師.研究領(lǐng)域:視頻監(jiān)控,無(wú)線電導(dǎo)航定位.
蘇 ?軍(1980-),男,碩士,工程師.研究領(lǐng)域:嵌入式開(kāi)發(fā),水聲通信.