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

 

posted on 2015-08-04 11:26  mmdsnb  阅读(480)  评论(0)    收藏  举报

导航