郝 朝,山 壽,劉升護
(中國飛行試驗研究院,陜西 西安 710089)
在飛行試驗中,視頻數據能夠全面、直觀、時效、客觀地反映人機交互動作,是試飛工程師給出航空武器裝備鑒定/定型試飛結論的重要依據[1]。目前機載記錄視頻數據格式為TS流,文件后綴名為*.m2t,采用現有的視頻播放軟件像暴風影音等即可進行播放。機載視頻影像數據自身是沒有時間的,時標疊加在每一幀視頻畫面的左上角,無法直接進行獲取。課題人員通常關心的關鍵數據段較短,在對機載記錄的視頻數據進行回放時,為了查找關鍵時刻的視頻數據,采用現有播放軟件進行播放時通過拖動進度條進行查找無法實現精確絕對時間快速定位,數據回放效率較低。
基于以上分析,提出了一種基于OpenCV的機載視頻圖像時間識別方案,采用OpenCV技術對每幀圖像中的時間進行識別,在每幀數據前面打上對應的時間戳,通過時間跳轉進行視頻圖像快速定位。
OpenCV[2-3](open source computer vision library)是一個開源的計算機視覺庫。OpenCV由一系列C語言函數和少量C++類構成,還為Matlab等其他語言提供相應的接口[4-5],在圖像處理和計算機視覺等方面實現了很多通用算法,對圖像處理和視頻技術的二次開發大有裨益。OpenCV主體可分為5個模塊[6],其中4個模塊如圖1所示。另一個模塊CvAux包括一些過時以及新出現的算法和函數。

圖1 OpenCV的基本結構
OpenCV的圖像和矩陣運算能力極為強大,使得開發效率和程序運行的可靠性得到顯著提高。OpenCV是一個包括300多個C/C++函數的跨平臺的中高層API,既可獨立運行,也可使用其他庫。Windows和Linux兩種平臺可供開發者選擇。
在飛行試驗視頻數據回放中,需要截取當前視頻流圖像并保存為BMP文件以便進行后續圖像處理,包括圖像預處理、特征提取和判決等處理流程,如圖2所示。

