详见: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("\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 文件里。

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

今天就这些,欢迎反馈。

利用Java调用OpenCV进行人脸识别的更多相关文章

  1. java基于OpenCV的人脸识别

    基于Java简单的人脸和人眼识别程序 使用这个程序之前必须先安装配置OpenCV详细教程见:https://www.cnblogs.com/prodigal-son/p/12768948.html 注 ...

  2. 转:基于开源项目OpenCV的人脸识别Demo版整理(不仅可以识别人脸,还可以识别眼睛鼻子嘴等)【模式识别中的翘楚】

    文章来自于:http://blog.renren.com/share/246648717/8171467499 基于开源项目OpenCV的人脸识别Demo版整理(不仅可以识别人脸,还可以识别眼睛鼻子嘴 ...

  3. 使用OpenCV进行人脸识别

    不断维护的地址:http://plzcoding.com/face-recognition-with-opencv/ 怎样使用OpenCV进行人脸识别 本文大部分来自OpenCV官网上的Face Re ...

  4. java 虹软ArcFace 2.0,java SDK使用、人脸识别-抽取人脸特征并做比对

    java人脸识别 虹软ArcFace 2.0,java SDK使用.人脸识别-抽取人脸特征并做比对 虹软产品地址:http://ai.arcsoft.com.cn/product/arcface.ht ...

  5. 基于 OpenCV 的人脸识别

    基于 OpenCV 的人脸识别 一点背景知识 OpenCV 是一个开源的计算机视觉和机器学习库.它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包.根据这个项目的关于页面,OpenC ...

  6. PyQt5+Caffe+Opencv搭建人脸识别登录界面

    PyQt5+Caffe+Opencv搭建人脸识别登录界面(转载) 最近开始学习Qt,结合之前学习过的caffe一起搭建了一个人脸识别登录系统的程序,新手可能有理解不到位的情况,还请大家多多指教. 我的 ...

  7. 基于Dlib、OpenCV开发人脸识别程序的开发建议

    前言 在去年十月的时候参加了一个小比赛,做了一个人脸识别程序并很意外地获得省里面的一等奖,视频演示链接在这里,有同学想要做这方面的毕业设计or课程设计,发一篇博客来分享一下当时的开发过程. 视频演示链 ...

  8. 利用face_recognition,dlib与OpenCV调用摄像头进行人脸识别

    用已经搭建好 face_recognition,dlib 环境来进行人脸识别 未搭建好环境请参考:https://www.cnblogs.com/guihua-pingting/p/12201077. ...

  9. opencv之人脸识别

    最近在做一个类似于智能广告投放的项目,简单思路是利用opencv获取摄像头图像,然后调用接口或利用其他一些离线模型进行人脸属性识别,进而投放广告.本篇先简单介绍利用opecv进行人脸识别. # -*- ...

随机推荐

  1. NYOJ--513--A+B Problem IV(大数)

    A+B Problem IV 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 acmj最近发现在使用计算器计算高精度的大数加法时很不方便,于是他想着能不能写个程序把这 ...

  2. [SCOI2007]压缩 区间dp

    明显是个区间dp,但是我区间dp就是个渣... f[i][j]表示区间i到j最短的字符长度:假设前面加了个M,所以初始化f[i][i]=2;当然最开始是不算M的,所以f[1][1]=1;然后就可以区间 ...

  3. Hadoop集群时间同步

    0x01 ntp安装 检查时间服务器是否安装 # rpm -q ntp ntp-4.2.4p8-2.el6.x86_64 // 这表示已安装了,如果没有安装,这是空白. //如果没有安装,我们按照下 ...

  4. WAMP环境 apache 2.4.23 局域网访问

    参考了很多大神的分享解答,  现在不知道是参考的哪个人的 如有抄袭 侵权请告知, 加上链接或者删除!!! 最近想按个分屏提高学习代码效率, 晚上突然想到可以用本本连接WiFI 然后通过 局域网访问PC ...

  5. Servlet 服务器端小程序

    1.tomcat安装及目录介绍 JAVA_HOME CATALINA_HOME PATH=%JAVA_HOME%/bin;2.静态web项目.动态web项目 WEB-INF lib classes w ...

  6. JVM(一)JVM的基本结构

    JVM基本结构 一 JVM基本结构示意图 二 JVM结构详解 一 程序计数器 程序计数器是一块较小的内存空间,它是当前线程所执行的字节码的行号指示器,如果线程执行的是一个Java方法,这个计数器记录的 ...

  7. Redis数据结构底层知识总结

    Redis数据结构底层总结 本篇文章是基于作者黄建宏写的书Redis设计与实现而做的笔记 数据结构与对象 Redis中数据结构的底层实现包括以下对象: 对象 解释 简单动态字符串 字符串的底层实现 链 ...

  8. 【3D数学基础】三维空间折射向量计算

    问题:在三维空间中,已知折射率 e .入射角 L 和法线 N. 要求:计算出折射向量 T. 其中: L. N 和 T 都为单位向量. 如图片所示,下面所有的公式都看着这张图片来求解的: 首先,我们必须 ...

  9. ThinkPHP5 封装邮件发送服务(可带附件)

    1.Composer 安装 phpmailer composer require phpmailer/phpmailer 2.ThinkPHP 中封装邮件服务类 我把它封装在扩展目录 extend/M ...

  10. 【可视化】Echarts3坐标系倒映

    目标: 用echarts实现在一个echarts图表中包含上下两个坐标系 横轴合并在一块.有一种上下对称水映的视觉效果 要点提示:grid 是一个数组 包含两个grid xAxis,yAxis也都是数 ...