gpt4 book ai didi

android - Android OpenCV 中传出字节 [] 需要 cv::imencode 吗?

转载 作者:太空宇宙 更新时间:2023-11-03 22:58:58 26 4
gpt4 key购买 nike

我一直在努力将 JNI 中的 CV:Mat 作为 Java byte[] 发回,以便它可以使用 BitmapFactory.decode() 成功解码。当我第一次从 Java 端引入我的 byte[] 数组(使用来自 Android 位图的数据构建)时,我能够在 C++ OpenCV 函数中成功使用它。我通过从传入的 byte[] 构建一个 Mat 并在 Mat 上调用 cv::imdecode 来做到这一点。

当我返回到 Android 并尝试使用 BitmapFactory 将字节数组解码为 Android 位图时,问题就来了。它返回 null,表示解码出现问题。我在从 JNI 返回之前是否错误地执行了这些操作?我是否需要使用 cv::imencode 因为我必须在输入 byte[] 上使用 cv::imdecode?

感谢任何帮助!代码示例如下,我在 JNI 中从 Mat 转换我需要的数据。

注意我知道使用 Apache Android_Bitmap 函数,但使用字节数组是我目前正在处理的要求。

    //inData is a char* pointer that is set to a char* cast of the jbyte* pointer for the   
// incoming Array.

cv::Mat inMat = cv::Mat(rows, columns, CV_8UC4, inData);
cv::Mat decodedMat = cv::imdecode(inMat, 1);

//convertImage is a function that changes the color space from BGR to Gray and then Gray to
//RGB.

convertImage(decodedMat, decodedMat);

cv::cvtColor(decodedMat, decodedMat, CV_RGB2RGBA);
jbyteArray jDataArray = env->NewByteArray(pixelDataLength);
env->SetByteArrayRegion(jDataArray,0,pixelDataLength,(jbyte*)decodedMat.data);
env->SetObjectField(in,dataArray,jDataArray);
env->ReleaseByteArrayElements(pixelData, bytePointerForIn, 0);

最佳答案

BitmapFactory 期望提供给它的数据采用已知的文件格式,但您传递给它的是原始像素。您可以通过调用 cv::imencode 使其工作,但从原始像素数据加载图像的更自然的解决方案可能是将原始 Java Bitmap 对象创建为可变对象,然后调用 copyPixelsToBuffer 和 copyPixelsFromBuffer 方法来获取和设置该对象中的像素数据。

关于android - Android OpenCV 中传出字节 [] 需要 cv::imencode 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22723725/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com