APP下载

基于嵌入式的人脸图像采集显示系统的制作

2015-04-16郭中华连亿东伍冯洁向光成

电脑与电信 2015年7期
关键词:人脸嵌入式摄像头

郭中华 连亿东 伍冯洁 向光成 杨 智

(1.中山大学南方学院,广东 广州 510655;2.广州大学实验中心,广东 广州 510006;3.深圳市广天川科技有限公司,广东 深圳 518129;4.中山大学,广东 广州 510655)

1 系统架构

本系统的图像采集采用USB摄像头,处理器使用三星公司的S5PV210,该处理器内部集成PowerVR SGX540高性能图形引擎,适合对图像进行处理。由于本人脸图像采集系统后续作为人脸识别使用,所以在该系统中移植了OpenCv以便后续对人脸进一步处理,系统整体架构如图1。

图1 系统整体架构

2 系统环境设置

通过USB摄像头获取的人脸图像要能正常在LCD屏上显示,开发板上需要设置以下环境,具体设置如下。

2.1 系统基本环境配置

本文中使用的USB摄像头驱动为UVC类摄像头,从2.6.26版本开始,Linux UVC驱动被添加到内核中,对内核进行配置就可以使用UVC。以下是配置步骤:

2.2 移植OpenCv

OpenCv是一个计算机视觉库,包含许多对图像处理的函数,也包括了对摄像头设备的访问和从摄像头设备捕获图像的函数。使用OpenCv库函数来访问摄像头,返回的图像数据指针非常有利于后续使用OpenCv的其它图像处理函数。笔者在Linux系统下使用Cmake-gui配置交叉编译OpenCv所需的makefile文件,根据预定设计在移植时有以下关键设置需要注意:

(1)指定操作系统

Operating System:填写Linux,要注意大小写。

(2)头文件索引模式

Include Mode:需要设置为Search only in Target Root,这样在编译的时候会优先选择交叉编译工具链目录下的.h文件,以保证交叉编译的顺利进行。

(3)OpenCv编译添加选项

WITH_V4L:使用OpenCv的库函数来打开USB摄像头设备必须勾上的一个选项。OpenCv有直接打开摄像头的库函数,依赖于V4L,如果没有配置这一个选项,很可能会导致在ARM嵌入式中打不开摄像头设备。

2.3 Qt中OpenCv的添加

编写Qt程序时,使用了OpenCv中的函数,需要为编译工具指明所引用的.h头文件和.so库文件的路径。具体方法为:打开Qt工程中的.pro文件,在其中添加OpenCv的.h和.so文件路径。本文移植OpenCv后,ARM版的OpenCv库文件在PC上的位置是:/usr/local/arm/opencv2.4.9.2/。根据本文的配置,在Qt工程中的.pro文件中添加以下内容以完成在Qt中添加OpenCv。

3 人脸图像的采集

为了对采集到的人脸图像做进一步处理,本系统使用了计算机视觉库OpenCv,通过opencv采集人脸图像的具体流程如图2。

图2 视频图像获取流程

(1)打开视频设备

本系统对摄像头设备进行访问采用的是opencv自带的函数cvCaptureFromCAM(index),index参数代表打开的摄像头,其中-1代表随机打开一个摄像头,0、1、2…分别代表/dev/video0、/dev/video1、/dev/video2…。调用改函数打开摄像头设备后会返回一个CvCapture指针。在OpenCv中,CvCapture专门用来存储视频类型文件的一些主要信息,如分辨率等等。主要代码如下:

(2)获取一帧图像

在确保摄像头打开成功过后,则是对图像信息的获取,通过OpenCv中提供函数cvQueryFrame()可以获取下一帧图像,并返回一个IplImage指针。在OpenCv中,IplImage专门来用存储图像的信息,也是OpenCv中处理图像的通用参数格式。主要代码如下:

IplImage*frame;//创建一个IplImage指针

frame=cvQueryFrame(capture);//从摄像头视频流中获取一帧图像

(3)关闭视频设备

OpenCv中提供函数cvReleaseCapture(CvCapture**capture),通过释放Capture关闭摄像头设备。主要代码如下:

cvReleaseCapture(capture);

4 人脸图像的显示

