OpenCV Java实现人脸识别和裁剪功能

本文实例为大家分享了OpenCV Java实现人脸识别和裁剪的具体代码,供大家参考,具体内容如下

安装及配置

1.首先安装OpenCV,地址

这里我下载的是Windows版的3.4.5

然后安装即可……

2.Eclipse配置OpenCV

Window->Preferences->Java->User Libraries

New输入你的Libraries名

这里我的安装目录是D:\OpenCV,所以是:

然后引入dll,我是64位机子,所以是:

Ok,下面创建Java项目做Java与OpenCV的人脸识别。

人脸识别

创建项目后首先右击选择Properties

然后引入即可。

引入haarcascade_frontalface_alt.xml这个xml文件:

我的pom文件如下:

 <dependencies>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-web</artifactId>
 </dependency>

 <dependency>
 <groupId>org.bytedeco.javacpp-presets</groupId>
 <artifactId>ffmpeg</artifactId>
 <version>3.1.2-1.2</version>
 </dependency>
 <dependency>
 <groupId>org.bytedeco</groupId>
 <artifactId>javacv</artifactId>
 <version>1.4.1</version>
 </dependency>
 <!-- https://mvnrepository.com/artifact/org.bytedeco.javacpp-presets/ffmpeg-platform -->
 <dependency>
 <groupId>org.bytedeco.javacpp-presets</groupId>
 <artifactId>ffmpeg-platform</artifactId>
 <version>3.4.2-1.4.1</version>
 </dependency>
 <dependency>
 <groupId>commons-io</groupId>
 <artifactId>commons-io</artifactId>
 <version>2.4</version>
 </dependency>

 <!-- 视频摄像头 -->
 <!-- https://mvnrepository.com/artifact/org.bytedeco/javacv-platform -->
 <dependency>
 <groupId>org.bytedeco</groupId>
 <artifactId>javacv-platform</artifactId>
 <version>1.4.1</version>
 </dependency>
 <!-- https://mvnrepository.com/artifact/org.bytedeco.javacpp-presets/opencv-platform -->
 <dependency>
 <groupId>org.bytedeco.javacpp-presets</groupId>
 <artifactId>opencv-platform</artifactId>
 <version>3.4.1-1.4.1</version>
 </dependency>

 <dependency>
 <groupId>junit</groupId>
 <artifactId>junit</artifactId>
 <version>4.12</version>
 <scope>test</scope>
 </dependency>

 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-test</artifactId>
 <scope>test</scope>
 </dependency>
 </dependencies>

修改我的端口号:

server.port=8889

最后代码如下:

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.FileUtils;
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.core.Size;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

/*
* @author zzf
* @date 2019年1月17日 下午12:04:45
*/
@RestController
public class OpenCVController {

 @Value("classpath:haarcascade_frontalface_alt.xml")
 private Resource xml;

