`
yjdingkai
  • 浏览: 18661 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java人脸识别在项目中的应用(二)

 
阅读更多

前面已经说了java通过JNI调用OpenCV实现人脸识别,但上个例子程序是在没有包(package)的情况下编译的,文件只能放在项目的src目录下。这篇就解决这个问题。程序的目标是将这些文件放在com.test.detectionface包下也行运行程序。

   1.JAVA的JNI部分

 

package com.test.detectionface;

public class JNIOpenCV{ 
	public JNIOpenCV() {}
  static{ 
            System.out.println("开始加载JNI2OpenCV.dll");
            System.loadLibrary("JNI2OpenCV");
            System.out.println("加载完成");
  }  
   // 加载动态链接库
  public native int[] detectFace(int minFaceWidth, int minFaceHeight, String cascade, String filename);  
   // 声明本地方法    
}

    类中定义的detectFace方法,是要用C来实现的。

    编译好这个类后,要在命令行用javah命令生成需要的.h的头文件。

    命令如下:
            javah com.test.detectionface.JNIOpenCV

     会生成一个名为 com_test_detectionface_JNIOpenCV.h 的头文件

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class lveyo_bcndyl_jni_opencv_JNIOpencv */

#ifndef _Included_com_test_detectionface_JNIOpenCV
#define _Included_com_test_detectionface_JNIOpenCV
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_test_detectionface_JNIOpenCV
 * Method:    detectFace
 * Signature: (IILjava/lang/String;Ljava/lang/String;)[I
 */
JNIEXPORT jintArray JNICALL Java_com_test_detectionface_JNIOpenCV_detectFace
  (JNIEnv *, jobject, jint, jint, jstring, jstring);

#ifdef __cplusplus
}
#endif
#endif

    2.C程序部分

    按照http://www.opencv.org.cn/index.php/Template:Install安装OpenCV并配置相应的开发环境,我这里用的是VS2005,同时要将JDK中的include目录和include/win32目录都加入到VS2005的Include Files中。
新建一个win32 MFC DLL项目JNI2OpenCV,把刚才生成的com_test_detectionface_JNIOpenCV.h头文件加入到项目,并且修改JNI2OpenCV.cpp文件:

#include "stdafx.h"
#include <jni.h>
#include "com_test_detectionface_JNIOpenCV.h"
#include "cv.h"
#include "highgui.h"

JNIEXPORT jintArray JNICALL Java_com_test_detectionface_JNIOpenCV_detectFace
  (JNIEnv *env, jobject obj, jint width, jint height, jstring cascade, jstring filename)
{
	const char *str_cascade, *str_filename;
	str_cascade = env->GetStringUTFChars(cascade, false);
	str_filename = env->GetStringUTFChars(filename, false);

	jintArray faceArray;
	CvHaarClassifierCascade *cv_cascade = (CvHaarClassifierCascade*)cvLoad( str_cascade );
	IplImage *image = cvLoadImage( str_filename, 1 );
	
	if(image!=0){

		CvMemStorage* storage = cvCreateMemStorage(0);
		CvSeq* faces;

		//double t = (double)cvGetTickCount();
		/* use the fastest variant */
		faces = cvHaarDetectObjects( image, cv_cascade, storage, 1.2, 2,
                                   CV_HAAR_DO_CANNY_PRUNING, cvSize(width, height) );
		//t = (double)cvGetTickCount() - t;
        //printf( "detection time = %gms\n", t/((double)cvGetTickFrequency()*1000.) );
		

		const int total = faces->total;

		faceArray = env-> NewIntArray(4*total);
		jint faceBuf[4];
		
		for( int i = 0; i < total; i++ )
		{
			CvRect face_rect = *(CvRect*)cvGetSeqElem( faces, i );
			int pointX = face_rect.x;
			int pointY = face_rect.y;
			int faceWidth = face_rect.width;
			int faceHeight = face_rect.height;

			//printf("i %d, x %d, y %d, width %d, height %d\n",
                        //        i,pointX,pointY,faceWidth,faceHeight);


			faceBuf[0] = pointX;
			faceBuf[1] = pointY;
			faceBuf[2] = faceWidth;
			faceBuf[3] = faceHeight;


			env->SetIntArrayRegion(faceArray,i*4,4,faceBuf);
			
		}
		
		cvReleaseMemStorage( &storage );
		cvReleaseImage( &image );
	}
	cvReleaseHaarClassifierCascade( &cv_cascade );
    

	env->ReleaseStringUTFChars(cascade, str_cascade);
	env->ReleaseStringUTFChars(filename, str_filename);
	return faceArray;
}

 

编译生成JNI2OpenCV.dll。此处的检测代码是根据OpenCV的文档和示例程序修改,由于本人对c++程序不是很熟练,所以对此段代码是否会有潜在危险和内存泄露不是很肯定,还请熟悉c使用的朋友帮忙检查一下。
别忘记将生成的JNI2OpenCV.dll文件复制到%JAVA_HOME%/bin中,如果在没安装OpenCV的机器上运行,还需要将OpenCV安装目录中bin目录下所有dll文件一起复制到%JAVA_HOME%/bin中。

 

 

java调用部分的代码就不写了。上面一文有的。

分享到:
评论

相关推荐

    java 人脸识别,一个开源项目.rar

    在实际应用中,Java人脸识别系统可能涉及到以下步骤: 1. 图像预处理:去除噪声,调整大小,灰度化等。 2. 人脸检测:使用Haar特征或者HOG等方法检测图像中的人脸区域。 3. 特征提取:使用上述提到的LBPH、EigenFace...

    java人脸识别在项目中的应用(一)

    这篇博客“java人脸识别在项目中的应用(一)”将介绍如何在Java项目中集成和使用人脸识别功能,特别是通过JNI(Java Native Interface)调用OpenCV库来实现这一目标。OpenCV是一个强大的计算机视觉库,支持多种编程...

    java人脸识别源码

    Java人脸识别源码是一种基于计算机视觉技术的应用,它利用了特征脸识别原理,使得程序能够检测、识别人脸,无论是在实时的摄像头流中还是在静态的图像或视频文件中。这个项目采用JavaCV库,一个Java接口,为OpenCV等...

    java调用虹软人脸识别

    接着,需要在Java代码中导入SDK的相关类和函数,以便在程序中调用虹软人脸识别的功能。然后,需要在程序中设置摄像头参数、图像大小等相关参数,以便进行人脸识别。最后,可以通过调用虹软人脸识别的API,实现人脸...

    java人脸识别源代码

    在这个"java人脸识别源代码"项目中,开发者可能已经实现了从图像中检测人脸的关键步骤,包括预处理(如灰度化、直方图均衡化)、特征提取(如Haar级联分类器、LBPH、Dlib的HOG描述符)、以及使用神经网络进行面部...

    java百度人脸识别

    可以参考提供的链接(http://blog.csdn.net/weixin_39549656/article/details/79262895)中的教程,学习如何在实际项目中整合这些概念,构建一个完整的Java人脸识别系统。 总的来说,Java百度人脸识别是一个结合了...

    java调用 人脸识别接口demo

    总的来说,通过学习和实践这个"java调用人脸识别接口demo",你可以掌握如何在Java项目中集成和使用人脸识别技术,为你的应用增加强大的视觉功能。无论是安全认证、用户界面优化还是数据分析,这些知识都将对你的编程...

    java实现人脸识别

    在实际应用中,还需要考虑光照变化、姿态变化、遮挡等因素,以提高人脸识别的准确性和鲁棒性。 总之,Java实现人脸识别的关键在于理解和运用OpenCV库,包括面部检测、图像处理和特征提取等核心模块。通过不断的实践...

    src.rar_SRC 人脸识别_java 人脸识别_java人脸识别_人脸识别_人脸识别Java

    这个名为"src.rar_SRC 人脸识别_java 人脸识别_java人脸识别_人脸识别_人脸识别Java"的压缩包文件,显然包含了一个使用Java编程语言实现的人脸识别系统。Java作为一种跨平台、面向对象的语言,因其稳定性和丰富的库...

    百度人脸识别windows java离线sdk

    在本文中,我们将深入探讨“百度人脸识别Windows Java离线SDK”的相关知识点,这是一款专为Windows平台设计的、基于Java的计算机视觉库,主要用于实现高效、精准的人脸识别功能。在人工智能领域,尤其是在计算机视觉...

    java人脸识别

    总结,这个"java人脸识别"项目利用OpenCV在Android平台上实现了人脸识别功能,尽管已验证成功,但还需持续优化以提高准确率。通过理解OpenCV的工作原理、人脸检测和识别的步骤、以及在移动平台上的性能优化,我们...

    java人脸识别例程

    总结来说,"java人脸识别例程"涵盖了计算机视觉、机器学习和Java编程等多个领域的知识,通过这个例程,开发者可以学习到如何在Java环境中集成和应用人脸识别技术,以及如何处理与之相关的数据和性能问题。

    腾讯身份证验证人脸识别代码java实例

    在IT行业中,腾讯AI提供了强大的身份验证服务,其中包括身份证识别和人脸识别技术。这些技术广泛应用于各种场景,如在线注册、实名认证、金融交易安全等。以下是对标题和描述中涉及知识点的详细解释: 1. **腾讯AI...

    java 实现人脸识别

    JNI允许Java代码直接调用C/C++的函数,这样就能在Java应用中无缝集成OpenCV的原生性能。 在人脸识别方面,OpenCV提供了一些预训练的人脸检测模型,如Haar级联分类器或LBP(Local Binary Patterns)特征。这些模型...

    java+虹软人脸识别检测

    在本文中,我们将深入探讨如何使用Java结合虹软的人脸识别技术进行图像处理和面部检测。这个项目涉及前端上传照片,然后由后端Java服务进行分析,确认照片中是否存在人脸。 首先,我们要理解人脸检测的基本概念。...

    基于百度API实现的人脸识别demo-Java前后端分离实现

    在本项目"基于百度API实现的人脸识别demo-Java前后端分离实现"中,开发者采用百度的人脸识别技术,结合Java编程语言,构建了一个完整的、前后端分离的应用系统。这个系统涵盖了人脸注册、人脸登录、人脸检测、以及...

    Android 人脸识别+人脸匹配(OpenCV+JavaCV)

    在Android平台上实现人脸识别和人脸匹配是一项复杂而有趣的任务,它涉及到计算机视觉和机器学习领域的技术。在这个项目中,开发者使用了OpenCV和JavaCV库来完成这一目标。OpenCV(Open Source Computer Vision ...

    人脸识别小项目

    通过这个项目,我们可以深入学习如何在Java环境中搭建和应用人脸识别系统。 首先,人脸识别基于深度学习模型,如卷积神经网络(CNN),这些模型能够从图像中提取特征,然后进行人脸比对。Java中虽然不像Python那样...

Global site tag (gtag.js) - Google Analytics