android 感知哈希算法,感知哈希算法android ndk OpenCV

\app\src\main\cpp\native-lib.cpp

传入图片预览数据

extern "C"

JNIEXPORT jlong JNICALL

Java_com_junyang_baiduai_Main3Activity_getPhotoArray2(JNIEnv *env, jobject instance,

jbyteArray data_, jint w, jint h,

jint cameraId) {

jbyte *data = env->GetByteArrayElements(data_, NULL);

Mat matSrc(h, w, CV_8UC1, data), matDst1;

cvtColor(matSrc, matSrc, COLOR_YUV2RGBA_NV21);

int iAvg1 = 0;

int arr1[64];

if (!matSrc.data) {

env->ReleaseByteArrayElements(data_, data, 0);

return 0;

}

cv::resize(matSrc, matDst1, cv::Size(8, 8), 0, 0, cv::INTER_CUBIC);

cv::cvtColor(matDst1, matDst1, CV_BGR2GRAY);

for (int i = 0; i < 8; i++) {

uchar *data1 = matDst1.ptr(i);

int tmp = i * 8;

for (int j = 0; j < 8; j++) {

int tmp1 = tmp + j;

arr1[tmp1] = data1[j] / 4 * 4;

iAvg1 += arr1[tmp1];

}

}

iAvg1 /= 64;

jlong p = 1;

jlong value = 0;

for (int i = 0; i < 64; i++) {

if (arr1[i] >= iAvg1) {

value += p;

}

p *= 2;

}

env->ReleaseByteArrayElements(data_, data, 0);

return value;

}

传入图片文件路径:

extern "C"

JNIEXPORT jlong JNICALL

Java_com_junyang_baiduai_Main3Activity_getPhotoArray(JNIEnv *env, jobject instance, jstring strSrcImageName) {

char *imagPath = 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(strSrcImageName, mid, strencode);

jsize alen = env->GetArrayLength(barr);

jbyte *ba = env->GetByteArrayElements(barr, JNI_FALSE);

if (alen > 0) {

imagPath = (char *) malloc(alen + 1);

memcpy(imagPath, ba, alen);

imagPath[alen] = 0;

}

env->ReleaseByteArrayElements(barr, ba, 0);

Mat matSrc, matDst1;

matSrc = cv::imread(imagPath, CV_LOAD_IMAGE_COLOR);

int iAvg1 = 0;

int arr1[64];

if (!matSrc.data) {

return 0;

}

cv::resize(matSrc, matDst1, cv::Size(8, 8), 0, 0, cv::INTER_CUBIC);

cv::cvtColor(matDst1, matDst1, CV_BGR2GRAY);

for (int i = 0; i < 8; i++) {

uchar *data1 = matDst1.ptr(i);

int tmp = i * 8;

for (int j = 0; j < 8; j++) {

int tmp1 = tmp + j;

arr1[tmp1] = data1[j] / 4 * 4;

iAvg1 += arr1[tmp1];

}

}

iAvg1 /= 64;

jlong p = 1;

jlong value = 0;

for (int i = 0; i < 64; i++) {

if (arr1[i] >= iAvg1) {

value += p;

}

p *= 2;

}

return value;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值