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:\opencv\sources\data\haarcascades\haarcascade_frontalface_alt.xml(目录中有各类识别文件)

项目结构:

具体代码:由于需要用到 opencv 的dll文件,故要么放在java library path 中,或放在jre lib 中,windows下可放在System32目录下,也可以在代码中动态加载,如下:

package opencv; 

import com.sun.scenario.effect.ImageData;
import org.opencv.core.*;
import org.opencv.core.Point;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier; 

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Vector; 

/**
 * Created by Administrator on 2017/8/17.
 */
public class Test { 

 static{
  // 导入opencv的库
  String opencvpath = System.getProperty("user.dir") + "\\opencv\\x64\\";
  String libPath = System.getProperty("java.library.path");
  String a = opencvpath + Core.NATIVE_LIBRARY_NAME + ".dll";
  System.load(opencvpath + Core.NATIVE_LIBRARY_NAME + ".dll");
 } 

 public static String getCutPath(String filePath){
  String[] splitPath = filePath.split("\\.");
  return splitPath[0]+"Cut"+"."+splitPath[1];
 } 

 public static void process(String original,String target) throws Exception {
  String originalCut = getCutPath(original);
  String targetCut = getCutPath(target);
  if(detectFace(original,originalCut) && detectFace(target,targetCut)){ 

  }
 } 

 public static boolean detectFace(String imagePath,String outFile) throws Exception
 { 

  System.out.println("\nRunning DetectFaceDemo");
  // 从配置文件lbpcascade_frontalface.xml中创建一个人脸识别器,该文件位于opencv安装目录中
  CascadeClassifier faceDetector = new CascadeClassifier(
    "C:\\Users\\Administrator\\Desktop\\opencv\\haarcascade_frontalface_alt.xml");
  Mat image = Highgui.imread(imagePath); 

  // 在图片中检测人脸
  MatOfRect faceDetections = new MatOfRect();
  faceDetector.detectMultiScale(image, faceDetections); 

  System.out.println(String.format("Detected %s faces",
    faceDetections.toArray().length)); 

  Rect[] rects = faceDetections.toArray();
  if(rects != null && rects.length > 1){
   throw new RuntimeException("超过一个脸");
  }
  // 在每一个识别出来的人脸周围画出一个方框
  Rect rect = rects[0];
  Core.rectangle(image, new Point(rect.x-2, rect.y-2), new Point(rect.x
    + rect.width, rect.y + rect.height), new Scalar(0, 255, 0));
  Mat sub = image.submat(rect);
  Mat mat = new Mat();
  Size size = new Size(300, 300);
  Imgproc.resize(sub, mat, size);//将人脸进行截图并保存
  return Highgui.imwrite(outFile, mat); 

  // 将结果保存到文件
//  String filename = "C:\\Users\\Administrator\\Desktop\\opencv\\faceDetection.png";
//  System.out.println(String.format("Writing %s", filename));
//  Highgui.imwrite(filename, image);
 } 

 public static void setAlpha(String imagePath,String outFile) {
  /**
   * 增加测试项
   * 读取图片,绘制成半透明
   */
  try { 

   ImageIcon imageIcon = new ImageIcon(imagePath);
   BufferedImage bufferedImage = new BufferedImage(imageIcon.getIconWidth(),imageIcon.getIconHeight()
     , BufferedImage.TYPE_4BYTE_ABGR);
   Graphics2D g2D = (Graphics2D) bufferedImage.getGraphics();
   g2D.drawImage(imageIcon.getImage(), 0, 0,
     imageIcon.getImageObserver());
   //循环每一个像素点,改变像素点的Alpha值
   int alpha = 100;
   for (int j1 = bufferedImage.getMinY(); j1 < bufferedImage.getHeight(); j1++) {
    for (int j2 = bufferedImage.getMinX(); j2 < bufferedImage.getWidth(); j2++) {
     int rgb = bufferedImage.getRGB(j2, j1);
     rgb = ( (alpha + 1) << 24) | (rgb & 0x00ffffff);
     bufferedImage.setRGB(j2, j1, rgb);
    }
   }
   g2D.drawImage(bufferedImage, 0, 0, imageIcon.getImageObserver()); 

   //生成图片为PNG 

   ImageIO.write(bufferedImage, "png", new File(outFile));
  }
  catch (Exception e) {
   e.printStackTrace();
  } 

 } 

