From 84e391f79e4c298e31b990667a54d991d645949f Mon Sep 17 00:00:00 2001
From: 554325746@qq.com <554325746@qq.com>
Date: 星期三, 25 十二月 2019 09:01:50 +0800
Subject: [PATCH] a
---
app/src/main/cpp/native-lib.cpp | 145 ++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 121 insertions(+), 24 deletions(-)
diff --git a/app/src/main/cpp/native-lib.cpp b/app/src/main/cpp/native-lib.cpp
index 4f3cd16..ada1409 100644
--- a/app/src/main/cpp/native-lib.cpp
+++ b/app/src/main/cpp/native-lib.cpp
@@ -5,6 +5,12 @@
#include <string.h>
#include <sys/time.h>
#include <time.h>
+#include "turbojpeg.h"
+#include "libyuv.h"
+
+#define LOG_TAG "turbojpeg"
+#define LOGW(...) __android_log_write(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__)
+#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#include "FiStdDefEx.h"
#include "THFaceImage_i.h"
@@ -80,36 +86,42 @@
Java_com_basic_security_utils_FaceId_initSdk(
JNIEnv *env, jobject, jstring jModelPath) {
const char *modelPath = env->GetStringUTFChars(jModelPath, 0);
- bool init_sdk_success = false;
- THFI_Param detParam;
- detParam.nMinFaceSize = 50;
- detParam.nRollAngle = 30;
- detParam.bOnlyDetect = false;
- detParam.dwReserved = NULL;
- THFI_SetDir(modelPath, modelPath);
- int ret = THFI_Create(1, &detParam);
- if (ret < 0) {
- printf("THFI_Create failed!(ret=%d)\n", ret);
- init_sdk_success = false;
- }
-// THFL_SDK_SetDir(modelPath, modelPath);
-// ret = THFL_Create(1);
+ jboolean success = false;
+ success = FaceDetectHelper::getInstance()->initSdk(modelPath);
+
+ return success;
+
+
+// bool init_sdk_success = false;
+// THFI_Param detParam;
+// detParam.nMinFaceSize = 50;
+// detParam.nRollAngle = 30;
+// detParam.bOnlyDetect = false;
+// detParam.dwReserved = NULL;
+// THFI_SetDir(modelPath, modelPath);
+// int ret = THFI_Create(1, &detParam);
// if (ret < 0) {
-// printf("THFL_Create failed!(ret=%d)\n", ret);
+// printf("THFI_Create failed!(ret=%d)\n", ret);
+// init_sdk_success = false;
+// }
+//// THFL_SDK_SetDir(modelPath, modelPath);
+//// ret = THFL_Create(1);
+//// if (ret < 0) {
+//// printf("THFL_Create failed!(ret=%d)\n", ret);
+//// THFI_Release();
+//// init_sdk_success = false;
+//// }
+// EF_SetDir(modelPath, modelPath);
+// ret = EF_Init(1);
+// if (ret < 0) {
+// printf("EF_Init failed!(ret=%d)\n", ret);
// THFI_Release();
// init_sdk_success = false;
// }
- EF_SetDir(modelPath, modelPath);
- ret = EF_Init(1);
- if (ret < 0) {
- printf("EF_Init failed!(ret=%d)\n", ret);
- THFI_Release();
- init_sdk_success = false;
- }
// featureSize = EF_Size();
// feature1 = new BYTE[featureSize];
- init_sdk_success = true;
- return init_sdk_success;
+// init_sdk_success = true;
+// return init_sdk_success;
}
jint getIntValue(JNIEnv *env, jobject detectedResult, char *fieldName) {
@@ -282,6 +294,7 @@
JNIEnv *env, jobject,jint channel, jstring jModelPath, jstring jRgbFileName, jint width, int height,
jstring baseFeatureName, int shouldExtractFeature, bool useGrayCamera,
int detectFaceCount, jbyteArray bgrArray) {
+// new char[80*1024*1024];
string faces = FaceDetectHelper::getInstance()->detectRealFace4(env,
channel, env->GetStringUTFChars(jModelPath, 0), env->GetStringUTFChars(jRgbFileName, 0), nullptr,
width, height, env->GetStringUTFChars(baseFeatureName, 0), shouldExtractFeature,
@@ -310,6 +323,15 @@
JNIEnv *env, jobject, jstring jpgFileName) {
return FaceDetectHelper::getInstance()->extractFeature(env,
env->GetStringUTFChars(jpgFileName, 0));
+}
+
+extern "C" JNIEXPORT jstring
+JNICALL
+Java_com_basic_security_utils_FaceId_facePosition(
+ JNIEnv *env, jobject, jstring jpgFileName) {
+ string facePosition = FaceDetectHelper::getInstance()->facePosition(env,
+ env->GetStringUTFChars(jpgFileName, 0));
+ return env->NewStringUTF(facePosition.c_str());
}
extern "C" JNIEXPORT jbyteArray
@@ -746,4 +768,79 @@
}
+void cnv212yuv420(unsigned char *Src_data, unsigned char *Dst_data,
+ int src_width, int src_height) {
+
+ int NV12_Y_Size = src_width * src_height;
+
+ //dst:YUV420 video size
+ int I420_Y_Size = src_width * src_height;
+ int I420_U_Size = (src_width >> 1) * (src_height >> 1);
+
+ // video format transformation process
+ unsigned char *Y_data_Src = Src_data;
+ unsigned char *UV_data_Src = Src_data + NV12_Y_Size;
+ int src_stride_y = src_width;
+ int src_stride_uv = src_width;
+
+ unsigned char *Y_data_Dst = Dst_data;
+ unsigned char *U_data_Dst = Dst_data + I420_Y_Size;
+ unsigned char *V_data_Dst = Dst_data + I420_Y_Size + I420_U_Size;
+
+ int Dst_Stride_Y = src_width;
+ int Dst_Stride_U = src_width >> 1;
+ int Dst_Stride_V = Dst_Stride_U;
+ libyuv::NV21ToI420(Y_data_Src, src_stride_y,
+ UV_data_Src, src_stride_uv,
+ Y_data_Dst, Dst_Stride_Y,
+ U_data_Dst, Dst_Stride_U,
+ V_data_Dst, Dst_Stride_V,
+ src_width, src_height);
+}
+
+extern "C"
+JNIEXPORT jint JNICALL Java_com_basic_security_utils_FaceId_yuv2jpeg
+ (JNIEnv * env, jclass jclazz, jbyteArray jNv21,jbyteArray jI420, jint width, jint height,
+ jint subsample, jbyteArray jpeg,jint quality,jint flags){
+
+ tjhandle handle = NULL;
+ int padding = 1; // 1鎴�4鍧囧彲锛屼絾涓嶈兘鏄�0
+ int ret = 0;
+
+ if((handle=tjInitCompress())==NULL){
+ LOGI("tjInitCompress error");
+ return 1001;
+ }
+
+// if(env->GetArrayLength(jpeg) < (jsize)tjBufSizeYUV2(width, padding, height, subsample)){
+// LOGI("Destination buffer is not large enough");
+// return 1002;
+// }
+
+ unsigned char *srcBuf = (unsigned char *)env->GetPrimitiveArrayCritical(jNv21, 0);
+ unsigned char *i420Buf = (unsigned char *)env->GetPrimitiveArrayCritical(jI420, 0);
+
+ cnv212yuv420(srcBuf,i420Buf,width,height);
+
+ unsigned char *jpegBuf = (unsigned char *)env->GetPrimitiveArrayCritical(jpeg, 0);
+ unsigned long compressSize;
+
+ ret = tjCompressFromYUV(handle, i420Buf, width, padding, height,
+ subsample, &jpegBuf, &compressSize, quality, flags);
+
+ tjDestroy(handle);
+ env->ReleasePrimitiveArrayCritical(jNv21, srcBuf, 0);
+ env->ReleasePrimitiveArrayCritical(jI420, i420Buf, 0);
+ env->ReleasePrimitiveArrayCritical(jpeg, jpegBuf, 0);
+// tjFree(jpegBuf);
+// tjFree(srcBuf);
+ jpegBuf=srcBuf=NULL;
+
+ if (ret < 0) {
+ LOGI("compress to jpeg failed: %d\n",ret);
+ return ret;
+ }
+ ret = compressSize;
+ return ret;
+}
--
Gitblit v1.8.0