贾丕军,贾 杰
(1.中国空空导弹研究院 河南 洛阳 471099;2.南昌航空大学 江西 南昌 330063)
一种多功能红外图像播放软件的设计实现
贾丕军1,贾 杰2
(1.中国空空导弹研究院 河南 洛阳 471099;2.南昌航空大学 江西 南昌 330063)
文中针对红外装置采集的信息图形化处理的需求,借鉴视频播放器的设计思路,采用动态链接库、ActiveX技术等模块化设计方法开发了红外图像播放软件。实践表明,该软件在用户界面上通过鼠标控制,可实现连续显示图像、显示单点或范围内像素信息的功能。基于红外信息的特点,该软件还可以通过辅助信息标识出目标位置,并旋转图像以符合惯性坐标系下视角。该软件的开始、暂停、停止和改变播放速度等播放控制功能,以及自动灰度调节、转换位图、转换视频等功能使红外信息处理更加方便,为类似图像处理需求提供了一种功能全面、运行稳定、适应性强的方法。
红外图像;播放控制;VC编程;多线程;ActiveX
随着红外技术的发展,红外成像系统获得了越来越广泛的应用。对于数据分析人员来讲,最直观的图像查看方式,莫过于像视频播放器那样连续显示图像。本文设计的红外图像播放软件,可以像视频播放器一样实现图像的顺序显示。此外还可以根据红外成像装置提供的参数信息,在图像上标识出感兴趣目标的位置;根据图像的背景灰度均值动态调整图像的灰度范围,以便于区分目标和背景;还可以对图像进行旋转以符合惯性坐标系下的视图。此外还有转换位图和视频的功能,可供演示汇报等场合使用。另外还支持用户鼠标的交互操作,便于查看单点或范围内信息。
软件各功能模块包括图像数据提取,红外成像装置参数提取,图像显示控制,图像播放控制,图像显示等部分。由于软件功能较复杂,所以采用了模块化设计方法,不仅降低了复杂度,也降低了各部分之间的耦合度,便于在此平台上实现不同类型的图像播放。其中,图像数据及参数提取通过动态链接库实现,一旦图像数据或参数格式有变化,只需要更新动态链接库就可以;图像显示控制和图像播放控制由主程序实现,完成对其它组件的控制;图像显示通过单独设计的ActiveX控件完成,其中封装了图像的绘制、旋转、根据指令录制avi格式视频以及用户鼠标交互的功能。各部分关系如图1所示。
包含红外图像及成像装置参数的数据文件由于来源不同,其文件格式通常不相同;此外图像的压缩算法往往也各不相同。
图1 软件各模块关系Fig. 1 Relationships between each module of the software
然而对于图像播放来说,只需提供原始的图像数据,以及成像装置参数信息即可。所以本文通过“针对接口设计”的软件工程方法,利用动态链接库封装图像数据和参数的提取[1],从而将数据格式的变化与图像播放隔离,提高了系统的稳定性。
从文件中提取数据需要知道数据的位置信息,该位置信息预先写入配置文件。动态链接库读取配置文件中的位置信息,并生成位置信息的链表,将该链表传递给提取函数。由提取函数利用链表的信息从文件中读取数据。
如果采用了不同的图像压缩算法,就单独编写该种压缩算法的解压缩函数,并将函数信息写入配置文件。提取动态链接库可以从配置文件中读取解压缩函数信息,然后调用该函数来完成图像解压缩。
图像显示控制包括:解算出成像装置给的目标位置和大小,在图像中标识出来;解算出需要旋转的角度,并对图像进行旋转;根据图像背景灰度值来调整图像灰度范围。其中前两项只需解算出有关参数,然后提供给主程序,再由主程序提供给图像显示模块。
第三项需求的产生是由于灰度图像的红绿蓝分量值相同且都是8位,而实际红外图像通常都超过8位,这就需要对数据进行截短。以图2为例,假设原始图像为14位,从中截取8位(例如取第10到第3位),然后判断更高位(14位到11位)是否全为0,如是则最终灰度值取为第10~第3位的数值,否则取为255。这样做的目的是为了保证值较大的数值截短后也较大,防止出现“1111 00000000 00”截短后反而比“0000 11111111 00”还要小的情况,导致图像失真。
图2 图像数值截短表示Fig. 2 Clipping of image value to reduce its length
这样处理能够保证图像不失真,但是会出现目标和背景无法区分的情况。比如所有像素点的14~11位都不是全零,那么所有像素灰度值都变为255,导致目标湮没在背景当中。这时就要根据图像的灰度均值来动态的调整截取的8位,保证区分开目标和背景。具体方法是:以2N×0.75(N取8~13)6个值将整个取值范围分为由低到高7段(分别对应截取8位的最高位为8~14),图像灰度均值落在哪一段,就截取相应的 8 位[2]。
图像播放软件需要在连续显示图像的同时,还能够响应用户的各种操作,所以必须通过多线程来实现[3]。主线程创建播放线程,并根据用户的操作控制播放线程,如图3所示。
图3 播放线程的创建及工作过程Fig. 3 Creation of playing-thread and its workflow
主线程除了创建播放线程还要同时创建WaitableTimer。WaitableTimer每隔一定时间就激活一次(Signaled),播放线程中的WaitForSingleObject函数就会结束等待,执行后面的播放一幅图像的操作。主程序可以通过设置WaitableTimer的激活时间间隔来控制播放的快慢。此外还可以通过调用CancelWaitableTimer来使WaitableTimer处于休眠状态,从而实现暂停播放的效果。继续播放只要唤醒WaitableTimer就可以。
图像显示部分的功能相对独立,所以采用ActiveX控件将该功能模块予以封装[4]。控件的OnDraw函数代码见下:
代码中首先创建了一个内存设备dcMem,以及相应的兼容位图。图形绘制,及像素值信息和统计信息的显示,首先在该内存设备上完成,最后再一并显示。这样可以提高效率并防止屏幕闪烁。
图形绘制由于涉及到图像旋转,所以调用函数SetWorldTransform来设置旋转一定角度后的世界坐标系,然后再在该坐标系下作图。在调用SetWorldTransform之前先要调用函数SetGraphicsMode(HDC hdc, int iMode),该函数的第二个参数iMode取为GM_ADVANCED,表示允许指定的dc进行世界坐标系的变换。SetWorldTransform(HDC hdc, CONST XFORM*lpXform)的第二个参数为转换的结构参数。设旋转角度为θ,lpXform所指向结构变量各分量eM11=-cos(θ),eM12=sin(θ),eM21=sin(θ),eM22=cos(θ)。图像绘制完成后,需要将世界坐标系恢复为正常。即赋值eM11=1,eM12=0,eM21=0,eM22=1,然后再调用一次SetWorldTransform。再设置图形模式为正常:调用函数SetGraphicsMode,第二个参数为GM_COMPATIBLE。
由于原始图像是矩形,如果直接旋转绘制到屏幕上就会超出控件的作图区域。针对图像有效区域为圆形的特点,通过创建椭圆区域,并调用函数SelectClipRgn将椭圆区域选入裁剪区[5],然后再作图,就可以达到在规定范围内绘制的效果。
用户鼠标右键单击可以显示单点的像素值,左键拉框可以显示选定范围内的最大最小值,均值和方差等统计信息。右键单击后,鼠标响应事件函数OnRButtonUp(UINT nFlags,CPoint point)被调用。在该函数中,point表示鼠标点击位置,首先要根据“鼠标位置/绘图区域尺寸×图像数据数组大小”的公式算出对应的图像数据数组的索引,然后根据索引取出像素值,交给右键信息绘制类对象m_cPointInfo,然后通过调用函数InvalidateControl引起控件重绘。在OnDraw函数中,m_cPointInfo通过在内存dc上输出文本将值信息显示给用户。用户左键拉框选取范围时,由于要动态显示用户选择的区域,使用了MFC类CRectTracker。该类可以在用户选择区域时,用矩形框标识出所选范围。用户左键按下时,消息函数OnLButtonDown被调用。在该函数中,调用CRectTracker类的TrackRubberBand函数,当用户鼠标松开时,该函数返回。此时CRectTracker类对象的m_rect变量代表所选择的区域,用上面获取单点值的办法也可以获取范围内的值。然后就可以算出这些值的最大最小,均值方差等统计信息。然后更新显示区域,OnDraw函数被调用,由m_ cStatisticInfo通过文本输出的方式显示给用户。
屏幕录像是通过创建avi流,并调用函数AVIStreamWrite往avi流中写入数据的方法来完成的[6]。上面OnDraw函数中,布尔变量m_bNewFrameToAvi的作用是控制采样率。由于红外成像装置的图像速率通常比较快,能够达到每秒几十甚至上百帧。通常的avi视频的帧频都是每秒二十多帧,再加上红外图像内容变化较慢,帧频还可以更低。这就需要对图像进行采样,比如每隔六帧取一帧,并设置m_bNewFrameToAvi为真,这样OnDraw函数就会只将该帧写入到avi视频文件当中,而忽略其它帧。考虑到视频播放的方便,avi视频没有采用压缩编码的方式。这样做的好处是,在汇报演示时可以避免因为没有解码器而导致无法播放。
文中介绍了该多功能图像播放软件的总体设计方法以及关键技术,并对部分实现过程中遇到的难点问题进行了详述。由于采用模块化设计方法,隔离了各功能独立模块,保证了软件整体的稳定性和可靠性。该软件自开发完成以来,在多个项目中得到应用,不同的项目只需在配置文件中设置文件格式,编写不同的图像解压缩函数,就可以继续使用该播放软件。很好的满足了图像浏览、演示等科研需求。
[1] David J.Kruglinski. Visual C++技术内幕[M].潘爱民,王国印,译.4版修订版.北京: 清华大学出版社,2009.
[2] 《编程之美》小组.编程之美[M].北京:电子工业出版社,2008.
[3] Charles Petzold. Windows程序设计[M].5版.方敏,张胜,梁路平,赵勇,译.北京: 清华大学出版社,2010.
[4] 宇鹏,王晓峰,李云飞.Visual C++实践与提高-ActiveX篇[M].北京:中国铁道出版社,2001.
[5] 官章全,韩云君,李罡.Visual C++ 6.0 高级编程范例[M].北京:电子工业出版社,2001.
[6] 陈国建,杨国祥,唐清荣.Visual C++范例开发大全[M].北京:清华大学出版社,2010.
The design and realization of a multifunctional software for infrared image playback
JIA Pi-jun1, JIA Jie2
(1. China Airborne Missle Academy, Luoyang 471099, China; 2. Nanchang Hangkong University,Nanchang 330063, China)
Aiming at the graphical processing of information acquired by infrared equipments, some instructive ideas are borrowed from the video player to develop a playback software for infrared images, using modular design methods such as dynamic link library and ActiveX technology. Practice shows that, the software can display images continuously, show pixel information of a single point or an area selected, under the control of users’ mouse. Based on the characteristics of infrared information, the software can also identify the targets, and rotate the image to match the inertial coordinate system perspective using the auxiliary information. Those playback functionalities as start, pause,stop and changing the playback speed, and automatically adjusting gray level, bitmap conversion, video conversion make the infrared information processing more conveniently, providing a comprehensive, stable, adaptable method for similar image processing.
infrared image; playback control; VC programming; multi-threading; ActiveX
TN98
A
1674-6236(2014)11-0185-03
2014–03–19 稿件编号:201403218
国家自然科学基金(61263012)
贾丕军(1982—),男,山西大同人,硕士,工程师。研究方向:数据处理软件设计。