 private static void watermark(String a,String b,String outFile, float alpha) throws IOException {
  // 获取底图
     BufferedImage buffImg = ImageIO.read(new File(a));
     // 获取层图
     BufferedImage waterImg = ImageIO.read(new File(b));
     // 创建Graphics2D对象,用在底图对象上绘图
     Graphics2D g2d = buffImg.createGraphics();
     int waterImgWidth = waterImg.getWidth();// 获取层图的宽度
     int waterImgHeight = waterImg.getHeight();// 获取层图的高度
     // 在图形和图像中实现混合和透明效果
     g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
     // 绘制
     g2d.drawImage(waterImg, 0, 0, waterImgWidth, waterImgHeight, null);
     g2d.dispose();// 释放图形上下文使用的系统资源
  //生成图片为PNG 

  ImageIO.write(buffImg, "png", new File(outFile));
 } 

 public static boolean mergeSimple(BufferedImage image1, BufferedImage image2, int posw, int posh, File fileOutput) { 

  //合并两个图像
  int w1 = image1.getWidth();
  int h1 = image1.getHeight();
  int w2 = image2.getWidth();
  int h2 = image2.getHeight(); 

  BufferedImage imageSaved = new BufferedImage(w1, h1, BufferedImage.TYPE_INT_ARGB);
  Graphics2D g2d = imageSaved.createGraphics(); 

  // 增加下面代码使得背景透明 

  g2d.drawImage(image1, null, 0, 0);
  image1 = g2d.getDeviceConfiguration().createCompatibleImage(w1, w2, Transparency.TRANSLUCENT);
  g2d.dispose();
  g2d = image1.createGraphics();
  // 背景透明代码结束 

//  for (int i = 0; i < w2; i++) {
//   for (int j = 0; j < h2; j++) {
//    int rgb1 = image1.getRGB(i + posw, j + posh);
//    int rgb2 = image2.getRGB(i, j);
//
//    if (rgb1 != rgb2) {
//     //rgb2 = rgb1 & rgb2;
//    }
//    imageSaved.setRGB(i + posw, j + posh, rgb2);
//   }
//  } 

  boolean b = false;
  try {
   b = ImageIO.write(imageSaved, "png", fileOutput);
  } catch (IOException ie) {
   ie.printStackTrace();
  }
  return b;
 } 

 public static void main(String[] args) throws Exception {
  String a,b,c,d;
  a = "C:\\Users\\Administrator\\Desktop\\opencv\\zzl.jpg";
  d = "C:\\Users\\Administrator\\Desktop\\opencv\\cgx.jpg";
  //process(a,d);
  a = "C:\\Users\\Administrator\\Desktop\\opencv\\zzlCut.jpg";
  d = "C:\\Users\\Administrator\\Desktop\\opencv\\cgxCut.jpg"; 

  CascadeClassifier faceDetector = new CascadeClassifier(
    "C:\\Users\\Administrator\\Desktop\\opencv\\haarcascade_frontalface_alt.xml"); 

  CascadeClassifier eyeDetector1 = new CascadeClassifier(
    "C:\\Users\\Administrator\\Desktop\\opencv\\haarcascade_eye.xml"); 

  CascadeClassifier eyeDetector2 = new CascadeClassifier(
    "C:\\Users\\Administrator\\Desktop\\opencv\\haarcascade_eye_tree_eyeglasses.xml"); 

  Mat image = Highgui.imread("C:\\Users\\Administrator\\Desktop\\opencv\\gakki.jpg");
  // 在图片中检测人脸
  MatOfRect faceDetections = new MatOfRect();
  //eyeDetector2.detectMultiScale(image, faceDetections);
  Vector<Rect> objects;
  eyeDetector1.detectMultiScale(image, faceDetections, 2.0,1,1,new Size(20,20),new Size(20,20)); 

  Rect[] rects = faceDetections.toArray();
  Rect eyea,eyeb;
  eyea = rects[0];eyeb = rects[1]; 

   System.out.println("a-中心坐标 " + eyea.x + " and " + eyea.y);
  System.out.println("b-中心坐标 " + eyeb.x + " and " + eyeb.y); 

  //获取两个人眼的角度
  double dy=(eyeb.y-eyea.y);
  double dx=(eyeb.x-eyea.x);
  double len=Math.sqrt(dx*dx+dy*dy);
  System.out.println("dx is "+dx);
  System.out.println("dy is "+dy);
  System.out.println("len is "+len); 

  double angle=Math.atan2(Math.abs(dy),Math.abs(dx))*180.0/Math.PI;
  System.out.println("angle is "+angle); 

  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 = "C:\\Users\\Administrator\\Desktop\\opencv\\ouput.png";
  System.out.println(String.format("Writing %s", filename));
  Highgui.imwrite(filename, image); 

//  watermark(a,d,"C:\\Users\\Administrator\\Desktop\\opencv\\zzlTm2.jpg",0.7f);
//
//  // 读取图像,不改变图像的原始信息
//  Mat image1 = Highgui.imread(a);
//  Mat image2 = Highgui.imread(d);
//  Mat mat1 = new Mat();Mat mat2 = new Mat();
//  Size size = new Size(300, 300);
//  Imgproc.resize(image1, mat1, size);
//  Imgproc.resize(image2, mat2, size);
//  Mat mat3 = new Mat(size,CvType.CV_64F);
//  //Core.addWeighted(mat1, 0.5, mat2, 1, 0, mat3);
//
//  //Highgui.imwrite("C:\\Users\\Administrator\\Desktop\\opencv\\add.jpg", mat3);
//
//  mergeSimple(ImageIO.read(new File(a)),
//    ImageIO.read(new File(d)),0,0,
//    new File("C:\\Users\\Administrator\\Desktop\\opencv\\add.jpg"));
 }
}

