zoukankan      html  css  js  c++  java
  • 利用Java调用OpenCV进行人脸识别

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt409

    今天我准备学习如何用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("
    Running 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 文件里。

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

    今天就这些,欢迎反馈。

  • 相关阅读:
    Leetcode Unique Binary Search Trees
    Leetcode Decode Ways
    Leetcode Range Sum Query 2D
    Leetcode Range Sum Query
    Leetcode Swap Nodes in Pairs
    Leetcode Rotate Image
    Leetcode Game of Life
    Leetcode Set Matrix Zeroes
    Leetcode Linked List Cycle II
    CF1321A
  • 原文地址:https://www.cnblogs.com/grefr/p/6087949.html
Copyright © 2011-2022 走看看