美文网首页
感知哈希算法android ndk OpenCV

感知哈希算法android ndk OpenCV

作者: MacLi | 来源:发表于2019-05-23 15:59 被阅读0次

    \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<uchar>(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<uchar>(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;
    }
    

    相关文章

      网友评论

          本文标题:感知哈希算法android ndk OpenCV

          本文链接:https://www.haomeiwen.com/subject/fqkbzqtx.html