基于QCamera类的摄像头QT应用程序开发与后端图像处理
2018-02-25郑忠梢蒋学程罗志灶
郑忠梢 蒋学程 罗志灶
摘要 QT是一种跨平台开发环境,可以开发windows、android下的各种应用程序,所以深受程序员喜爱。现在笔记本、手机基本上都自带摄像头,所以开发摄像头应用程序也成了十分热门的一个方向。QT内部自带一个QCamera类使得它的摄像头应用程序开发变得非常简单。主要从摄像头的信息获取、摄像头的选择、摄像头的打开、摄像头图像回显、摄像头资源的关闭退出等几个方面介绍QT中的摄像头应用程序开发,并对获得的图像信息做了一些简单的锐化处理,使得结果易于让计算机进行对比分析,讨论了锐化处理中遇到的一些问题。
【关键词】QCamera类 摄像头 应用程序开发锐化 sharpening android
目前国内手机市场和笔记本市场几近饱和,大部分人群基本人手一部手机,在校大学生几乎人手一台笔记本电脑,在这些设备上摄像头又是它们的标准配置。要想提高这些设备的市场竞争力,摄像头应用程序的开发非常必要,比如可以使用它们完成图像识别、美颜拍照、视频拍摄截图等等。手机上,可以用它开发表情识别、人脸识别、二维码、道路识别。笔记本上在添加了摄像头选择功能之后,选择多个摄像头资源,读取其他摄像头的视频信息甚至可以开发其他的摄像头应用程序,简单的有视频监控,复杂的图像信号采集、视频信号采集等等。总之,摄像头是一种常用的视频输入设备,利用摄像头采集图像信息,并对图像信息进行处理,已经广泛地运用在日常生活中。本文主要论述QT中如何采用QCamera类实现摄像头应用程序开发,以达到利用摄像头作为其他应用程序的软件基础。针对笔记本、手机目前预装的摄像头大多为定焦摄像头,而且对于运动图像拍摄截图过程中,图像比较模糊,不利于后期处理的问题,我们做了一些基于QT creator的,图像锐化处理算法实验,本文就实验方法和结果进行了一些讨论
1 开发平台
1.1 QT的基本介绍
QTcreator是一款跨平台的C++图形界面应用程序框架由挪威TrollTech公司出品,开放源代码,完全面向对象,模块化程度高,可重用性好,容易扩展,允许真正的组件编程,提供了信号/槽机制,替代回调函数,使组件间信号信号传递更安全、简单,应用非常广泛。QT还提供了多达250个以上的C++类。并且在界面显示,用户操作等方面借鉴了一些VS系列的所见即所得风格,程序员编程方便,最终的的app用户使用简单。在图像操作方面creator提供了一个最为简单易用的控件QPixmap和QCamera类配套使用十分方便,QCamera类获得的图像可以直接在内存级别上存储入QPixmap,方便后期的图像预处理。而且QCamera类还可以简单方便的获取计算机的摄像头信息,选择、调用硬件摄像头,拍摄视频或者静态图像并截图。用户在QPixmap控件上进行预览再对图像进行加工处理。
1.2 QCamera类的具体剖析
Qt5.0及以上版本中的QMultimedia多媒体包,包含了许多媒体相关的类,其中的QCamera类用于打开系统的摄像头设备。在QT中QCamera类中QCameraViewfinder可以用来实时回显当前摄像头所采集到的动态信息,也可以用QCameraImageCapture函数实现拍照功能。QCameralnfo函数则可以查阅连接到本机的摄像头的信息,以供程序、用户选择。
2 图像的获取和预处理
图像处理(image processing),一般我们说的图像处理都是指数字图像处理,也就是用计算机对图像进行分析,以达到所需结果的技术。又称影像处理。数字图像是指用工业相机、摄像机、扫描仪等设备经过拍摄得到的一个大的二维数组,该数组的元素称为像素,其值称为灰度值。彩色图像,也就是R(红)G(绿)B(蓝)三种基色的混合,实际上可以看作是3个二维数组,分别存储了图像各自的红绿蓝三种颜色的信息,图像处理技术一般包括图像压缩,增强和复原,匹配、描述和识别3个部分,对于图像处理既有基于像素级的运算处理方法(例如简单的二值化处理、亮度增减处理),也有把整个二维数组进行傅里叶变换或者在其他变换域进行处理的方法(比如模糊、锐化处理、对比度、色差调节)。
2.1 启用摄像头获取图像和其他信息
因为QCamera类是一个可视化的类,所以首先要在QT中新建一个普通的窗口工程,这样才能够有一个承载QCamera类回显的界面。而窗体中一般的控件是不能回显QCamera类的输出的,QCamera类的输出分为CaptureViewfinder、CaptureStilllmage、CaptureVideo分別对应取景模式、固定图像模式、录像模式。分别可以用来,取景、拍照、录像,所以它们需要回显一个图像/视频的载体,这个载体可以是普通窗体widget类,也可以是一个label类控件。免驱动摄像头实际上更严谨一点应该称其为HID协议摄像头,是因为wmdows自带了它的驱动,所以在用户使用时可以将其作为免驱摄像头看待。
具体方法如下:首先,在新建的窗口工程的主窗体中需要显示图像/视频的位置添加一个label类控件,然后右键点击该控件,在右侧弹出的复选框中选择“提升为”QVideoWidget类控件,将其提升为视频组件这样普通的label类控件就具有了视频回显的承载属性,以便于我们的程序在其中进行视频回显和图像处理,之后我们可以在后面将摄像头的输出视频流显示在上面,也可以对其截取图像保存完成拍照或者用于后期的图像处理等功能程序。
2.2 摄像头信息获取
如果想进一步完善功能,觉得图像/视频回显的承载部分还不够,我们还可以取得视频信号的输入采集设备部分的信息。QT中QCamera类中可以采用QListcam_s:在程序中建立一个摄像头信息列表,其中存放了系统中对应的摄像头信息,比如前后摄像头、摄像头ID号等等。这样我们可以用于其他应用程序开发时制定和判别摄像头,获得摄像头的帧数、分辨率等信息。
2.3 打开摄像头并设置模式
有了视频输出承载控件和摄像头列表信息,只要选择系统的一个摄像头,并且执行打开摄像头并选择摄像头工作模式、指定输出端就可以进行简单的图像采集了。具体的后续视频开发程序就可以在输出的视频流上做进一步的处理。具体过程如下:首先,定义一个摄像头指针,QCamera *zzk_camera;用于一会儿存放摄像头地址。
然后,把指针指向摄像头信息列表中的对应摄像头部分,zzk camera=newQCamera(cam_s[cam_num]);
根据cam num可以选择不同的摄像头,完成多个摄像头的选择。接着设置摄像头的工作模式可以采用函数setCaptureMode()完成,QT中QCamera类一共可以控制摄像头有三种工作模式:CaptureViewfinder、CaptureStilllmage、CaptureVideo,即取景模式、静态摄影模式、录像模式;我们一般采用取景模式,再到看到合适的图像时通过事件或者按钮触发拍照完成图像截取,过程犹如平常的相机工作原理一般。
3 过程
3.1 设置输出视频流对象
有了以上的基础后,再用setViewfinder()函数设置输出视频流到刚才设置好的视频流承载对象上就可以完成图像/视频应用程序的开发了,如图1所示,是一个简单的Windows摄像头拍照程序例程序的截图。
3.2 对获得图像进行卷积滤波,获得锐化效果
从图2可以看到,摄像头获得照片还是比较模糊的的,如果我们需要对它进行图像识别,就需要对他进行一定的预处理,比如简单的锐化操作一线性滤波。
线性滤波算是图像处理最基本的方法首先,我们建立一个二维的滤波矩阵(卷积核)作用于待处理的二维图像。对于图像的每一个像素点,计算它的邻域像素和滤波器矩阵的对应元素的乘积,然后加起来,作为该像素位置的值。这也可以认为是二维卷积滤波过程,示意图如图3所示。
对图像和滤波矩阵进行逐个元素相乘再求和的操作就相当于将一个二维的函数移动到另一个二维函数的所有位置,这样的操作就是卷积操作。
卷积操作可以说是图像处理最基本的操作,但却非常有用。它非常关键的特点就是是线性的,而且具有平移不变性shifi-invariant。平移不变性指我们在图像的每个位置都执行相同的操作。线性指这个操作是线性的,也就是我们用每个像素的邻域的线性组合来代替这个像素。这两个属性使得这个操作非常简单,因为线性操作是最简单的,然后在所有地方都做同样的操作就更简单了,也就适合计算机运算了,处理速度就会加快。
二维卷积需要4个嵌套循环,所以影响了程序处理速度,通过是我们使用了较小的卷积核,3x3矩阵但是太小的矩阵又会影响锐化效果,较大的矩阵锐化效果好,计算速度就比较慢这是不可避免的一个矛盾。
图4是我们采用25x25的核运算获得结果,我们可以看到锐化效果已经比较让人满意。
4 结语
QT中引入了“信号-槽”机制后,程序中类的封装机制得到相当大的提高,同时引入了QCamera类使得了摄像头相关的应用程序开发变得十分快捷方便有效,一个摄像头开发程序熟练的程序员只需要很短的时间就可以完成视频流或者图像信号的获取,为后续的图像应用程序开发提供了大大的方便,是一种十分方便有效的摄像头开发应用工具。而且我们发现,在做滤波锐化处理时,矩阵必须是奇数大小的二维矩阵,这样才能保证滤波矩阵存在中心,不至于发生翻转。至于矩阵的大小,也就是变换的半径直接决定了变换的效果和计算机处理效率。另外,滤波器矩阵所有的元素之和应该要等于l,这是为了保证滤波前后图像的亮度保持不变。如果滤波器矩阵所有元素之和大于1,那么滤波后的图像就会比原图像更亮,反之,如果小于1,那么得到的图像就会变暗。如果和为O,图像不会变黑,但也会非常暗。
参考文献
[1]凌晓春,陈安,胡跃明.适用于精密电子装备的高分辨率图像采集系统[J],仪表技术与传感器,2011(10): 66-68.
[2]黄宇升,刘金清.基于DSP的人脸检测系统[J].电子测量技术,2010,33 (02):71-74.
[3]卞建林,绣花机电控系统花样的代码分析与实现[D].南京理工大學,2007 (07).
[4]连照亮,徐世国,基于Qt/Embedded在嵌入式Linux下的应用研究[J],微计算机信息,2010 (17):81-82.
[5]金繁,崔培雷.嵌入式Qt中信号与槽机制的研究[J],电子设计工程,2014 (24):168- 170.