基于i.MX6Q平台的图像融合实现
2019-04-04宁红扬李佩玥于淼
宁红扬 李佩玥 于淼
关键词: i.MX6Q平台; 图像融合; 双路摄像头; 程序设计; Alpha blending算法; 内核驱动
中图分类号: 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
0 引 言
高压电力设备由于表面附着污秽、绝缘性降低等原因会产生电晕现象,对电力设备的表面造成损伤。因此需要快速准确地检查出电晕放电的位置,及时更换损坏的部件,保证电力系统的可靠运行[1?2]。日盲紫外电晕探测技术是一种故障在线检测技术,具有虚景率低、抗干扰性强的特点。其关键技术之一就是基于可见光CCD和紫外CCD的双路图像融合技术。i.MX6Q平台是Freescale公司推出的面向多媒体设备的高性能低功耗应用处理器,基于ARM Cortex?A9四核结构,运行频率[3]最高可达1.2 GHz,具有性能稳定,视频图像处理资源丰富等优点。该处理器集成强大的视频图像处理子系统,包括内置的视频处理单元VPU、硬件加速图形处理单元GPU,以及两个独立的影像处理单元IPU,完成視频编解码、图形加速、连接摄像头和显示通路以及相关的处理、同步和控制等功能,并且该处理平台具备低功耗模式下的动态电源管理技术,便于手持式电晕探测仪开发。同时i.MX6Q平台可以运行Android操作系统,能够为用户提供良好的界面交互体验。
1 视频处理单元
在i.MX6Q平台中多媒体应用的处理流程为:IPU处理来自图像传感器的数据或者将数据送到显示设备,主要进行图像增强和图像转换,与编解码器相连。VPU是一种高性能多标准视频编解码引擎,对视频数据进行编解码操作,而GPU主要进行2D/3D或矢量图形的加速。VPU,GPU和IPU之间的数据流交换在系统内存中进行,由CPU进行控制。其中视频处理单元VPU是整个多媒体应用处理流程中的重要部分。该处理单元能执行多标准的视频编解码操作,兼容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],充分利用片上存储来实现高性能。
在如图1所示的VPU与主机软件的控制模型中[6],主机程序通常利用预先定义好的API函数来发送指令和相关参数进行VPU的控制。主机程序接收到来自VPU的中断,就标志着请求操作完成,获取相关的结果信息。在VPU内部由16位DSP内核即BIT处理器来控制内部的视频编解码操作。利用主机接口寄存器(Host Interface Register)实现与主机之间的命令和响应信号传输。而主机程序和VPU之间的所有像素数据和流数据的处理则是通过SDRAM的共享内存空间进行。
2 系统功能设计与实现
整个平台的软件架构主要基于Android系统本身的层次结构,由应用程序层(CameraApp)、应用程序框架层(CameraSevice)、硬件抽象层(CameraHAL)和内核驱动层(CameraDriver)组成[7?9]。其结构如图2所示。
最底层为内核驱动层,主要负责系统管理以及终端的硬件驱动;硬件抽象层增加接口模块以访问硬件驱动程序,并编译成动态文件Libcamera.so。对于应用程序框架层,由于Android系统的硬件访问服务通常运行在系统进程中,而使用这些硬件访问服务的应用程序运行在另外的进程中,Android系统提供Binder进程间通信机制来完成进程间的通信。提供服务的Server进程和使用服务的Client进程通过Android接口描述语言(Android Interface Definition Language,AIDL)来进行进程间通信。所以在应用程序框架层通过.aidl文件定义硬件访问服务接口实现硬件访问服务,并编写硬件访问服务中的JNI方法,编译成动态链接库LibcameraService.so。应用程序层通过Service Manager获得任务的Binder代理对象接口,进一步通过调用它的成员函数来实现文件的读取操作。
2.1 内核驱动层
2.1.1 驱动模块实现
1) Camera驱动
本次图像融合验证平台采用的是OV5640摄像头。OV5640摄像头支持两种传输模式,并行接口和MIPI接口。本平台前置摄像头采用的是并行接口,后置摄像头采用MIPI接口。OV5640摄像头驱动处于Linux V4L2架构下,由V4L2捕获接口实现。应用程序不能直接用摄像头驱动,而是用V4L2捕获驱动打开或关闭摄像头进行图像预览、捕获和控制操作。在i.MX6Q中,V4L2驱动是用I2C总线来实现摄像头的信号控制[10?11]。
2) IPU驱动
图像处理单元(Image Processing Unit,IPU)支持视频和图像处理功能,并为视频和静态图像传感器和显示设备提供接口。IPU驱动可以分为如下几个部分:基于现实和同步帧缓存的帧缓存驱动;进行IPU的预处理操作的V4L2捕获驱动;进行IPU的后期处理的V4L2输出驱动;为用户空间或V4L2驱动提供系统接口的IPU处理驱动;最后一个驱动是MXC显示驱动,用来作为一个简单的框架来管理IPU与显示设备(如LCD,LVDS,HDMI,MIPI等)的驱动之间的交互。
3) VPU驱动
VPU承担了所有的编解码操作和大多数的比特流数据的解析和打包工作。VPU的内核驱动负责系统控制和资源管理,为用户空间的应用程序层获取系统资源提供相应的IOCTL接口,用来进行内存分配和释放操作等。
4) 图像融合实现
为了充分利用i.MX6Q平台的硬件资源,在IPU驱动文件ipu_mux.c中采用系统固有的input层和overlay层面的Alpha属性进行透明度图像融合处理。
2.1.2 Alpha透明度融合原理
Alpha透明度法用RGB三个通道表示彩色功能图像,定义一个全局透明度[α],使高分辨率灰度图像以该透明度从中透出来。记彩色功能图像某一通道为前景A,高分辨率灰度图像为背景B,在透明度[α]下,融合图像相应的通道F可以表示为:
[F=(255-α)A+αB] (1)
式中,[α]为混合因子的整数型表示,其主要是颜色混合[12]。
将摄像头捕获图像编码后的帧缓存数据分别设为input层和overlay层,进行全局Alpha融合处理。程序实现如下:
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数据格式。在本平台中,混合因子[α]取值为100。memcpy(inbuf, yuvin1, isize),memcpy(ovbuf, yuvin2, ovsize)函数分别实现将input层源数据yuvin1拷贝到帧缓存区inbuf和将overlay層源数据yuvin2拷贝到帧缓存区ovbuf。
图3为对Camera获得的数据流进行编码的过程,解码的过程与这个流程相似。
2.2 硬件抽象层
在硬件抽象层(HAL)增加接口模块以访问上面定义的硬件驱动程序。Android系统的硬件抽象层以模块的形式管理各个接口,每一个硬件模块都对应一个动态链接库文件。在系统内部,每一个硬件抽象层模块都用结构体hw_module_t来描述,而硬件设备则用结构体hw_device_t来描述[13]。每一个硬件抽象层模块在内核中对应有一个驱动程序,它们是通过读/写设备文件进行通信的。在开发包顶层目录hardware/libhardware/include/hardware下创建头文件定义模块和设备的ID,模块和设备的结构体。在设备结构体中,fd表示设备文件描述符。然后定义设备打开关闭接口设备读写接口,若设备操作函数的参数id与设备ID匹配,就可以执行设备文件的操作,进而实现硬件设备的调用。
2.3 应用程序框架层
JNI(Java Native Interface)用来实现Java与上述已编译好的驱动代码的交互。因此需要编写JNI方法为应用程序框架层提供Java接口。在frameworks/base/services/jni目录中,创建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动态库文件。
2.4 应用程序层实现
将应用框架层生成的libcamera.so库拷贝到应用程序的jni目录下,进行接下来的应用程序的设计和编写。程序设计的基本流程如图4所示。
VPU软件被分为两部分,除内核驱动外,还有用户空间的库文件和应用程序,用户空间的应用程序会调用相关的IOCTL接口和编解码库函数来实时完成复杂的编解码操作。通过接口AudioManager audioManager = (AudioManager) getSystemService (Context. AUDIO_
SERVICE)来获得系统服務,并在Androidmanifest.xml文件中完成android.hardware. camera(调用自定义的相机),android.permission. ACCESS_ SURFACE_ FLINGER(Android平台上底层的图形显示支持,一般用于游戏或照相机预览界面和底层模式的屏幕截图),android. permission. RECORD_ AUDIO(允许程序录制声音通过手机或耳机的麦克)等功能的注册。
平台的界面显示部分工作流程如图5所示。
点击双路摄像头融合.apk文件后显示APP初始界面,然后调用后置MIPI接口摄像头的帧缓存数据实现实时预览。用户点击屏幕界面弹出菜单选项,对各配置项进行选择,获取对应缓存数据。该平台系统可以实现如下功能:视频的实时预览、摄像头的拍照、两路视频数据基于透明度的融合,用户可以根据菜单列表选型进行模式选择(A/B/AB通道),设置.mp4或.jpeg文件的存储路径以便进行文件的查阅。
3 系统测试
图6为整体的测试平台。其包括底板和核心板两个部分:核心板上集成了处理器、内存、电源管理、EMMC等;底板上集成了各个功能接口,如Camera MIPI接口、HDMI接口和LCD接口等。
双通道进行Alpha透明度融合得到的图像如图7所示。将两个摄像头分别拍到的用手机手电筒发出的光源和天花板墙体进行透明度融合,可以看到前景和背景的重叠效果。
设置图像的分辨率为1 080[×]720,两个通道的帧率均设置为30 f/s,在0~255之间对透明度Alpha取不同的值,利用Eclipse软件的Logcat显示的日志信息进行测试,取前30组数据,将每组的测试结果绘制成图8。
将上述测试数据取平均值后得到的不同Alpha下的平均融合时间列成表格,如表1所示。可以得到平均融合时间约为41 ms,再加上其他程序代码的执行时间,最后测试融合视频的帧率为15 f/s,即闪烁频率高于15 Hz的电晕火花都可以被捕捉到,基本符合目标要求。
4 结 语
本文详细介绍了基于Android系统的i.MX6Q平台图像融合开发过程。通过底层驱动的开发实现了双路可见光摄像头采集数据的融合处理,通过Android的应用程序的开发为用户提供良好的界面交互体验。摄像头采集图像和显示屏的图像显示稳定清晰,且效果较好,完成了日盲紫外电晕探测平台的关键技术的验证。后续将加入密保识别等图像融合算法做进一步深入的研究,更好地完善该图像融合平台。
参考文献
[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] 董建新,袁晓辉,潘瑞龙.全日盲紫外成像探测仪光学系统设计[J].现代电子技术,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].现代计算机,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视频编解码系统的设计与实现[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].无线电通信技术,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内核设计思想[M].北京:人民邮电出版社,2017.
LIN Xuesen. In?depth understanding of the Android core design ideas [M]. Beijing: Posts & Telecom Press, 2017.
[9] 王宪臻,王志刚,牛宝超.基于Android平台的智能手持终端Camera模组驱动设计与研究[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驱动研究与实现[J].现代电子技术,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系统源代码情景分析[M].北京:电子工业出版社,2012.
LUO Shengyang. Scenario analysis for source codes of Android system [M]. Beijing: Publishing House of Electronics Industry, 2012.