返回介绍

Day 12: OpenCV - Java 开发者的人脸检测

发布于 2025-01-31 20:47:30 字数 6173 浏览 0 评论 0 收藏 0

-

今天我准备学习如何用 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 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);
  }
} 

上面的这些代码可以:

  1. 加载本地的 OpenCV 库,这样就可以用它来调用 Java API。
  2. 创建实例 CascadeClassifier,将已加载的分类器的文件名传递给它。
  3. 接下来我们将图片转化成 Java API 能够接受使用 Highui 类的格式,铺垫在 OpenCV C++的 n 维密集数组类上边。
  4. 然后,调用分类器上的 detectMultiScale 方法传递给它图象和 MatOfRect 对象。这个过程之后,MatOfRect 将有面部检测。
  5. 我们遍历所有的脸部检测并用矩形标记图像。
  6. 最后,将图像写入输出的 .png 文件里。

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


今天就这些,欢迎反馈。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文