郝 朝,山 壽,劉升護(hù)
(中國飛行試驗(yàn)研究院,陜西 西安 710089)
在飛行試驗(yàn)中,視頻數(shù)據(jù)能夠全面、直觀、時(shí)效、客觀地反映人機(jī)交互動(dòng)作,是試飛工程師給出航空武器裝備鑒定/定型試飛結(jié)論的重要依據(jù)[1]。目前機(jī)載記錄視頻數(shù)據(jù)格式為TS流,文件后綴名為*.m2t,采用現(xiàn)有的視頻播放軟件像暴風(fēng)影音等即可進(jìn)行播放。機(jī)載視頻影像數(shù)據(jù)自身是沒有時(shí)間的,時(shí)標(biāo)疊加在每一幀視頻畫面的左上角,無法直接進(jìn)行獲取。課題人員通常關(guān)心的關(guān)鍵數(shù)據(jù)段較短,在對(duì)機(jī)載記錄的視頻數(shù)據(jù)進(jìn)行回放時(shí),為了查找關(guān)鍵時(shí)刻的視頻數(shù)據(jù),采用現(xiàn)有播放軟件進(jìn)行播放時(shí)通過拖動(dòng)進(jìn)度條進(jìn)行查找無法實(shí)現(xiàn)精確絕對(duì)時(shí)間快速定位,數(shù)據(jù)回放效率較低。
基于以上分析,提出了一種基于OpenCV的機(jī)載視頻圖像時(shí)間識(shí)別方案,采用OpenCV技術(shù)對(duì)每幀圖像中的時(shí)間進(jìn)行識(shí)別,在每幀數(shù)據(jù)前面打上對(duì)應(yīng)的時(shí)間戳,通過時(shí)間跳轉(zhuǎn)進(jìn)行視頻圖像快速定位。
OpenCV[2-3](open source computer vision library)是一個(gè)開源的計(jì)算機(jī)視覺庫。OpenCV由一系列C語言函數(shù)和少量C++類構(gòu)成,還為Matlab等其他語言提供相應(yīng)的接口[4-5],在圖像處理和計(jì)算機(jī)視覺等方面實(shí)現(xiàn)了很多通用算法,對(duì)圖像處理和視頻技術(shù)的二次開發(fā)大有裨益。OpenCV主體可分為5個(gè)模塊[6],其中4個(gè)模塊如圖1所示。另一個(gè)模塊CvAux包括一些過時(shí)以及新出現(xiàn)的算法和函數(shù)。
圖1 OpenCV的基本結(jié)構(gòu)
OpenCV的圖像和矩陣運(yùn)算能力極為強(qiáng)大,使得開發(fā)效率和程序運(yùn)行的可靠性得到顯著提高。OpenCV是一個(gè)包括300多個(gè)C/C++函數(shù)的跨平臺(tái)的中高層API,既可獨(dú)立運(yùn)行,也可使用其他庫。Windows和Linux兩種平臺(tái)可供開發(fā)者選擇。
在飛行試驗(yàn)視頻數(shù)據(jù)回放中,需要截取當(dāng)前視頻流圖像并保存為BMP文件以便進(jìn)行后續(xù)圖像處理,包括圖像預(yù)處理、特征提取和判決等處理流程,如圖2所示。
圖2 圖像識(shí)別處理流程
獲取圖像信息,就是從試飛視頻流中截取當(dāng)前圖像,用紅、綠、藍(lán)三基色的8位亮度值(RGB值)[7]表示圖像,RGB值的范圍為0~255。
圖像預(yù)處理[8],就是采用圖像增強(qiáng)、濾波和變換等方式,去除相關(guān)噪聲,將原始圖像變成適用于計(jì)算機(jī)進(jìn)行特征提取的形式。圖像增強(qiáng)就是利用數(shù)學(xué)方法提高圖像中人們所關(guān)注部分的清晰度,削弱無用信息,突出有用信息,包括去除噪聲、修正灰度、圖像平滑、腐蝕與銳化等。圖像變換是指使用傅里葉變換、小波變換等數(shù)學(xué)方法的性質(zhì)和特點(diǎn),將圖像空間轉(zhuǎn)換到頻域空間,提高運(yùn)算速度并改善圖像質(zhì)量。
圖像特征提取,就是對(duì)當(dāng)前圖像信息進(jìn)行歸納與分析,提取出能反映當(dāng)前圖片本質(zhì)的可用于圖像判決的特征量。
圖像判決,通過特征量與域值進(jìn)行的計(jì)算分析,判斷圖像狀態(tài),給出最終結(jié)果。
機(jī)載視頻時(shí)標(biāo)只存在于視頻畫面的左上角位置,因此為了提高圖像識(shí)別的速度,只需對(duì)一幀圖像的左上角部分區(qū)域進(jìn)行處理。對(duì)圖像進(jìn)行處理須經(jīng)過以下幾個(gè)步驟:
(1)采用高斯模糊算法對(duì)圖像進(jìn)行平滑處理,減少圖像的噪聲或失真。
cvSmooth(src_img, src_img,CV_GUASSIAN,5,0);
(2)對(duì)圖像進(jìn)行灰度處理[9]。
cvCvtColor(src_img,gray_img,CV_BGR2GRAY);
(3)對(duì)圖像進(jìn)行直方圖均衡化處理,增強(qiáng)圖像的亮度及對(duì)比度。
Ipllmage *img_zf=cvCreateImage(size,IPL_DEPTH_8U,1);
cvEqualizeHist(gray_img, img_zf);
cvReleaseImage(&gray_img);
(4)對(duì)圖像進(jìn)行二值化處理。
Ipllmage *img2=cvCreateImage(size,IPL_DEPTH_8U,1);
cvThreshold(img_zf,img2,50,255,CV_THRESH_BINARY_INV);
cvReleaseImage(&img_zf);
(5)細(xì)化處理。
Ipllmage *img3=cvCreateImage(size,IPL_DEPTH_8U,1);
cvZero(img3);
cvThin(img2, img3,5);
cvReleaseImage(&img2);
(6)圖像腐蝕[10],去掉圖像的邊緣毛刺。
Ipllmage *img4=cvCreateImage(size,IPL_DEPTH_8U,1);
CvErode(img3,img4,NULL,1);
cvReleaseImage(&img3);
(7)圖像膨脹[11-12],擴(kuò)大圖像邊緣,使圖像表面更平滑。
lplConvKernel *iplele=cvCreateStruringElementEx(3,3,0,0,CV_SHAPE_RECT);
cvDilate(img4,img4,iplele,1);
cvReleaseStructuringElement(&iplele);
(8)查找輪廓,進(jìn)行數(shù)字分割。
Ipllmage *img5=cvCreateImage(size,IPL_DEPTH_8U,1);
cvCopy(img4,img5);
CvSeq *contour=NULL;
CvMemStorage *storage=cvCreateMemStorage(0);
cvFindContours(img5,storage,&contour,sizeof(CvContour),CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);
cvReleaseImage(&img5);
圖像匹配技術(shù)[13]是指根據(jù)已知圖像模式(基準(zhǔn)模板)從實(shí)時(shí)圖像中搜索相同或相似圖像模式的過程。圖像匹配就是要根據(jù)參考圖像和實(shí)時(shí)圖像來選定某些特征、相似性準(zhǔn)則及搜索策略進(jìn)行相關(guān)運(yùn)算,以確定匹配的最佳空間對(duì)應(yīng)點(diǎn),得到不同圖像之間的相似度。
常用的圖像匹配方法有基于線形形狀的匹配、模板匹配[14-15]、利用射影空間的匹配等。在試飛視頻數(shù)據(jù)中,機(jī)載記錄的視頻數(shù)據(jù)在硬件正常的情況下是不存在干擾與噪聲的,因此采用基于模板匹配的OCR算法[16]來對(duì)試飛圖像進(jìn)行識(shí)別是一種有效方法。模板就是數(shù)字0到數(shù)字9的字符圖像,而模板匹配就是在一幅大圖像中搜尋目標(biāo),該目標(biāo)與模板有同樣的方向、尺寸和圖像元素,通過一定的算法在圖中找到目標(biāo)圖像。將數(shù)字0到數(shù)字9以圖片的形式保存到字符數(shù)據(jù)庫中作為模板進(jìn)行對(duì)象匹配。首先將待識(shí)別數(shù)字字符進(jìn)行二值化處理,然后將其從尺寸進(jìn)行縮放,與字符數(shù)據(jù)庫中的模板大小保持一致,與數(shù)據(jù)庫中的模板依次進(jìn)行匹配分析,給出最佳識(shí)別結(jié)果。該算法識(shí)別率高,實(shí)現(xiàn)較簡單,也有一定程度的抗干擾能力。通過OpenCV的matchTemplate函數(shù)進(jìn)行模板匹配后,可以得到一個(gè)映射圖,這張圖中最大值的地方便是匹配度最大的子圖的左上角坐標(biāo),可以使用minMaxLoc函數(shù)獲得子圖位置和相應(yīng)分?jǐn)?shù),再進(jìn)行后續(xù)操作。
機(jī)載記錄數(shù)據(jù)格式為標(biāo)準(zhǔn)的TS流文件,視頻解碼與顯示采用開源的FFmpeg與SDL庫實(shí)現(xiàn)。FFmpeg是一個(gè)開源且跨平臺(tái)的音視頻流方案,是自由軟件中最完備的一套多媒體支持庫,為音視頻轉(zhuǎn)換、解碼以及流化提供了完整的解決方案。音視頻編解碼庫為libavcodec,相關(guān)數(shù)據(jù)結(jié)構(gòu)包括AVFormatContext、AVCodecContext、AVCodec、AVPacket、AVFrame與AVPicture等。調(diào)用FFmpeg解碼視頻流的流程為:
(1)avcodec_register_all()。首先初始化FFmpeg以及注冊(cè)解碼器,在后面的過程中,將使用已注冊(cè)的解碼器對(duì)視頻流進(jìn)行解碼。
(2)avcodec_open2()。打開指定格式(H.264或MPEG4)的解碼器。
(3)avcodec_decode_video2()。使用相應(yīng)的解碼器對(duì)獲取到的每幀視頻數(shù)據(jù)進(jìn)行解碼。
依次讀取一幀視頻數(shù)據(jù)調(diào)用(3)即可對(duì)視頻流進(jìn)行解碼,并獲得解碼后的YUV數(shù)據(jù),對(duì)YUV數(shù)據(jù)進(jìn)行數(shù)據(jù)格式轉(zhuǎn)換和處理,用于視頻顯示。
SDL(simple directmedia layer)是一套基于C語言的跨平臺(tái)多媒體開發(fā)庫,提供了多種控制音視頻輸入與輸出的函數(shù)。SDL顯示YUV數(shù)據(jù)流程如下:
(1)SDL_Init()。初始化SDL。
(2)SDL_CreateWindow()。創(chuàng)建SDL顯示窗口用于視頻播放。
(3)SDL_CreateRender()?;诖翱趧?chuàng)建渲染器,用于渲染SDL_Texture至SDL_Window。
(4)SDL_CreateTexture()。創(chuàng)建紋理用于顯示YUV數(shù)據(jù),一個(gè)SDL_Texture對(duì)應(yīng)一幀YUV數(shù)據(jù)。
(5)SDL_UpdateTexture()。設(shè)置紋理的像素?cái)?shù)據(jù)。
(6)SDL_RenderCopy()。將紋理數(shù)據(jù)復(fù)制給渲染目標(biāo)。
(7)SDL_RenderPresent()。顯示畫面。
采用FFmpeg將一幀視頻圖像解碼為YUV數(shù)據(jù),然后調(diào)用(5)~(7)即可實(shí)現(xiàn)SDL播放與顯示。
考慮到播放視頻時(shí)要對(duì)視頻進(jìn)行拖動(dòng)進(jìn)度條、暫停等操作,為了充分利用系統(tǒng)資源,采用多線程并發(fā)技術(shù),以用戶UI界面操作為主線程,視頻解碼與顯示為子線程,同時(shí)視頻顯示子線程接收主線程消息進(jìn)行視頻畫面的暫停、截圖等操作。通過消息機(jī)制傳遞參數(shù)實(shí)現(xiàn)多線程間通信。當(dāng)主線程對(duì)視頻線程進(jìn)行操作的時(shí)候,視頻顯示線程進(jìn)入等待狀態(tài),直到消息響應(yīng)喚醒該線程。使用SDL封裝的SDL_thread 來進(jìn)行線程管理。創(chuàng)建顯示線程使用SDL_CreateThread,操作視頻畫面時(shí)使用SDL_WaitThread實(shí)現(xiàn)線程間通信等待,退出使用SDL_KillThread來關(guān)閉視頻顯示線程。
實(shí)際應(yīng)用效果如圖3所示。首先采用圖像處理與識(shí)別技術(shù)對(duì)機(jī)載視頻每幀圖像進(jìn)行預(yù)處理,對(duì)時(shí)間進(jìn)行識(shí)別,然后在每幀視頻數(shù)據(jù)前打上對(duì)應(yīng)的時(shí)間戳。在進(jìn)行視頻數(shù)據(jù)回放時(shí)只需要輸入關(guān)鍵動(dòng)作段時(shí)刻即可快速定位至該幀圖像。應(yīng)用效果表明,利用OpenCV能夠準(zhǔn)確識(shí)別當(dāng)前圖像的時(shí)間,通過時(shí)間跳轉(zhuǎn)功能可迅速定位至指定時(shí)間的圖像。
圖3 實(shí)際應(yīng)用效果
為了解決機(jī)載視頻關(guān)鍵圖像快速定位的問題,設(shè)計(jì)了基于OpenCV的試飛視頻數(shù)據(jù)快速回放軟件。采用基于OpenCV的圖像識(shí)別技術(shù)對(duì)機(jī)載視頻進(jìn)行預(yù)處理,識(shí)別每幀處理后圖像中的時(shí)間,然后在每幀視頻數(shù)據(jù)前打上相應(yīng)的時(shí)間戳,在進(jìn)行回放時(shí)通過時(shí)間對(duì)比實(shí)現(xiàn)圖像快速定位。該技術(shù)已經(jīng)應(yīng)用于多個(gè)型號(hào)的飛行試驗(yàn)視頻數(shù)據(jù)回放中,可以通過指定時(shí)間快速跳轉(zhuǎn)到該幀畫面,正確性和可靠性得到驗(yàn)證,有效提高了視頻數(shù)據(jù)回放效率,為保障型號(hào)試飛的高效順利進(jìn)行發(fā)揮重要作用。