 @PostMapping("/face")
 public void FaceDetector(HttpServletResponse response, MultipartFile file) throws IOException {
 // D:\workspace-sts-3.9.2.RELEASE\OpenCV\src\main\resources
 // String opencvpath = System.getProperty("user.dir") +
 // "\\src\\main\\resources\\";
 // String opencvDllName = opencvpath + Core.NATIVE_LIBRARY_NAME + ".dll";
 // System.load(opencvDllName);
 System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
 System.out.println("人脸检测开始……");

 // 创建临时文件,因为boot打包后无法读取文件内的内容
 File targetXmlFile = new File("src/" + xml.getFilename() + "");
 FileUtils.copyInputStreamToFile(xml.getInputStream(), targetXmlFile);
 CascadeClassifier faceDetector = new CascadeClassifier(targetXmlFile.toString());
 if (faceDetector.empty()) {
 System.out.println("请引入文件……");
 return;
 }
 // 创建图片tempFile
 File tempFile = new File("src/" + file.getOriginalFilename() + "");
 FileUtils.copyInputStreamToFile(file.getInputStream(), tempFile);

 // 读取创建的图片tempFile
 Mat image = Imgcodecs.imread(tempFile.toString());
 MatOfRect faceDetections = new MatOfRect();
 // 进行人脸检测
 faceDetector.detectMultiScale(image, faceDetections);
 System.out.println(String.format("检测到人脸: %s", faceDetections.toArray().length));
 Integer i = 1;
 // 制图将图填充到image中
 for (Rect rect : faceDetections.toArray()) {
 Imgproc.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height),
  new Scalar(0, 255, 0), 3);
 imageCut(tempFile.toString(), i+".jpg", rect.x, rect.y, rect.width, rect.height);// 进行图片裁剪
 i++;
 }
 // 下面部分是返回给页面
 String filename = file.getOriginalFilename();
 Imgcodecs.imwrite(filename, image);
 File imgFile = new File(filename);
 if (imgFile.exists()) {
 response.getOutputStream().write(toByteArray(imgFile));
 response.getOutputStream().close();
 }

 // 删除临时文件
 if (targetXmlFile.exists() && targetXmlFile.isFile()) {
 if (targetXmlFile.delete()) {
 System.out.println("删除临时文件" + targetXmlFile + "成功!");
 }
 }
 if (imgFile.exists() && imgFile.isFile()) {
 if (imgFile.delete()) {
 System.out.println("删除临时文件" + imgFile + "成功!");
 }
 }
 if (tempFile.exists() && tempFile.isFile()) {
 if (tempFile.delete()) {
 System.out.println("删除临时文件" + tempFile + "成功!");
 }
 }
 }

 public static void imageCut(String imagePath, String outFile, int posX, int posY, int width, int height) {
 // 原始图像
 Mat image = Imgcodecs.imread(imagePath);
 // 截取的区域:参数,坐标X,坐标Y,截图宽度,截图长度
 Rect rect = new Rect(posX, posY, width, height);
 // 两句效果一样
 Mat sub = image.submat(rect); // Mat sub = new Mat(image,rect);
 Mat mat = new Mat();
 Size size = new Size(width, height);
 Imgproc.resize(sub, mat, size);// 将人脸进行截图并保存
 Imgcodecs.imwrite(outFile, mat);
 System.out.println(String.format("图片裁切成功,裁切后图片文件为: %s", outFile));

 }

 public static byte[] toByteArray(File file) throws IOException {
 File f = file;
 if (!f.exists()) {
 throw new FileNotFoundException("file not exists");
 }
 ByteArrayOutputStream bos = new ByteArrayOutputStream((int) f.length());
 BufferedInputStream in = null;
 try {
 in = new BufferedInputStream(new FileInputStream(f));
 int buf_size = 1024;
 byte[] buffer = new byte[buf_size];
 int len = 0;
 while (-1 != (len = in.read(buffer, 0, buf_size))) {
 bos.write(buffer, 0, len);
 }
 return bos.toByteArray();
 } catch (IOException e) {
 e.printStackTrace();
 throw e;
 } finally {
 try {
 in.close();
 } catch (IOException e) {
 e.printStackTrace();
 }
 bos.close();
 }
 }

}

