热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaCV实现人脸检测功能

这篇文章主要为大家详细介绍了JavaCV实现人脸检测功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了JavaCV实现人脸检测功能的具体代码,供大家参考,具体内容如下

/* 
 * Copyright (C) 2010,2011,2012 Samuel Audet 
 * 
 * FacePreview - A fusion of OpenCV's facedetect and Android's CameraPreview samples, 
 *        with JavaCV + JavaCPP as the glue in between. 
 * 
 * This file was based on CameraPreview.java that came with the Samples for 
 * Android SDK API 8, revision 1 and contained the following copyright notice: 
 * 
 * Copyright (C) 2007 The Android Open Source Project 
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); 
 * you may not use this file except in compliance with the License. 
 * You may obtain a copy of the License at 
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0 
 * 
 * Unless required by applicable law or agreed to in writing, software 
 * distributed under the License is distributed on an "AS IS" BASIS, 
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
 * See the License for the specific language governing permissions and 
 * limitations under the License. 
 * 
 * 
 * IMPORTANT - Make sure the AndroidManifest.xml file looks like this: 
 * 
 * <&#63;xml version="1.0" encoding="utf-8"&#63;> 
 *  
 *    
 *    
 *    
 *    
 *      
 *        
 *          
 *          
 *        
 *      
 *    
 *  
 */ 
 
package com.googlecode.javacv.facepreview; 
 
import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.ImageFormat; 
import android.graphics.Paint; 
import android.hardware.Camera; 
import android.hardware.Camera.Size; 
import android.os.Bundle; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.view.Window; 
import android.view.WindowManager; 
import android.widget.FrameLayout; 
import java.io.File; 
import java.io.IOException; 
import java.nio.ByteBuffer; 
import java.util.List; 
import com.googlecode.javacpp.Loader; 
import com.googlecode.javacv.cpp.opencv_objdetect; 
 
import static com.googlecode.javacv.cpp.opencv_core.*; 
import static com.googlecode.javacv.cpp.opencv_imgproc.*; 
import static com.googlecode.javacv.cpp.opencv_objdetect.*; 
import static com.googlecode.javacv.cpp.opencv_highgui.*; 
 
// ---------------------------------------------------------------------- 
 
public class FacePreview extends Activity { 
  private FrameLayout layout; 
  private FaceView faceView; 
  private Preview mPreview; 
 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    // Hide the window title. 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
 
    super.onCreate(savedInstanceState); 
 
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 
 
    // Create our Preview view and set it as the content of our activity. 
    try { 
      layout = new FrameLayout(this); 
      faceView = new FaceView(this); 
      mPreview = new Preview(this, faceView); 
      layout.addView(mPreview); 
      layout.addView(faceView); 
      setContentView(layout); 
    } catch (IOException e) { 
      e.printStackTrace(); 
      new AlertDialog.Builder(this).setMessage(e.getMessage()).create().show(); 
    } 
  } 
} 
 
// ---------------------------------------------------------------------- 
 
class FaceView extends View implements Camera.PreviewCallback { 
  public static final int SUBSAMPLING_FACTOR = 4; 
 
  private IplImage grayImage; 
  private CvHaarClassifierCascade classifier; 
  private CvMemStorage storage; 
  private CvSeq faces; 
 
  public FaceView(FacePreview context) throws IOException { 
    super(context); 
 
    // Load the classifier file from Java resources. 
    File classifierFile = Loader.extractResource(getClass(), 
      "/com/googlecode/javacv/facepreview/haarcascade_frontalface_alt2.xml", 
      context.getCacheDir(), "classifier", ".xml"); 
    if (classifierFile == null || classifierFile.length() <= 0) { 
      throw new IOException("Could not extract the classifier file from Java resource."); 
    } 
 
    // Preload the opencv_objdetect module to work around a known bug. 
    Loader.load(opencv_objdetect.class); 
    classifier = new CvHaarClassifierCascade(cvLoad(classifierFile.getAbsolutePath())); 
    classifierFile.delete(); 
    if (classifier.isNull()) { 
      throw new IOException("Could not load the classifier file."); 
    } 
    storage = CvMemStorage.create(); 
  } 
 
  public void onPreviewFrame(final byte[] data, final Camera camera) { 
    try { 
      Camera.Size size = camera.getParameters().getPreviewSize(); 
      processImage(data, size.width, size.height); 
      camera.addCallbackBuffer(data); 
    } catch (RuntimeException e) { 
      // The camera has probably just been released, ignore. 
    } 
  } 
 
  protected void processImage(byte[] data, int width, int height) { 
    // First, downsample our image and convert it into a grayscale IplImage 
    int f = SUBSAMPLING_FACTOR; 
    if (grayImage == null || grayImage.width() != width/f || grayImage.height() != height/f) { 
      grayImage = IplImage.create(width/f, height/f, IPL_DEPTH_8U, 1); 
    } 
    int imageWidth = grayImage.width(); 
    int imageHeight = grayImage.height(); 
    int dataStride = f*width; 
    int imageStride = grayImage.widthStep(); 
    ByteBuffer imageBuffer = grayImage.getByteBuffer(); 
    for (int y = 0; y  sizes, int w, int h) { 
    final double ASPECT_TOLERANCE = 0.05; 
    double targetRatio = (double) w / h; 
    if (sizes == null) return null; 
 
    Size optimalSize = null; 
    double minDiff = Double.MAX_VALUE; 
 
    int targetHeight = h; 
 
    // Try to find an size match aspect ratio and size 
    for (Size size : sizes) { 
      double ratio = (double) size.width / size.height; 
      if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE) continue; 
      if (Math.abs(size.height - targetHeight)  sizes = parameters.getSupportedPreviewSizes(); 
    Size optimalSize = getOptimalPreviewSize(sizes, w, h); 
    parameters.setPreviewSize(optimalSize.width, optimalSize.height); 
 
    mCamera.setParameters(parameters); 
    if (previewCallback != null) { 
      mCamera.setPreviewCallbackWithBuffer(previewCallback); 
      Camera.Size size = parameters.getPreviewSize(); 
      byte[] data = new byte[size.width*size.height* 
          ImageFormat.getBitsPerPixel(parameters.getPreviewFormat())/8]; 
      mCamera.addCallbackBuffer(data); 
    } 
    mCamera.startPreview(); 
  } 
 
} 

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


推荐阅读
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • Android日历提醒软件开源项目分享及使用教程
    本文介绍了一款名为Android日历提醒软件的开源项目,作者分享了该项目的代码和使用教程,并提供了GitHub项目地址。文章详细介绍了该软件的主界面风格、日程信息的分类查看功能,以及添加日程提醒和查看详情的界面。同时,作者还提醒了读者在使用过程中可能遇到的Android6.0权限问题,并提供了解决方法。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了在Win10上安装WinPythonHadoop的详细步骤,包括安装Python环境、安装JDK8、安装pyspark、安装Hadoop和Spark、设置环境变量、下载winutils.exe等。同时提醒注意Hadoop版本与pyspark版本的一致性,并建议重启电脑以确保安装成功。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
author-avatar
宝贝缘缘儿
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有