您的位置:首页 > 运维架构

基于opencv构建的人脸识别的尝试

2014-08-27 15:46 525 查看




什么是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 jar

我花了很多时间来了解如何获得OpenCV的jar文件。文档中的Java教程假设OpenCV jar文件是在生成文件夹中,适用于Windows用户的OpenCV包(包括jar文件),但并不适用于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官网下载最新版,就目前而言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
之类的名字,然后点击“确定”。




点击
Add External Jars
,然后添加 
OpenCV-2.4.7
 文件。




选择
Native library location
,然后点击“
编辑(Edit)
”。




点击 
External Folder





opencv-2.4.7/build/lib
 文件夹下给出
库目录(lib)
的路径。




现在,点击“确定”,我们已经把 OpenCV 作为用户库(user library)添加进去了。


创建新的Java项目

一步一步在
File > New > Other > Java Project
下创建新的Java项目,完成后,右键单击该项目配置构建路径。




转到
Libraries
选项卡,然后点击“
添加库(Add
Library)
”。




选择“
用户库(User Library)





选择我们最后一步添加进去的OpenCV-2.4.7用户库,点击“完成”。




最后,你会看见这个Java项目里已经包含了OpenCV-2.4.7用户库。




写人脸检测器(FaceDetector)

在上面创建的Java项目里创建一个类(class),并添加下面的代码:
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,将已加载的分类器的文件名传递给它。
接下来我们将图片转化成Java API能够接受使用Highui类的格式,铺垫在OpenCV C++的n维密集数组类上边。
然后,调用分类器上的detectMultiScale方法传递给它图象和MatOfRect对象。这个过程之后,MatOfRect将有面部检测。
我们遍历所有的脸部检测并用矩形标记图像。
最后,将图像写入输出的 
.png
 文件里。

这个程序的输出展示如下,这是在人脸检测之前和之后的图片:


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息