下面来一张我男神们的合照

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • OpenCV实现人脸识别

    主要有以下步骤: 1.人脸检测 2.人脸预处理 3.从收集的人脸训练机器学习算法 4.人脸识别 5.收尾工作 人脸检测算法: 基于Haar的脸部检测器的基本思想是,对于面部正面大部分区域而言,会有眼睛所在区域应该比前额和脸颊更暗,嘴巴应该比脸颊更暗等情形.它通常执行大约20个这样的比较来决定所检测的对象是否为人脸,实际上经常会做上千次. 基于LBP的人脸检测器基本思想与基于Haar的人脸检测器类似,但它比较的是像素亮度直方图,例如,边缘.角落和平坦区域的直方图. 这两种人脸检测器可通过训练大的图

  • 详解如何用OpenCV + Python 实现人脸识别

    下午的时候,配好了OpenCV的Python环境,OpenCV的Python环境搭建.于是迫不及待的想体验一下opencv的人脸识别,如下文. 必备知识 Haar-like 通俗的来讲,就是作为人脸特征即可. Haar特征值反映了图像的灰度变化情况.例如:脸部的一些特征能由矩形特征简单的描述,如:眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等. opencv api 要想使用opencv,就必须先知道其能干什么,怎么做.于是API的重要性便体现出来了.就本例而言,使用到的函数

  • 基于OpenCV的PHP图像人脸识别技术

    openCV是一个开源的用C/C++开发的计算机图形图像库,非常强大,研究资料很齐全.本文重点是介绍如何使用php来调用其中的局部的功能.人脸侦查技术只是openCV一个应用分支. 1.安装 从源代码编译成一个动态的so文件. 1.1.安装 OpenCV (OpenCV 1.0.0) 下载地址:http://sourceforge.net/project/showfiles.php?group_id=22870&package_id=16948 #tar xvzf OpenCV-1.0.0.ta

  • Python基于OpenCV库Adaboost实现人脸识别功能详解

    本文实例讲述了Python基于OpenCV库Adaboost实现人脸识别功能.分享给大家供大家参考,具体如下: 以前用Matlab写神经网络的面部眼镜识别算法,研究算法逻辑,采集大量训练数据,迭代,计算各感知器的系数...相当之麻烦~而现在运用调用pythonOpenCV库Adaboost算法,无需知道算法逻辑,无需进行模型训练,人脸识别变得相当之简单了. 需要用到的库是opencv(open source computer vision),下载安装方式如下: 使用pip install num

  • python调用OpenCV实现人脸识别功能

    Python调用OpenCV实现人脸识别,供大家参考,具体内容如下 硬件环境: Win10 64位 软件环境: Python版本:2.7.3 IDE:JetBrains PyCharm 2016.3.2 Python库: 1.1) opencv-python(3.2.0.6) 搭建过程: OpenCV Python库: 1. PyCharm的插件源中选择opencv-python(3.2.0.6)库安装 题外话:Python入门Tips PS1:如何安装whl文件 1.先安装PIP 2.CMD命

  • 基于python3 OpenCV3实现静态图片人脸识别

    本文采用OpenCV3和Python3 来实现静态图片的人脸识别,采用的是Haar文件级联. 首先需要将OpenCV3源代码中找到data文件夹下面的haarcascades文件夹里面包含了所有的OpenCV的人脸检测的XML文件,这些文件可以用于检测静态,视频文件,摄像头视频流中的人脸,找到haarcascades文件夹后,复制里面的XML文件,在你新建的Python脚本文件目录里面建一个名为cascades的文件夹,并把复制的XML文件粘贴到新建的文件夹中一些有人脸的的图片,这个大家可以自行

  • OPENCV+JAVA实现人脸识别

    本文实例为大家分享了JAVA实现人脸识别的具体代码,供大家参考,具体内容如下 官方下载 安装文件 ,以win7为例,下载opencv-2.4.13.3-vc14.exe 安装后,在build目录下 D:\opencv\build\java,获取opencv-2413.jar,copy至项目目录 同时需要dll文件 与 各 识别xml文件,进行不同特征的识别(人脸,侧脸,眼睛等) dll目录:D:\opencv\build\java\x64\opencv_java2413.dll xml目录:D:

  • python opencv3实现人脸识别(windows)

    本文实例为大家分享了python人脸识别程序,大家可进行测试 #coding:utf-8 import cv2 import sys from PIL import Image def CatchUsbVideo(window_name, camera_idx): cv2.namedWindow(window_name) # 视频来源,可以来自一段已存好的视频,也可以直接来自USB摄像头 cap = cv2.VideoCapture(camera_idx) # 告诉OpenCV使用人脸识别分类器

  • opencv 做人脸识别 opencv 人脸匹配分析

    机器学习 机器学习的目的是把数据转换成信息. 机器学习通过从数据里提取规则或模式来把数据转成信息. 人脸识别 人脸识别通过级联分类器对特征的分级筛选来确定是否是人脸. 每个节点的正确识别率很高,但正确拒绝率很低. 任一节点判断没有人脸特征则结束运算,宣布不是人脸. 全部节点通过,则宣布是人脸. 工业上,常用人脸识别技术来识别物体. 对图片进行识别 复制代码 代码如下: #include "opencv2/core/core.hpp" #include "opencv2/obj

  • python使用opencv进行人脸识别

    环境 ubuntu 12.04 LTS python 2.7.3 opencv 2.3.1-7 安装依赖 sudo apt-get install libopencv-* sudo apt-get install python-opencv sudo apt-get install python-numpy 示例代码 #!/usr/bin/env python #coding=utf-8 import os from PIL import Image, ImageDraw import cv d

随机推荐