首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

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

2012-09-23 
java人脸识别在项目中的应用(二)前面已经说了java通过JNI调用OpenCV实现人脸识别,但上个例子程序是在没有

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

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

?? 1.JAVA的JNI部分

?

??? 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调用部分的代码就不写了。上面一文有的。

热点排行