OpenCVJava如何实现人脸识别和裁剪功能

这篇文章将为大家详细讲解有关OpenCV Java如何实现人脸识别和裁剪功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

站在用户的角度思考问题,与客户深入沟通,找到罗庄网站设计与罗庄网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都做网站、成都网站建设、企业官网、英文网站、手机端网站、网站推广、申请域名网站空间、企业邮箱。业务覆盖罗庄地区。

安装及配置

1.首先安装OpenCV,地址

这里我下载的是Windows版的3.4.5

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

然后安装即可……

2.Eclipse配置OpenCV

Window->Preferences->Java->User Libraries

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

New输入你的Libraries名

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

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

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

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

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

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

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

人脸识别

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

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

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

然后引入即可。

引入haarcascade_frontalface_alt.xml这个xml文件:

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

我的pom文件如下:

 
 
 org.springframework.boot
 spring-boot-starter-web
 
 
 
 
 org.bytedeco.javacpp-presets
 ffmpeg
 3.1.2-1.2
 
 
 org.bytedeco
 javacv
 1.4.1
 
 
 
 org.bytedeco.javacpp-presets
 ffmpeg-platform
 3.4.2-1.4.1
 
 
 commons-io
 commons-io
 2.4
 
 
 
 
 
 
 org.bytedeco
 javacv-platform
 1.4.1
 
 
 
 org.bytedeco.javacpp-presets
 opencv-platform
 3.4.1-1.4.1
 
 
 
 junit
 junit
 4.12
 test
 
 
 
 org.springframework.boot
 spring-boot-starter-test
 test
 
 

修改我的端口号:

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();
 }
 }
 
}

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

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

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

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

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

关于“OpenCV Java如何实现人脸识别和裁剪功能”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。


分享名称:OpenCVJava如何实现人脸识别和裁剪功能
当前链接:http://scyanting.com/article/pssohh.html