【问题标题】:How to put an image into a MAT in openCV, through the android NDK (c++)如何通过android NDK(c ++)将图像放入openCV中的MAT
【发布时间】:2018-05-27 16:11:22
【问题描述】:

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

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

我该如何使用类似于 imread() 的东西将图像保存到 MAT 中,或者将 char* 缓冲区数据转换为 MAT 以便将其显示在屏幕上,然后使用其他 openCV 函数进行操作?

【问题讨论】:

  • cv::imdecode 等效于 imread,当您已经在缓冲区中拥有数据时。
  • @Dan Mašek 我的代码格式为: char* buffer = (char*) malloc (sizeof(char)*sizeOfImg); AAsset_read(img, 缓冲区, sizeOfImg);所以生成的缓冲区是 char* 的形式。 imdecode() 需要 const_inputArray 格式的数据。
  • 将数据放入std::vector<char>并使用cv::imdecode
  • 甚至不必将数据复制到向量中:cv::_InputArray(buffer,buffer_size)

标签: android c++ opencv android-ndk


【解决方案1】:

使用代码sn-p

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;

}

【讨论】:

    猜你喜欢
    • 2019-02-08
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多