基于嵌入式Linux常见的GUI系统有MiniGUI、MicroWindows、OpenGUI和基于 Framebuffer的 Qt/Embedded。Qt提供了一个图形用户界面应用程序的开发框架,在这些基础上做视频图像的显示非常方便。本系统采用Qt/Embedded作为开发平台,将通过OpenCv获取到的图像内容绘制在LCD屏幕上进行显示。

4.1 人脸图像显示流程

根据预定设计最终人脸图像将显示到LCD屏上,为了使系统具有更好的人机交互性,在这里使用Qt作为图形化用户界面,其具体实现流程图3所示。

图3 图像显示程序流程图

4.2 Qt显示人脸图像的具体实现

为了将人脸图像在嵌入式板上流畅地显示出来,笔者做了以下改进:

(1)显示界面大小设置

在Qt工程中打开.ui文件,拖出一个Label部件,如果屏幕足够大,将Label的大小调整为使用的摄像头采集图像支持的最大分辨率得以完整显示全部图像内容,如本文采用的LCD屏幕分辨率为800*480,摄像头采集的图像分辨率为640*480,则可以把Label设置为640*480,以此得到最佳的界面显示效果。

(2)颜色通道转换

在OpenCv中,Iplimage的颜色通道顺序是BGR;而在Qt中,Qimage的颜色通道顺序是RGB,为了使Qt正确地显示出每一帧的图像的颜色,需要将每一帧图像的通道顺序从BGR调整为RGB,OpenCv已提供了对应的函数cvCvtColor(const CvArr*src,CvArr*dst,int code)[1]。主要代码如下:

cvCvtColor(frame,frame,CV_BGR2RGB);//第一个参数为源图像,第二个参数为结果输出图像,第三个参数为转换方案。

(3)使用Qimage[2]

Qt中的Qimage类对应OpenCv的IplImage,是专门用来处理图像的一个类。使用OpenCv的函数打开摄像头,返回的是IplImage结构的指针,IplImage的图像数据赋值给Qimage,在Qt的Label上显示。主要代码如下:

#define image_Format QImage::Format_RGB888//图像显示格式

QImage qimage=QImage((uchar*)frame->imageData,frame->width,frame->height,image_Format);//创建一个 Qimage对象,即Qimage图像,其宽和高由原来的IplImage指定,图像显示格式为RGB888,图像数据直接赋给Qimage图像。

(4)将Qimage加载到Label上

QPixmap类可以实现将图像绘制在一个Label上,根据图像的大小设定好Label的尺寸可以更完整地呈现图像。主要代码如下∶ui->Label->setPixmap(QPixmap∶fromImage(qimage));

(5)添加定时器,间隔刷新界面

图像数据的连续采集和显示是通过定时器实现的,QTimer类提供了定时器信号和单触发定时器。设置定时启动触发周期,每当定时器时间到就触发一个定时器事件,在事件中调用VIDIOCMCAPTURE函数完成对图像的采集,并通过QPixmap类将图像显示到LCD上[3]。

5 结论

本文基于三星s5pv210处理器和嵌入式Linux系统,结合使用OpenCv和Qt编程详细介绍了通过USB摄像头实时显示视频图像的一种方案。通过实验测试对比使用在Qt中添加V4L2驱动方式采集图像的方式[4],发现本文采用的方案在采集和显示图像的流畅度更好一些。此外,该方案适用于使用OpenCv进一步对图像进行处理,可大大减少如人脸识别等计算机视觉处理系统的开发成本和周期,经推广可用于计算机视觉项目涉及的多个领域。

[1]李明瑞.嵌入式人脸检测与识别系统的研究与实现[D].长沙理工大学,2012:39-40.

[2]陈鹏.基于ARM11的嵌入式人脸识别系统的设计和实现[D].郑州:郑州大学信息工程学院,2013:17-17.

[3]吴健.基于ARM的嵌入式USB图像[J].现代显示,2011,第127期:41-42.

[4]白长清,陈沛.嵌入式终端基于Linux V4L2的图像采集系统[J].科技资讯,2012:22-23.

猜你喜欢

人脸嵌入式摄像头
浙江首试公路非现场执法新型摄像头
摄像头连接器可提供360°视角图像
有特点的人脸
一起学画人脸
TS系列红外传感器在嵌入式控制系统中的应用
三国漫——人脸解锁
搭建基于Qt的嵌入式开发平台
嵌入式软PLC在电镀生产流程控制系统中的应用
奔驰360°摄像头系统介绍
长得象人脸的十种动物