人脸识别软件开发人员配置-iphone照相机如何识别人脸
编者按:我们发现了一系列有趣的文章《30天学会30种新技术》,准备翻译,每天更新一篇,年终大礼包。 以下是第十二天的内容。
今天我将学习如何使用Java进行人脸检测。 人脸检测有助于识别任何数字图像上的人脸,经过一些研究,我发现了 OpenCV 库可以帮助我检测图像中的人脸。 但是,我无法找到关于从 Java 使用 OpenCV 库的完整初学者教程,因此这篇文章可能是其他人在该领域学习的资源。
什么是 OpenCV?
OpenCV(Open Source Computer Vision)是一个开源的计算机视觉算法库。 它是用 C/C++ 编写的,旨在利用多核。 它提供C++、C、Python和Java接口,支持所有主流操作系统平台,包括Windows、Linux、Mac OS、iOS和Android。
Github 仓库
GitHub 上提供了今天演示应用程序的代码:day12-face-detection。
开始使用 OpenCV
要开始学习 OpenCV人脸识别软件开发人员配置,第一步是到其官方网站下载支持您当前操作系统的最新版本的 OpenCV 包。 本文使用 2.4.7 版本。
压缩包下载完成后,使用tar命令解压:
$ tar xvf opencv-2.4.7.tar.gz
切换目录到opencv-2.4.7:
$ cd opencv-2.4.7
构建 OpenCV 罐子
我花了很多时间来了解如何获取 OpenCV 的 jar 文件。 文档中的 Java 教程假定 OpenCV jar 文件位于构建文件夹中,OpenCV 包(包括 jar 文件)适用于 Windows 用户,但不适用于 Linux 和 Mac OS 用户。 为了构建 OpenCV jar,执行以下命令:
$ cd opencv-2.4.7
$ mkdir build
$ cd build/
$ cmake -G "Unix Makefiles" -D CMAKE_CXX_COMPILER=/usr/bin/g++ -D CMAKE_C_COMPILER=/usr/bin/gcc -D WITH_CUDA=ON ..
$ make -j4
$ make install
以上命令会在opencv-2.4.7/build/bin目录下创建opencv-247.jar文件,这是Java绑定本地OpenCV的安装方式。
下载日食
如果您的系统中没有安装eclipse,您可以到Eclipse官网下载最新版本。 目前,最新版本的 eclipse 代号为 Kepler。
Eclipse的安装非常简单,解压下载的包即可。 如果您使用的是 Linux 或 Mac 计算机,请打开命令行窗口并输入以下命令:
$ tar -xzvf eclipse-jee-kepler-R-*.tar.gz
Windows下,解压到哪里都会有一个eclipse文件夹,这样就可以直接操作,当然也可以创建一个快捷方式,将文件执行到桌面。
添加用户库
打开Eclipse IDE,然后进入项目工作区,进入目录Windows > Preferences > Java > Build Path > User Libraries,选择添加新库。
为库提供类似 OpenCV-2.4.7 的内容,然后单击“确定”。
单击添加外部 Jar,然后添加 OpenCV-2.4.7 文件。
选择本机库位置并单击编辑。
单击外部文件夹。
给出opencv-2.4.7/build/lib文件夹下的库目录(lib)的路径。
现在,单击“确定”,我们已将 OpenCV 添加为用户库。
创建新的 Java 项目
一步一步,在文件 > 新建 > 其他 > Java 项目下创建一个新的 Java 项目,完成后,右键单击该项目以配置构建路径。
转到“库”选项卡并单击“添加库”。
选择“用户库”
选择我们上一步添加的OpenCV-2.4.7用户库人脸识别软件开发人员配置,点击“Finish”。
最后,您将看到 Java 项目包含了 OpenCV-2.4.7 用户库。
编写人脸检测器(FaceDetector)
在上面创建的Java项目中创建一个类,添加如下代码:
package com.shekhar.facedetection;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.highgui.Highgui;
import org.opencv.objdetect.CascadeClassifier;
public class FaceDetector {
public static void main(String[] args) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
System.out.println("\nRunning FaceDetector");
CascadeClassifier faceDetector = new CascadeClassifier(FaceDetector.class.getResource("haarcascade_frontalface_alt.xml").getPath());
Mat image = Highgui
.imread(FaceDetector.class.getResource("shekhar.JPG").getPath());
MatOfRect faceDetections = new MatOfRect();
faceDetector.detectMultiScale(image, faceDetections);
System.out.println(String.format("Detected %s faces", faceDetections.toArray().length));
for (Rect rect : faceDetections.toArray()) {
Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height),
new Scalar(0, 255, 0));
}
String filename = "ouput.png";
System.out.println(String.format("Writing %s", filename));
Highgui.imwrite(filename, image);
}
}
上面的代码可以:
加载本机 OpenCV 库,以便它可以用于调用 Java API。 创建 CascadeClassifier 的实例,将加载的分类器的文件名传递给它。 接下来,我们使用Highhui类将图像转换成Java API可以接受的格式,为OpenCV C++的n维密集数组类打下基础。 然后,调用分类器上的 detectMultiScale 方法,将图像和 MatOfRect 对象传递给它。 经过这个过程,MatOfRect 就会进行人脸检测。 我们遍历所有面部检测并用矩形标记图像。 最后,将图像写入输出 .png 文件。
这个程序的输出结果如下图,是人脸检测前后的图片: