寧紅揚 李佩玥 于淼
關(guān)鍵詞: i.MX6Q平臺; 圖像融合; 雙路攝像頭; 程序設計; Alpha blending算法; 內(nèi)核驅(qū)動
中圖分類號: TN911.73?34 ? ? ? ? ? ? ? ? ? 文獻標識碼: A ? ? ? ? ? ? ? ? ? ? ? ? 文章編號: 1004?373X(2019)06?0001?05
Abstract: The low?power and high?performance i.MX6Q embedded development platform of NXP is selected to collect and fuse dual?channel video images, so as to realize technology verification of the hand?held corona mobile detector. The drive framework mainly constituted by the video processing unit (VPU), image processing unit (IPU) and camera based on the Linux V4L2 architecture is constructed in this paper. The program design of the access interface and control algorithm is conducted for the hardware abstraction layer, application program framework layer, and application program layer on the basis of the kernel drive program. The images collected by the dual?channel camera are processed by the Alpha blending algorithm, so as to realize image fusion of dual?channel visible light videos. The test results show that the man?machine interaction interface is friendly, the video acquisition images are stable and clear, and the fusion operation effect is smooth, which lays a foundation for the subsequent study of UV?visible light dual?channel detection.
Keywords: i.MX6Q platform; image fusion; dual?channel camera; program design; Alpha?blending algorithm; kernel drive
高壓電力設備由于表面附著污穢、絕緣性降低等原因會產(chǎn)生電暈現(xiàn)象,對電力設備的表面造成損傷。因此需要快速準確地檢查出電暈放電的位置,及時更換損壞的部件,保證電力系統(tǒng)的可靠運行[1?2]。日盲紫外電暈探測技術(shù)是一種故障在線檢測技術(shù),具有虛景率低、抗干擾性強的特點。其關(guān)鍵技術(shù)之一就是基于可見光CCD和紫外CCD的雙路圖像融合技術(shù)。i.MX6Q平臺是Freescale公司推出的面向多媒體設備的高性能低功耗應用處理器,基于ARM Cortex?A9四核結(jié)構(gòu),運行頻率[3]最高可達1.2 GHz,具有性能穩(wěn)定,視頻圖像處理資源豐富等優(yōu)點。該處理器集成強大的視頻圖像處理子系統(tǒng),包括內(nèi)置的視頻處理單元VPU、硬件加速圖形處理單元GPU,以及兩個獨立的影像處理單元IPU,完成視頻編解碼、圖形加速、連接攝像頭和顯示通路以及相關(guān)的處理、同步和控制等功能,并且該處理平臺具備低功耗模式下的動態(tài)電源管理技術(shù),便于手持式電暈探測儀開發(fā)。同時i.MX6Q平臺可以運行Android操作系統(tǒng),能夠為用戶提供良好的界面交互體驗。
在i.MX6Q平臺中多媒體應用的處理流程為:IPU處理來自圖像傳感器的數(shù)據(jù)或者將數(shù)據(jù)送到顯示設備,主要進行圖像增強和圖像轉(zhuǎn)換,與編解碼器相連。VPU是一種高性能多標準視頻編解碼引擎,對視頻數(shù)據(jù)進行編解碼操作,而GPU主要進行2D/3D或矢量圖形的加速。VPU,GPU和IPU之間的數(shù)據(jù)流交換在系統(tǒng)內(nèi)存中進行,由CPU進行控制。其中視頻處理單元VPU是整個多媒體應用處理流程中的重要部分。該處理單元能執(zhí)行多標準的視頻編解碼操作,兼容H.264 BP/MP/HP,VC?1 SP/MP/AP,MPEG?4 SP/ASP(除GMC),DivX (Xvid),MPEG?1/2,VP8,AVS和MJPEG解碼,且支持H.264,MPEG?4,H.263和MJPG編碼。VPU支持全高清1 920×1 080的60i或30p解碼以及1 920×1 088編碼。它能同時使用多個視頻編解碼標準來進行多個視頻剪輯片段的編解碼操作[4?5],充分利用片上存儲來實現(xiàn)高性能。
在如圖1所示的VPU與主機軟件的控制模型中[6],主機程序通常利用預先定義好的API函數(shù)來發(fā)送指令和相關(guān)參數(shù)進行VPU的控制。主機程序接收到來自VPU的中斷,就標志著請求操作完成,獲取相關(guān)的結(jié)果信息。在VPU內(nèi)部由16位DSP內(nèi)核即BIT處理器來控制內(nèi)部的視頻編解碼操作。利用主機接口寄存器(Host Interface Register)實現(xiàn)與主機之間的命令和響應信號傳輸。而主機程序和VPU之間的所有像素數(shù)據(jù)和流數(shù)據(jù)的處理則是通過SDRAM的共享內(nèi)存空間進行。
整個平臺的軟件架構(gòu)主要基于Android系統(tǒng)本身的層次結(jié)構(gòu),由應用程序?qū)樱–ameraApp)、應用程序框架層(CameraSevice)、硬件抽象層(CameraHAL)和內(nèi)核驅(qū)動層(CameraDriver)組成[7?9]。其結(jié)構(gòu)如圖2所示。
最底層為內(nèi)核驅(qū)動層,主要負責系統(tǒng)管理以及終端的硬件驅(qū)動;硬件抽象層增加接口模塊以訪問硬件驅(qū)動程序,并編譯成動態(tài)文件Libcamera.so。對于應用程序框架層,由于Android系統(tǒng)的硬件訪問服務通常運行在系統(tǒng)進程中,而使用這些硬件訪問服務的應用程序運行在另外的進程中,Android系統(tǒng)提供Binder進程間通信機制來完成進程間的通信。提供服務的Server進程和使用服務的Client進程通過Android接口描述語言(Android Interface Definition Language,AIDL)來進行進程間通信。所以在應用程序框架層通過.aidl文件定義硬件訪問服務接口實現(xiàn)硬件訪問服務,并編寫硬件訪問服務中的JNI方法,編譯成動態(tài)鏈接庫LibcameraService.so。應用程序?qū)油ㄟ^Service Manager獲得任務的Binder代理對象接口,進一步通過調(diào)用它的成員函數(shù)來實現(xiàn)文件的讀取操作。
2.1 ?內(nèi)核驅(qū)動層
2.1.1 ?驅(qū)動模塊實現(xiàn)
1) Camera驅(qū)動
本次圖像融合驗證平臺采用的是OV5640攝像頭。OV5640攝像頭支持兩種傳輸模式,并行接口和MIPI接口。本平臺前置攝像頭采用的是并行接口,后置攝像頭采用MIPI接口。OV5640攝像頭驅(qū)動處于Linux V4L2架構(gòu)下,由V4L2捕獲接口實現(xiàn)。應用程序不能直接用攝像頭驅(qū)動,而是用V4L2捕獲驅(qū)動打開或關(guān)閉攝像頭進行圖像預覽、捕獲和控制操作。在i.MX6Q中,V4L2驅(qū)動是用I2C總線來實現(xiàn)攝像頭的信號控制[10?11]。
2) IPU驅(qū)動
圖像處理單元(Image Processing Unit,IPU)支持視頻和圖像處理功能,并為視頻和靜態(tài)圖像傳感器和顯示設備提供接口。IPU驅(qū)動可以分為如下幾個部分:基于現(xiàn)實和同步幀緩存的幀緩存驅(qū)動;進行IPU的預處理操作的V4L2捕獲驅(qū)動;進行IPU的后期處理的V4L2輸出驅(qū)動;為用戶空間或V4L2驅(qū)動提供系統(tǒng)接口的IPU處理驅(qū)動;最后一個驅(qū)動是MXC顯示驅(qū)動,用來作為一個簡單的框架來管理IPU與顯示設備(如LCD,LVDS,HDMI,MIPI等)的驅(qū)動之間的交互。
3) VPU驅(qū)動
VPU承擔了所有的編解碼操作和大多數(shù)的比特流數(shù)據(jù)的解析和打包工作。VPU的內(nèi)核驅(qū)動負責系統(tǒng)控制和資源管理,為用戶空間的應用程序?qū)荧@取系統(tǒng)資源提供相應的IOCTL接口,用來進行內(nèi)存分配和釋放操作等。
4) 圖像融合實現(xiàn)
為了充分利用i.MX6Q平臺的硬件資源,在IPU驅(qū)動文件ipu_mux.c中采用系統(tǒng)固有的input層和overlay層面的Alpha屬性進行透明度圖像融合處理。
2.1.2 ?Alpha透明度融合原理
Alpha透明度法用RGB三個通道表示彩色功能圖像,定義一個全局透明度[α],使高分辨率灰度圖像以該透明度從中透出來。記彩色功能圖像某一通道為前景A,高分辨率灰度圖像為背景B,在透明度[α]下,融合圖像相應的通道F可以表示為:
[F=(255-α)A+αB] (1)
式中,[α]為混合因子的整數(shù)型表示,其主要是顏色混合[12]。
將攝像頭捕獲圖像編碼后的幀緩存數(shù)據(jù)分別設為input層和overlay層,進行全局Alpha融合處理。程序?qū)崿F(xiàn)如下:
int ipu_yuvMux(unsigned char *yuvout, unsigned char *yuvin1, unsigned char *yuvin2)
{
int ret = 0;
struct timeval begin, end;
int sec, usec, run_time;
memcpy(inbuf, yuvin1, isize);
memcpy(ovbuf, yuvin2, ovsize);
task.overlay.alpha.gvalue = 100;
ret = ioctl(fd_ipu, IPU_QUEUE_TASK, &task);
…
}
memcpy(yuvout, outbuf, osize);
輸入圖像為YUV數(shù)據(jù)格式。在本平臺中,混合因子[α]取值為100。memcpy(inbuf, yuvin1, isize),memcpy(ovbuf, yuvin2, ovsize)函數(shù)分別實現(xiàn)將input層源數(shù)據(jù)yuvin1拷貝到幀緩存區(qū)inbuf和將overlay層源數(shù)據(jù)yuvin2拷貝到幀緩存區(qū)ovbuf。
圖3為對Camera獲得的數(shù)據(jù)流進行編碼的過程,解碼的過程與這個流程相似。
2.2 ?硬件抽象層
在硬件抽象層(HAL)增加接口模塊以訪問上面定義的硬件驅(qū)動程序。Android系統(tǒng)的硬件抽象層以模塊的形式管理各個接口,每一個硬件模塊都對應一個動態(tài)鏈接庫文件。在系統(tǒng)內(nèi)部,每一個硬件抽象層模塊都用結(jié)構(gòu)體hw_module_t來描述,而硬件設備則用結(jié)構(gòu)體hw_device_t來描述[13]。每一個硬件抽象層模塊在內(nèi)核中對應有一個驅(qū)動程序,它們是通過讀/寫設備文件進行通信的。在開發(fā)包頂層目錄hardware/libhardware/include/hardware下創(chuàng)建頭文件定義模塊和設備的ID,模塊和設備的結(jié)構(gòu)體。在設備結(jié)構(gòu)體中,fd表示設備文件描述符。然后定義設備打開關(guān)閉接口設備讀寫接口,若設備操作函數(shù)的參數(shù)id與設備ID匹配,就可以執(zhí)行設備文件的操作,進而實現(xiàn)硬件設備的調(diào)用。
2.3 ?應用程序框架層
JNI(Java Native Interface)用來實現(xiàn)Java與上述已編譯好的驅(qū)動代碼的交互。因此需要編寫JNI方法為應用程序框架層提供Java接口。在frameworks/base/services/jni目錄中,創(chuàng)建CameraRecord.cpp源程序,定義JNI方法列表如下:
static JNINativeMethod gMethods[] = {
{"vpuRecord0","()V",(void*)native_vpuRecord0},
{"vpuRecord1","()V",(void*)native_vpuRecord1},
{"vpuStop", "()V", (void*)native_vpuStop},
{"vpuPlay0", "()V", (void*)native_vpuPlay0},
{"vpuPlay1", "()V", (void*)native_vpuPlay1},
{"takePicture","()I", (void*)native_takePicture},
{"setVpuChNum","(I)V",(void*)native_setVpuChNum},
{"setVpuFileFlag","(I)V",(void*)native_setVpuFileFlag},
{"setSurface","(Landroid/view/Surface;)I",(void*)native_setSurface},
{"setSurfaceSize","(II)V",(void*)native_setSurfaceSize},
{"setMp4Name","(Ljava/lang/String;)V",(void*)native_setMp4Name},
{"setJpgName","(Ljava/lang/String;)V",(void*)native_setJpgName},
};
然后對本地接口方法進行注冊,并修改對應目錄的Android.mk文件,將此JNI方法進行交叉編譯,并導出生成的libcamera.so動態(tài)庫文件。
2.4 ?應用程序?qū)訉崿F(xiàn)
將應用框架層生成的libcamera.so庫拷貝到應用程序的jni目錄下,進行接下來的應用程序的設計和編寫。程序設計的基本流程如圖4所示。
VPU軟件被分為兩部分,除內(nèi)核驅(qū)動外,還有用戶空間的庫文件和應用程序,用戶空間的應用程序會調(diào)用相關(guān)的IOCTL接口和編解碼庫函數(shù)來實時完成復雜的編解碼操作。通過接口AudioManager audioManager = (AudioManager) getSystemService (Context. AUDIO_
SERVICE)來獲得系統(tǒng)服務,并在Androidmanifest.xml文件中完成android.hardware. camera(調(diào)用自定義的相機),android.permission. ACCESS_ SURFACE_ FLINGER(Android平臺上底層的圖形顯示支持,一般用于游戲或照相機預覽界面和底層模式的屏幕截圖),android. permission. RECORD_ AUDIO(允許程序錄制聲音通過手機或耳機的麥克)等功能的注冊。
平臺的界面顯示部分工作流程如圖5所示。
點擊雙路攝像頭融合.apk文件后顯示APP初始界面,然后調(diào)用后置MIPI接口攝像頭的幀緩存數(shù)據(jù)實現(xiàn)實時預覽。用戶點擊屏幕界面彈出菜單選項,對各配置項進行選擇,獲取對應緩存數(shù)據(jù)。該平臺系統(tǒng)可以實現(xiàn)如下功能:視頻的實時預覽、攝像頭的拍照、兩路視頻數(shù)據(jù)基于透明度的融合,用戶可以根據(jù)菜單列表選型進行模式選擇(A/B/AB通道),設置.mp4或.jpeg文件的存儲路徑以便進行文件的查閱。
圖6為整體的測試平臺。其包括底板和核心板兩個部分:核心板上集成了處理器、內(nèi)存、電源管理、EMMC等;底板上集成了各個功能接口,如Camera MIPI接口、HDMI接口和LCD接口等。
雙通道進行Alpha透明度融合得到的圖像如圖7所示。將兩個攝像頭分別拍到的用手機手電筒發(fā)出的光源和天花板墻體進行透明度融合,可以看到前景和背景的重疊效果。
設置圖像的分辨率為1 080[×]720,兩個通道的幀率均設置為30 f/s,在0~255之間對透明度Alpha取不同的值,利用Eclipse軟件的Logcat顯示的日志信息進行測試,取前30組數(shù)據(jù),將每組的測試結(jié)果繪制成圖8。
將上述測試數(shù)據(jù)取平均值后得到的不同Alpha下的平均融合時間列成表格,如表1所示??梢缘玫狡骄诤蠒r間約為41 ms,再加上其他程序代碼的執(zhí)行時間,最后測試融合視頻的幀率為15 f/s,即閃爍頻率高于15 Hz的電暈火花都可以被捕捉到,基本符合目標要求。
本文詳細介紹了基于Android系統(tǒng)的i.MX6Q平臺圖像融合開發(fā)過程。通過底層驅(qū)動的開發(fā)實現(xiàn)了雙路可見光攝像頭采集數(shù)據(jù)的融合處理,通過Android的應用程序的開發(fā)為用戶提供良好的界面交互體驗。攝像頭采集圖像和顯示屏的圖像顯示穩(wěn)定清晰,且效果較好,完成了日盲紫外電暈探測平臺的關(guān)鍵技術(shù)的驗證。后續(xù)將加入密保識別等圖像融合算法做進一步深入的研究,更好地完善該圖像融合平臺。
參考文獻
[1] 周影,婁洪偉,周躍,等.微弱日盲紫外電暈自動實時檢測方法[J].中國光學,2015,8(6):926?932.
ZHOU Ying, LOU Hongwei, ZHOU Yue, et al. Automatic real?time detection method of faint solar?blind ultraviolet corona [J]. Chinese journal of optics, 2015, 8(6): 926?932.
[2] 董建新,袁曉輝,潘瑞龍.全日盲紫外成像探測儀光學系統(tǒng)設計[J].現(xiàn)代電子技術(shù),2017,40(1):152?155.
DONG Jianxin, YUAN Xiaohui, PAN Ruilong. Design of optical system used for solar?blind UV imaging detector [J]. Modern electronics technique, 2017, 40(1): 152?155.
[3] 陳崇森.基于i.MX6Q+FPGA平臺Android下EIM總線接口設計[J].現(xiàn)代計算機,2016(13):60?65.
CHEN Chongsen. Design of EIM bus interface based on i.MX6Q+FPGA platform under Android [J]. Modern computer, 2016(13): 60?65.
[4] NXP. i.MX VPU application programming interface Linux? reference manual [EB/OL]. [2018?05?11]. https://www.nxp.com/docs/en/reference?manual/i.MX_VPU_Application_Programming_Interface_Linux_Reference_Manual.pdf.
[5] 葛翠麗.基于Freescale i.MX6的VPU視頻編解碼系統(tǒng)的設計與實現(xiàn)[D].沈陽:東北大學,2014.
GE Cuili. Design and implementation of video codec system based on Freescale i.MX6 VPU [D]. Shenyang: Northeastern University, 2014.
[6] 丁建橋,周磊,張正華.基于IMX53的視頻編碼的研究與應用[J].無線電通信技術(shù),2014,40(2):86?89.
DING Jianqiao, ZHOU Lei, ZHANG Zhenghua. Research and application of video coding based on IMX53 [J]. Radio communications technology, 2014, 40(2): 86?89.
[7] PHILLIPS B, STEWART C, MARSICANO K. Android programming: the big nerd ranch guide [M]. Altanta: Big Nerd Ranch, 2017.
[8] 林學森.深入理解Android內(nèi)核設計思想[M].北京:人民郵電出版社,2017.
LIN Xuesen. In?depth understanding of the Android core design ideas [M]. Beijing: Posts & Telecom Press, 2017.
[9] 王憲臻,王志剛,牛寶超.基于Android平臺的智能手持終端Camera模組驅(qū)動設計與研究[J].電子設計工程,2012,20(20):23?24.
WANG Xianzhen, WANG Zhigang, NIU Baochao. Design of camera module driver based on the Android platform of intelligent handled terminal [J]. Electronic design Engineering, 2012, 20(20): 23?24.
[10] NXP. i.MX Linux? users′ guide [EB/OL]. [2018?05?16]. https://www.nxp.com/docs/en/user?guide/i.MX_Linux_User′s_Guide.pdf.
[11] 李校林,孫文華,李銀.基于Linux平臺的OV2715驅(qū)動研究與實現(xiàn)[J].現(xiàn)代電子技術(shù),2016,39(22):71?75.
LI Xiaolin, SUN Wenhua, LI Yin. Research and implementation of OV2715 driver based on Linux [J]. Modern electronics technique, 2016, 39(22): 71?75.
[12] 霍星,解凱.多投影無縫拼接中Alpha融合的研究[J].北京印刷學院學報,2014,22(2):68?71.
HUO Xing, XIE Kai. Study on Alpha fusion in multi?projector′s seamless conjoin [J]. Journal of Beijing Institute of Graphic Communication, 2014, 22(2): 68?71.
[13] 羅升陽.Android系統(tǒng)源代碼情景分析[M].北京:電子工業(yè)出版社,2012.
LUO Shengyang. Scenario analysis for source codes of Android system [M]. Beijing: Publishing House of Electronics Industry, 2012.