java jni 调用 c++ opencv 人脸识别
#include <iostream> #include "opencv2/core/core.hpp" #include <opencv2/objdetect/objdetect.hpp> #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> #include <string> /* Header for class cn_com_hithere_summer_impl_image_FaceOpenCVService */ using namespace std; using namespace cv; #ifndef _Included_cn_com_hithere_summer_impl_image_FaceOpenCVService #define _Included_cn_com_hithere_summer_impl_image_FaceOpenCVService #ifdef __cplusplus extern "C" { #endif /* * Class: cn_com_hithere_summer_impl_image_FaceOpenCVService * Method: loadCascadeClassifier * Signature: (Ljava/lang/String;)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_cn_com_hithere_summer_impl_image_FaceOpenCVService_loadCascadeClassifier (JNIEnv *env, jobject jobj, jstring jFilePath); /* * Class: cn_com_hithere_summer_impl_image_FaceOpenCVService * Method: detectMultiScaleByFilePath * Signature: (Ljava/lang/String;)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_cn_com_hithere_summer_impl_image_FaceOpenCVService_detectMultiScaleByFilePath (JNIEnv *env, jobject jobj, jstring jFilePath); /* * Class: cn_com_hithere_summer_impl_image_FaceOpenCVService * Method: detectMultiScaleByByteArray * Signature: ([B)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_cn_com_hithere_summer_impl_image_FaceOpenCVService_detectMultiScaleByByteArray (JNIEnv *env, jobject jobj, jbyteArray jBytes); #ifdef __cplusplus } #endif #endif
#include "cn_com_hithere_summer_impl_image_FaceOpenCVService.h" CascadeClassifier mface_cascade; char* jstringTostring(JNIEnv* env, jstring jstr) { char* rtn = NULL; jclass clsstring = env->FindClass("java/lang/String"); jstring strencode = env->NewStringUTF("utf-8"); jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B"); jbyteArray barr = (jbyteArray)env->CallObjectMethod(jstr, mid, strencode); jsize alen = env->GetArrayLength(barr); jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE); if (alen > 0) { rtn = (char*)malloc(alen + 1); memcpy(rtn, ba, alen); rtn[alen] = 0; } env->ReleaseByteArrayElements(barr, ba, 0); return rtn; } jstring stringtoJstring(JNIEnv* env, const char* pat) { jclass strClass = env->FindClass("Ljava/lang/String;"); jmethodID ctorID = env->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V"); jbyteArray bytes = env->NewByteArray(strlen(pat)); env->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*)pat); jstring encoding = env->NewStringUTF("utf-8"); return (jstring)env->NewObject(strClass, ctorID, bytes, encoding); } string convertIntToString(int num){ ostringstream stream; stream << num; return stream.str(); } string detect(Mat frame){ std::vector<Rect> faces; Mat frame_gray; cvtColor(frame, frame_gray, CV_BGR2GRAY); equalizeHist(frame_gray, frame_gray); mface_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30)); ostringstream oss; oss << "["; for (int i = 0; i < faces.size(); i++){ oss << "{"; oss << "\"x\":" << convertIntToString(faces[i].x) << ",\"y\":" << convertIntToString(faces[i].y) << ","; oss << "\"width\":" << convertIntToString(faces[i].width) << ", \"height\" : " << convertIntToString(faces[i].height); oss << "}"; if (i != faces.size() - 1){ oss << ","; } } oss << "]"; return oss.str(); } JNIEXPORT jstring JNICALL Java_cn_com_hithere_summer_impl_image_FaceOpenCVService_loadCascadeClassifier (JNIEnv *env, jobject jobj, jstring jFilePath){ char* filePath = jstringTostring(env,jFilePath); string face_cascade_name=string(filePath); if (!mface_cascade.load(face_cascade_name)){ char* errorMsg="[error] can't load CascadeClassifier file.\n"; return stringtoJstring(env,errorMsg); } return stringtoJstring(env,"true"); } JNIEXPORT jstring JNICALL Java_cn_com_hithere_summer_impl_image_FaceOpenCVService_detectMultiScaleByFilePath (JNIEnv *env, jobject jobj, jstring jFilePath){ char* filePath = jstringTostring(env,jFilePath); Mat img = imread(string(filePath)); if (img.empty()) { char* errorMsg= "[error] can't open image.\n"; return stringtoJstring(env,errorMsg); } return stringtoJstring(env, detect(img).c_str()); } JNIEXPORT jstring JNICALL Java_cn_com_hithere_summer_impl_image_FaceOpenCVService_detectMultiScaleByByteArray (JNIEnv *env, jobject jobj, jbyteArray jBytes){ char *temp = ""; return stringtoJstring(env, temp); }
编译
g++ -I/usr/local/jdk1.6.0_45/include/ -I/usr/local/jdk1.6.0_45/include/linux -shared -fPIC -o libhi_opencv.so cn_com_hithere_summer_impl_image_FaceOpenCVService.cpp
浙公网安备 33010602011771号