【发布时间】:2014-03-28 21:44:30
【问题描述】:
我一直在努力将 JNI 中的 CV:Mat 作为 Java byte[] 发送回,以便可以使用 BitmapFactory.decode() 成功解码。当我第一次从 Java 端引入我的 byte[] 数组(使用来自 Android 位图的数据构建)时,我能够在 C++ OpenCV 函数中成功使用它。我通过从传入的 byte[] 构建一个 Mat 并在 Mat 上调用 cv::imdecode 来做到这一点。
当我返回 Android 并尝试使用 BitmapFactory 将字节数组解码为 Android 位图时,问题就出现了。它返回 null 表示解码中存在问题。从 JNI 返回之前,我是否错误地执行了这些操作?由于必须在输入字节[]上使用 cv::imdecode,是否需要使用 cv::imencode?p>
任何和所有的帮助表示赞赏!下面的代码示例是我在 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);
【问题讨论】:
标签: android c++ opencv java-native-interface bitmapfactory