android - 如何通过 android NDK (c++) 将图像放入 openCV 中的 MAT

标签 android c++ opencv android-ndk

我通过 Android NDK(使用 c++) 使用 OpenCv 我想将图像保存为 MAT 格式,然后在我的 android 应用程序上显示它。

我已经将图像保存在 Assets 中。 imread() 在 NKD 中不起作用,因为它找不到图像的文件路径,但是,我可以使用 AssetManager 加载 Assets ,它完美地找到了路径。此方法将数据保存到 char* 缓冲区中。

我怎样才能使用类似于 imread() 的方法将图像保存到 MAT 中,或者将 char* 缓冲区数据转换为 MAT 以便在屏幕上和稍后显示使用其他 openCV 函数进行操作?

最佳答案

使用代码 fragment

extern "C"
JNIEXPORT int JNICALL
Java_com_example_opencv_test_NativeLib_checkNativeImage(JNIEnv *env,
                                                    jclass type,
                                                    jobject jBitmap,
                                                    jint width,
                                                    jint height) {

void *pPixelData = nullptr;
if (AndroidBitmap_lockPixels(env, jBitmap, &pPixelData) ==
    ANDROID_BITMAP_RESULT_SUCCESS) {

    // Android bitmap (Bitmap.Config.ARGB_8888) to Mat
    // Android and OpenCV have different color channels order, just swap it
    // You need cppFlags "-std=c++14" for this code
    // See [opencv_src]\modules\java\generator\src\cpp\utils.cpp for details about PremultiplyAlpha
    // Use https://docs.opencv.org/java/2.4.2/org/opencv/android/Utils.html for Mat in Java

    cv::Mat temp = cv::Mat(cvSize(width, height), CV_8UC4, pPixelData); // 4 channels
    cv::Mat img;
    cv::cvtColor(temp, img, CV_BGRA2RGBA);

    // ... use Mat Image


    // back to Android Bitmap
    cvtColor(img, temp, CV_RGBA2BGRA); // Swap colors back
    memcpy(pPixelData, temp.data, static_cast<size_t>(width * height * 4));


    AndroidBitmap_unlockPixels(env, jBitmap);

    return EXIT_SUCCESS;
}

return EXIT_FAILURE;

}

关于android - 如何通过 android NDK (c++) 将图像放入 openCV 中的 MAT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47798642/

相关文章:

java - 安卓.view.InflateException : Binary XML file line #: Error inflating class

java - Android HandlerThread 在没有 UiHandler 的情况下更新 UI

c++ - 运算符 = 不明确 (C++)

opencv - 如何验证网络摄像头校准的正确性?

android - 修复 Google API task-android-sample 的依赖性

android - 即使在 android 2.3 中也无法看到印度语言字符

c++ - 什么意思::在函数调用的前面

c++ - 在 C++ 中删除结构 vector 中的重复值

linux - 在centos 6.3中安装OPENCV 2.4.4

c++ - 如何在 OpenCV 中的图像上应用非二进制掩码?