摘要:今天我准备学习如何用来进行人脸检测。它提供和的接口,并支持所有主流操作系统平台,包括及。这个过程之后,将有面部检测。我们遍历所有的脸部检测并用矩形标记图像。这个程序的输出展示如下,这是在人脸检测之前和之后的图片今天就这些,欢迎反馈。
编者注:我们发现了比较有趣的系列文章《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上有:day12-face-detection 。
开始学习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文件。文档中的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最新版的代号是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)添加进去了。
一步一步在File > New > Other > Java Project下创建新的Java项目,完成后,右键单击该项目配置构建路径。
转到Libraries选项卡,然后点击“添加库(Add Library)”。
选择“用户库(User Library)”
选择我们最后一步添加进去的OpenCV-2.4.7用户库,点击“完成”。
最后,你会看见这个Java项目里已经包含了OpenCV-2.4.7用户库。
在上面创建的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); } }
上面的这些代码可以:
加载本地的OpenCV库,这样就可以用它来调用Java API。
创建实例CascadeClassifier,将已加载的分类器的文件名传递给它。
接下来我们将图片转化成Java API能够接受使用Highui类的格式,铺垫在OpenCV C++的n维密集数组类上边。
然后,调用分类器上的detectMultiScale方法传递给它图象和MatOfRect对象。这个过程之后,MatOfRect将有面部检测。
我们遍历所有的脸部检测并用矩形标记图像。
最后,将图像写入输出的 .png 文件里。
这个程序的输出展示如下,这是在人脸检测之前和之后的图片:
今天就这些,欢迎反馈。
原文 Day 12: OpenCV--Face Detection for Java Developers
整理 SegmentFault
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/63991.html
摘要:时间永远都过得那么快,一晃从年注册,到现在已经过去了年那些被我藏在收藏夹吃灰的文章,已经太多了,是时候把他们整理一下了。那是因为收藏夹太乱,橡皮擦给设置私密了,不收拾不好看呀。 ...
摘要:十开放模式识别项目开放模式识别项目,致力于开发出一套包含图像处理计算机视觉自然语言处理模式识别机器学习和相关领域算法的函数库。 一、开源生物特征识别库 OpenBROpenBR 是一个用来从照片中识别人脸的工具。还支持推算性别与年龄。使用方法:$ br -algorithm FaceRecognition -compare me.jpg you.jpg二、计算机视觉库 OpenCVOpenC...
阅读 624·2023-04-26 01:53
阅读 2751·2021-11-17 17:00
阅读 2882·2021-09-04 16:40
阅读 1986·2021-09-02 15:41
阅读 833·2019-08-26 11:34
阅读 1224·2019-08-26 10:16
阅读 1337·2019-08-23 17:51
阅读 816·2019-08-23 16:50