JNI技术在基于OpenCV的人脸与微笑检测中的应用

2017-03-06 00:19王嘉鑫邹科文陈义明
软件导刊 2017年1期
关键词:人脸检测

王嘉鑫+邹科文+陈义明

摘要摘要:人脸识别技术是当前人工智能中较为热门的一个分支,已经有许多开源的视觉库为其奠定了良好基础,如OpenCV等,然而OpenCV在Java环境下有诸多不便。为了解决这一问题,介绍了JNI技术,以及在Java环境下,如何通过JNI调用OpenCV库实现人脸与微笑检测。实验结果表明,将JNI应用于Java虚拟机的人脸检测,可获得更高的人脸检测速度。

关键词关键词:OpenCV;人脸检测;微笑检测;JNI

DOIDOI:10.11907/rjdk.162330

中图分类号:TP319文献标识码:A文章编号文章编号:16727800(2017)001011502

随着人工智能技术的发展,机器学习、计算机视觉等领域也逐渐成为计算机科学中的热点问题,人脸检测便是计算机视觉中的一个分支。OpenCV作为一个开源的视觉库,提供了不少关于人脸检测的模型与处理接口,而大部分接口与算法均采用C/C++语言编写。Java虽有其跨平台的巨大优势,但是这种特性也给Java带来了局限性,在调用动态数据库文件时存在不便。因此,通过JNI工具,可以利用C/C++语言的特性弥补Java的不足[13]。

1相关技术原理

1.1JNI技术分析

JNI(Java Native Interface)提供了若干API 实现Java与其它语言的通信(主要是C/C++)。从Java 1.1开始,JNI标准成为Java平台的一部分,它允许Java和其它语言编写的代码进行交互。然而使用Java与本地已编译的代码交互,通常会丧失平台可移植性[45]。

通常遇到以下几种情况需要使用JNI:①所开发的程序需要用到其它平台属性,但在Java的标准库中不支持此属性;②程序对于运行效率要求较高,因此希望能用较低级的语言(如C/C++)来实现;③Java已经拥有实现需要的程序和库,希望C/C++对其直接进行调用[67]。

1.2JNI技术架构

JNI允许运行在Java虚拟机上的应用程序调用其它语言(如C/C++语言)来编写需要的方法或类库,也能将Java虚拟机嵌入到本地应用程序中。

图1是JNI在本地应用程序与Java应用之间各自扮演的角色图。从图中可以看出,JNI作为Java与C/C++函數库之间的桥梁,可以实现Java代码与C/C++库函数当中本地代码之间的交互。然而JNI没有改变Java语言的属性,只是让Java语言拥有一种能够对外调用的形式[89]。

1.3OpenCV介绍

OpenCV(Open Source Computer Vision Library)是一个基于BSD许可发行的跨平台计算机视觉库。它轻量而且高效,由C函数与C++类构成,同时提供了Python、Java等语言的接口,可实现图像处理和计算机视觉方面的很多通用算法。OpenCV中对于人脸的检测方法是基于处理成的灰度图像的弱特征检测方法。该方法建立在Haar特征[10]检测方法基础上,可以获得检测人脸的实时处理速度。

OpenCV中也提供了训练分类器[1112]的程序及方法来检测特征。使用者可以将此方法应用于一些项目中的二次开发,比如双目视觉的三维重构、物体识别,协助机器人完成复杂任务,以及在智能监控中的人脸检测、智能交通中的行人检测等。

2开发工具选择

选用的工具是eclipse,Java版本为JDK1.7,C++使用的是VS2010。另外PC端需要具备内置或外置摄像头,PC机配置为Inter Core i5-3230M CPU 2.6GHz。

3实现过程

从图2中编写JNI代码的大致步骤可以看出Java需要将字节码文件通过javah生成头文件,再与C代码共同生成动态链接库,进而与Java中的代码进行交互。

3.4人脸检测实验结果

实验结果如图3以及表1所示,Java捕获的图像上会圈出特征检测出的人脸,并在控制台输出人脸的X、Y坐标以及微笑值。微笑值越高代表被检测的人脸表情越开心。表2使用JNI检测明显比单独从Java视频流中获取图像检测人脸速度更快。因此,将JNI应用于Java虚拟机的人脸检测中,可以帮助后台进行高效的图片信息处理。

第1期 侯贺,马林,郑伟:基于大数据的微课评价模型研究软 件 导 刊2017年标题

猜你喜欢
人脸检测
基于人脸特征定位的SNS网站应用组件研究与设计