JAVA应用JNI调用OpenCV实现人脸检测
1.JAVA的JNI部分
调用JNI的基类
package lveyo.bcndyl.jni.opencv;public class JNIBase {public JNIBase(){}public JNIBase(String libraryName){loadLibrary(libraryName);}private static void loadLibrary(String libraryName){System.loadLibrary(libraryName);}}package lveyo.bcndyl.jni.opencv;public class JNIOpencv extends JNIBase{public JNIOpencv (String libraryName){super(libraryName);}public JNIOpencv(){System.loadLibrary("jniOpenCV");} public native int[] detectFace(int minFaceWidth, int minFaceHeight, String cascade, String filename);}#include "stdafx.h"#include <jni.h>#include "lveyo_bcndyl_jni_opencv_JNIOpencv.h"#include "cv.h"#include "highgui.h"JNIEXPORT jintArray JNICALL Java_lveyo_bcndyl_jni_opencv_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;}package lveyo.bcndyl.jni.opencv;public class Test {public static void main(String[] args) {//初始化JNI调用类JNIOpencvJNIOpencv open = new JNIOpencv("jniOpenCV");//要检测的图片文件String filename = "d:/80010.jpg";//OpenCv提供的人间的特征文件String cascade = "d:/haarcascade_frontalface_alt2.xml";//人脸检测,前两个参数为可检测的最小人脸的宽度和高度//返回值为人脸在图中的坐标和宽高,{x, y, width, height}int[] faces = open.detectFace(40, 40, cascade, filename);if(faces != null && faces.length!=0){//返回的人脸总数System.out.println( "faces " + faces.length/4 );//分别输出每个人脸的坐标信息for (int temp : faces) {System.out.println(temp);}}}}
11 楼 shun1 2012-09-24 您好啊,您能把邮箱给我吗?我有问题可以请教你啊。