[英]How to put an image into a MAT in openCV, through the android NDK (c++)
我通过Android NDK (using c++)
使用OpenCv
Android NDK (using c++)
我想将图像保存为MAT格式,然后将其显示在我的Android应用程序上。
我已将图像保存在资产中。 imread()
在NKD中不起作用,因为它无法找到图像的文件路径,但是,我可以使用AssetManager加载资源并完美地找到路径。 此方法将数据保存到char *缓冲区中。
我怎样才能使用类似于imread()
东西将图像保存到MAT中,或者将char *缓冲区数据转换为MAT以便在屏幕上显示它,然后再使用其他openCV
函数进行操作?
使用代码段
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.