最终效果:人脸旁有绿色边框,可以将绿色边框图片截取,生成人脸图

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

您可能感兴趣的文章:

  • Java+opencv3.2.0实现hough直线检测
  • Java+opencv3.2.0实现hough圆检测功能
  • Java+opencv3.2.0实现人脸检测功能
  • Java+opencv3.2.0实现模板匹配
(0)

相关推荐

  • Java+opencv3.2.0实现人脸检测功能

    说到人脸检测,首先要了解Haar特征分类器.Haar特征分类器说白了就是一个个的xml文件,不同的xml里面描述人体各个部位的特征值,比如人脸.眼睛等等.OpenCV3.2.0中提供了如下特征文件: haarcascade_eye.xml haarcascade_eye_tree_eyeglasses.xml haarcascade_frontalcatface.xml haarcascade_frontalcatface_extended.xml haarcascade_frontalface

  • Java+opencv3.2.0实现模板匹配

    模板匹配是一项在一幅图像中寻找与另一幅模板图像最匹配(相似)部分的技术. 函数:Imgproc.matchTemplate(Mat image, Mat templ, Mat result, int method) 参数说明: image:源图像 templ:模板图像 result:比较结果 method:匹配算法 匹配算法: TM_SQDIFF 平方差匹配法:该方法采用平方差来进行匹配:最好的匹配值为0:匹配越差,匹配值越大. TM_CCORR 相关匹配法:该方法采用乘法操作:数值越大表明匹配

  • Java+opencv3.2.0实现hough直线检测

    hough变换是图像处理中的一种特征提取技术,该过程在一个参数空间中通过计算累计结果的局部最大值得到一个符合特定形状的集合作为hough变换结果. 发展史: 1962年由PaulHough首次提出,用来检测直线和曲线. 1972年由Richard Duda & Peter Hart推广使用,扩展到任意形状物体的识别. 原理: 一条直线在直角坐标系下的表示形式为y=k*x+b,而在极坐标系下表示为r=x*cos(theta)+y*sin(theta).hough变换的思想为在直角坐标系下的一个点对

  • Java+opencv3.2.0实现hough圆检测功能

    hough圆检测和hough线检测的原理近似,对于圆来说,在参数坐标系中表示为C:(x,y,r). 函数: Imgproc.HoughCircles(Mat image, Mat circles, int method, double dp, double minDist, double param1, double param2, int minRadius, int maxRadius) 参数说明: image:源图像 circles:检测到的圆的输出矢量(x,y,r) method:使用的

  • 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与Op

  • 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:

  • 详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用

    人脸识别技术已经相当成熟,面对满大街的人脸识别应用,像单位门禁.刷脸打卡.App解锁.刷脸支付.口罩检测........ 作为一个图像处理的爱好者,怎能放过人脸识别这一环呢!调研开搞,发现了超实用的Facecognition!现在和大家分享下~~ Facecognition人脸识别原理大体可分为: 1.通过hog算子定位人脸,也可以用cnn模型,但本文没试过: 2.Dlib有专门的函数和模型,实现人脸68个特征点的定位.通过图像的几何变换(仿射.旋转.缩放),使各个特征点对齐(将眼睛.嘴等部位移

  • 人脸识别实战之Opencv+SVM实现人脸识别

    目录 前言 项目结构 编码 训练人脸识别模型 识别图像中的人脸 摄像头识别人脸 前言 在本文中,您将学习如何使用 OpenCV 进行人脸识别.文章分三部分介绍: 第一,将首先执行人脸检测,使用深度学习从每个人脸中提取人脸量化为128位的向量. 第二, 在嵌入基础上使用支持向量机(SVM)训练人脸识别模型. 第三,最后使用 OpenCV 识别图像和视频流中的人脸. 项目结构 编码 新建face_embeddings.py脚本,写入如下代码: # import the necessary packa

  • Python基于opencv实现的人脸识别(适合初学者)

    目录 一点背景知识 一.人脸识别步骤 二.直接上代码 (1)录入人脸.py (2)数据训练.py (3)进行识别.py 三.运行过程及结果 1.获取人脸照片于目标文件中 2.进行数据训练,获得trainer.yml文件中的数据 3.进行识别 总结 一点背景知识 OpenCV 是一个开源的计算机视觉和机器学习库.它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包.根据这个项目的关于页面,OpenCV 已被广泛运用在各种项目上,从谷歌街景的图片拼接,到交互艺术展览的技术实现中,都有

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

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

  • Dlib+OpenCV深度学习人脸识别的方法示例

    前言 人脸识别在LWF(Labeled Faces in the Wild)数据集上人脸识别率现在已经99.7%以上,这个识别率确实非常高了,但是真实的环境中的准确率有多少呢?我没有这方面的数据,但是可以确信的是真实环境中的识别率并没有那么乐观.现在虽然有一些商业应用如员工人脸识别管理系统.海关身份验证系统.甚至是银行人脸识别功能,但是我们可以仔细想想员工人脸识别管理,海关身份证系统的应用场景对身份的验证功能其实并没有商家吹嘘的那么重要,打个比方说员工上班的时候刷脸如果失败了会怎样,是不是重新识

  • opencv实现简单人脸识别

    对于opencv 它提供了许多已经练习好的模型可供使用,我们需要通过他们来进行人脸识别 参考了网上许多资料 假设你已经配好了开发环境 ,在我之前的博客中由开发环境的配置. 项目代码结构: dataSet : 存储训练用的图片,他由data_gen生成,当然也可以修改代码由其他方式生成 haarcascade_frontalface_alt.xml  . haarcascade_frontalface_default.xml: 用于人脸检测的haar分类器,网上普遍说第一个效果更好,第二个运行速度

  • Kears+Opencv实现简单人脸识别

    写在前面:这篇文章也是借鉴了一些前辈的代码和思路写的,代码有些也是复用了别人的. 先说下思路: 1.首先利用Opencv检测出人脸的区域 2.在成功的检测出人脸区域后,将识别出的人脸区域截取成图片,储存起来,用作后续的训练数据. 3.在获取到了足够多的数据后,搭建CNN网络进行训练. 5.训练完成后,将模型存储起来. 6.在利用Opencv实时读取视频流,将检测出人脸的区域变成图片放入模型中进行预测. 以上就是这个项目的一个基本的思路了. 1.利用Opencv检测人脸的代码如下,这个代码在Ope

  • Java实现人脸识别登录、注册等功能(最新完整版)

    目录 前言: 难度分析: 项目回顾(百度云AI) 最终效果演示: 技术选型: 项目需求分析 项目搭建 注意事项(项目搭建前了解) 项目总结 前言: 这段时间由于学校实行静态化管理,寝室门和校门都是用了人脸识别的装置,每次经过都会激发我的好奇心,也想自己搞一个人脸识别玩玩,随着开始查找资料来研究这方面的信息,还好有好几家公司都有提供这方面的免费API,也是省下来很多功夫.一开始采用的是face++,但是在执行到最后一步人脸搜索时出现问题,一直提示INVALID_OUTER_ID,跟着官方文档,一步

随机推荐