圖2 圖像識別處理流程
獲取圖像信息,就是從試飛視頻流中截取當前圖像,用紅、綠、藍三基色的8位亮度值(RGB值)[7]表示圖像,RGB值的范圍為0~255。
圖像預處理[8],就是采用圖像增強、濾波和變換等方式,去除相關噪聲,將原始圖像變成適用于計算機進行特征提取的形式。圖像增強就是利用數學方法提高圖像中人們所關注部分的清晰度,削弱無用信息,突出有用信息,包括去除噪聲、修正灰度、圖像平滑、腐蝕與銳化等。圖像變換是指使用傅里葉變換、小波變換等數學方法的性質和特點,將圖像空間轉換到頻域空間,提高運算速度并改善圖像質量。
圖像特征提取,就是對當前圖像信息進行歸納與分析,提取出能反映當前圖片本質的可用于圖像判決的特征量。
圖像判決,通過特征量與域值進行的計算分析,判斷圖像狀態,給出最終結果。
機載視頻時標只存在于視頻畫面的左上角位置,因此為了提高圖像識別的速度,只需對一幀圖像的左上角部分區域進行處理。對圖像進行處理須經過以下幾個步驟:
(1)采用高斯模糊算法對圖像進行平滑處理,減少圖像的噪聲或失真。
cvSmooth(src_img, src_img,CV_GUASSIAN,5,0);
(2)對圖像進行灰度處理[9]。
cvCvtColor(src_img,gray_img,CV_BGR2GRAY);
(3)對圖像進行直方圖均衡化處理,增強圖像的亮度及對比度。
Ipllmage *img_zf=cvCreateImage(size,IPL_DEPTH_8U,1);
cvEqualizeHist(gray_img, img_zf);
cvReleaseImage(&gray_img);
(4)對圖像進行二值化處理。
Ipllmage *img2=cvCreateImage(size,IPL_DEPTH_8U,1);
cvThreshold(img_zf,img2,50,255,CV_THRESH_BINARY_INV);
cvReleaseImage(&img_zf);
(5)細化處理。
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],擴大圖像邊緣,使圖像表面更平滑。
lplConvKernel *iplele=cvCreateStruringElementEx(3,3,0,0,CV_SHAPE_RECT);
cvDilate(img4,img4,iplele,1);
cvReleaseStructuringElement(&iplele);
(8)查找輪廓,進行數字分割。
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);
圖像匹配技術[13]是指根據已知圖像模式(基準模板)從實時圖像中搜索相同或相似圖像模式的過程。圖像匹配就是要根據參考圖像和實時圖像來選定某些特征、相似性準則及搜索策略進行相關運算,以確定匹配的最佳空間對應點,得到不同圖像之間的相似度。
常用的圖像匹配方法有基于線形形狀的匹配、模板匹配[14-15]、利用射影空間的匹配等。在試飛視頻數據中,機載記錄的視頻數據在硬件正常的情況下是不存在干擾與噪聲的,因此采用基于模板匹配的OCR算法[16]來對試飛圖像進行識別是一種有效方法。模板就是數字0到數字9的字符圖像,而模板匹配就是在一幅大圖像中搜尋目標,該目標與模板有同樣的方向、尺寸和圖像元素,通過一定的算法在圖中找到目標圖像。將數字0到數字9以圖片的形式保存到字符數據庫中作為模板進行對象匹配。首先將待識別數字字符進行二值化處理,然后將其從尺寸進行縮放,與字符數據庫中的模板大小保持一致,與數據庫中的模板依次進行匹配分析,給出最佳識別結果。該算法識別率高,實現較簡單,也有一定程度的抗干擾能力。通過OpenCV的matchTemplate函數進行模板匹配后,可以得到一個映射圖,這張圖中最大值的地方便是匹配度最大的子圖的左上角坐標,可以使用minMaxLoc函數獲得子圖位置和相應分數,再進行后續操作。
機載記錄數據格式為標準的TS流文件,視頻解碼與顯示采用開源的FFmpeg與SDL庫實現。FFmpeg是一個開源且跨平臺的音視頻流方案,是自由軟件中最完備的一套多媒體支持庫,為音視頻轉換、解碼以及流化提供了完整的解決方案。音視頻編解碼庫為libavcodec,相關數據結構包括AVFormatContext、AVCodecContext、AVCodec、AVPacket、AVFrame與AVPicture等。調用FFmpeg解碼視頻流的流程為:
(1)avcodec_register_all()。首先初始化FFmpeg以及注冊解碼器,在后面的過程中,將使用已注冊的解碼器對視頻流進行解碼。
(2)avcodec_open2()。打開指定格式(H.264或MPEG4)的解碼器。
(3)avcodec_decode_video2()。使用相應的解碼器對獲取到的每幀視頻數據進行解碼。
依次讀取一幀視頻數據調用(3)即可對視頻流進行解碼,并獲得解碼后的YUV數據,對YUV數據進行數據格式轉換和處理,用于視頻顯示。
SDL(simple directmedia layer)是一套基于C語言的跨平臺多媒體開發庫,提供了多種控制音視頻輸入與輸出的函數。SDL顯示YUV數據流程如下:
(1)SDL_Init()。初始化SDL。
(2)SDL_CreateWindow()。創建SDL顯示窗口用于視頻播放。
(3)SDL_CreateRender()?;诖翱趧摻ㄤ秩酒?,用于渲染SDL_Texture至SDL_Window。
(4)SDL_CreateTexture()。創建紋理用于顯示YUV數據,一個SDL_Texture對應一幀YUV數據。
(5)SDL_UpdateTexture()。設置紋理的像素數據。
(6)SDL_RenderCopy()。將紋理數據復制給渲染目標。
(7)SDL_RenderPresent()。顯示畫面。
采用FFmpeg將一幀視頻圖像解碼為YUV數據,然后調用(5)~(7)即可實現SDL播放與顯示。
考慮到播放視頻時要對視頻進行拖動進度條、暫停等操作,為了充分利用系統資源,采用多線程并發技術,以用戶UI界面操作為主線程,視頻解碼與顯示為子線程,同時視頻顯示子線程接收主線程消息進行視頻畫面的暫停、截圖等操作。通過消息機制傳遞參數實現多線程間通信。當主線程對視頻線程進行操作的時候,視頻顯示線程進入等待狀態,直到消息響應喚醒該線程。使用SDL封裝的SDL_thread 來進行線程管理。創建顯示線程使用SDL_CreateThread,操作視頻畫面時使用SDL_WaitThread實現線程間通信等待,退出使用SDL_KillThread來關閉視頻顯示線程。
實際應用效果如圖3所示。首先采用圖像處理與識別技術對機載視頻每幀圖像進行預處理,對時間進行識別,然后在每幀視頻數據前打上對應的時間戳。在進行視頻數據回放時只需要輸入關鍵動作段時刻即可快速定位至該幀圖像。應用效果表明,利用OpenCV能夠準確識別當前圖像的時間,通過時間跳轉功能可迅速定位至指定時間的圖像。

圖3 實際應用效果
為了解決機載視頻關鍵圖像快速定位的問題,設計了基于OpenCV的試飛視頻數據快速回放軟件。采用基于OpenCV的圖像識別技術對機載視頻進行預處理,識別每幀處理后圖像中的時間,然后在每幀視頻數據前打上相應的時間戳,在進行回放時通過時間對比實現圖像快速定位。該技術已經應用于多個型號的飛行試驗視頻數據回放中,可以通過指定時間快速跳轉到該幀畫面,正確性和可靠性得到驗證,有效提高了視頻數據回放效率,為保障型號試飛的高效順利進行發揮重要作用。