Skip to content

Instantly share code, notes, and snippets.

@nsdevaraj
Created March 11, 2014 05:47
Show Gist options
  • Save nsdevaraj/9480119 to your computer and use it in GitHub Desktop.
Save nsdevaraj/9480119 to your computer and use it in GitHub Desktop.
#include <jni.h>
#include "opencv2/opencv.hpp"
#include <android/log.h>
#include "../stasm/stasm_lib.h"
extern "C" {
JNIEXPORT jintArray JNICALL Java_org_androidhat_stasmandroiddemo_DrHuDemoActivity_FindFaceLandmarks(
JNIEnv* env, jobject, jfloat ratioW, jfloat ratioH)
{
clock_t StartTime = clock();
jintArray arr = env->NewIntArray(2*stasm_NLANDMARKS);
jint *out = env->GetIntArrayElements(arr, NULL);
static const char* path = "/data/data/org.androidhat.stasmandroiddemo/app_stasmdata/testface.jpg";
cv::Mat_<unsigned char> img(cv::imread(path, CV_LOAD_IMAGE_GRAYSCALE));
if (!img.data)
{
__android_log_print(ANDROID_LOG_ERROR, "StasmAndroidDemo", "Cannot load image file %s", path);
out[0] = -1;
out[1] = -1;
img.release();
env->ReleaseIntArrayElements(arr, out, 0);
return arr;
}
int foundface;
float landmarks[2 * stasm_NLANDMARKS]; // x,y coords
if (!stasm_search_single(&foundface, landmarks, (const char*)img.data, img.cols, img.rows, path,
"/data/data/org.androidhat.stasmandroiddemo/app_stasmdata/"))
{
__android_log_print(ANDROID_LOG_ERROR, "StasmAndroidDemo", "Error in stasm_search_single %s", stasm_lasterr());
out[0] = -2;
out[1] = -2;
img.release();
env->ReleaseIntArrayElements(arr, out, 0);
return arr;
}
if (!foundface)
{
__android_log_print(ANDROID_LOG_ERROR, "StasmAndroidDemo", "No face found in %s", path);
out[0] = -3;
out[1] = -3;
img.release();
env->ReleaseIntArrayElements(arr, out, 0);
return arr;
} else {
for (int i = 0; i < stasm_NLANDMARKS; i++)
{
out[2*i] = cvRound(landmarks[2*i]*ratioW);
out[2*i+1] = cvRound(landmarks[2*i+1]*ratioH);
}
}
double TotalAsmTime = double(clock() - StartTime) / CLOCKS_PER_SEC;
__android_log_print(ANDROID_LOG_ERROR, "StasmAndroidDemo",
"Stasm Ver:%s Img:%dx%d ---> Time:%.3f secs.", stasm_VERSION, img.cols, img.rows, TotalAsmTime);
img.release();
env->ReleaseIntArrayElements(arr, out, 0);
return arr;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment