【问题标题】:What to pass to Android's NDK so an image can be loaded with OpenCV?将什么传递给 Android 的 NDK 以便可以使用 OpenCV 加载图像?
【发布时间】:2020-10-27 19:14:07
【问题描述】:

信息

我有一个 Android NDK / OpenCV 项目(运行原生 c++ 代码)。

我正在尝试将图像加载到 NDK,因此我将图像加载为位图,以便获取它的路径。

我不想将整个图像传递给 NDK(如this answerthis answer 或其他),我只想将一个字符串(例如图像路径)或一个指针或类似的东西传递给 NDK,并且使用 OpenCV 从 NDK 读取图像。

我尝试使用OpenCV's Face Detection example 作为参考,但它并没有真正做到我想要做的事情。

为了在 Java 中获取路径字符串,我尝试了这个:

Uri uri = data.getData();
String imagePath = uri.getEncodedPath();

或者这个:

Cursor imageCursor;
int imageNameIndex, imageSizeIndex;
Uri uri = data.getData();
imageCursor = getContentResolver().query(uri, null, null, null, null);
imageNameIndex = imageCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
String imagePath = imageCursor.getString(nameIndex);

或者说:

String imageFullPath = Environment.getExternalStorageDirectory() + "/Pictures/" + imagePath;

或者说:

String imageFullPath = Environment.DIRECTORY_PICTURES + "/" + imagePath;

这让我得到了/storage/emulated/0/Pictures/my-image.jpgPictures/my-image.jpgmy-image.jpg/document/image%3A167 之类的字符串。

然后我将字符串传递给 NDK(将其转换为 char *)并尝试使用 OpenCV 的 imread 在 C++ 上加载图像:

Mat image = imread(image_path, IMREAD_COLOR);

所有上述试验都会产生一个空的Mat 对象(所有int 值都等于0 并且指针都是NULL)。

我也尝试过使用指针的类似方法。

问题

这是一个 OpenCV 问题吗?我应该以某种方式初始化Mat吗?

如果不是,我应该将什么字符串/指针传递给 NDK 以便它可以加载图像?

【问题讨论】:

    标签: android android-studio opencv image-processing android-ndk


    【解决方案1】:

    传递指针

    Java 端:

    Activity.java:

    // create a mat object with CvType.CV_8UC4, for Android's RGBA_8888
    Mat passToNativeMat = new Mat(height, width, CvType.CV_8UC4);
    
    // convert (for example) a bitmap image to Mat object
    Utils.bitmapToMat(bitmap, passToNativeMat);
    
    // get the native address of the Mat object created
    long passToNativeMatAddress = passToNativeMat.getNativeObjAddr();
    
    // call the Native function
    String imageToJNIResult = imageToJNI(passToNativeMatAddress);
    
    // native declarations
    public native String imageToJNI(long imagePointer);
    

    原生端:

    native-lib.cpp:

    extern "C"
    JNIEXPORT jstring JNICALL
    Java_package_activity_imageToJNI(
            JNIEnv* env,
            jobject thiz,
            jlong imagePointer) {
    
        Mat& image_in_native = *(Mat*) imagePointer;
    
        // do something with image Mat object
    
        string return_string = "Return string";
    
        return env->NewStringUTF(return_string.c_str());
    

    }

    传递字节数组

    Java 端:

    public native String byteToJNI(byte[] myArray);
    

    原生端:

    extern "C" JNIEXPORT jstring JNICALL
    Java_package_activity_byteToJNI(
            JNIEnv* env,
            jobject thiz,
            jbyteArray array) {
    
        Mat * mat = ByteToMat(array);
    
        string return_string = "Return string";
    
        return env->NewStringUTF(return_string.c_str());
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 2021-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多