Android OpenCV中传出字节[]所需的cv::imencode?

Android OpenCV中传出字节[]所需的cv::imencode?,android,c++,opencv,java-native-interface,bitmapfactory,Android,C++,Opencv,Java Native Interface,Bitmapfactory,我一直在努力将JNI中的CV:Mat作为Java字节[]发回,以便使用BitmapFactory.decode()成功解码。当我第一次把我的Byth[]数组(从Android位图中构建的数据)从java端带来时,我就能够成功地在C++ OpenCV函数中使用它。我通过从传入的字节[]构建一个Mat并在Mat上调用cv::imdecode来实现这一点 当我返回Android并尝试使用BitmapFactory将字节数组解码为Android位图时,问题就出现了。它返回null,这表示解码中存在问题。

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

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

感谢您的帮助!下面是我从JNI中的Mat转换所需数据的代码示例

注意我知道使用Apache Android_位图函数,但使用字节数组是我目前正在研究的一项要求

    //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位图对象创建为可变对象,然后调用copyPixelsToBuffer和copyPixelsFromBuffer方法来获取和设置该对象中的像素数据。

!这是我最初使用Bitmap.compress()发送字节,然后使用copyPixelsFromBuffer发送返回的像素的组合。感谢巴迪为我指明了正确的方向

Android: 

//input was the original bitmap that was used to construct the byte[] array. I then used input.compress() in JPEG format to a Byte. Very important for it to be compressed in a format that will be recognized in cv::imdecode.

ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
                input.compress(CompressFormat.JPEG, 100, bos); 
                data1.pixelData = bos.toByteArray();
...

    //Reconstruction after JNI call
    ByteBuffer buffer2 = ByteBuffer.wrap(data1.pixelData);
    Bitmap returnFromConvert = Bitmap.createBitmap(input.getWidth(),     
    input.getHeight(),Bitmap.Config.ARGB_8888);
    returnFromConvert.copyPixelsFromBuffer(buffer2);

我会尽快尝试,然后再给你回复。谢谢你的建议,伙计!如果我让你的答案起作用,你会得到奖励的。好消息和坏消息,伙计。我成功地实现了copyPixelstoBuffer和copyPixelsFromBuffer,在这里我可以发送一个字节[],将其重建为Mat,然后将其发送回Android。问题是当我需要使用cv::imdecode在由字节[]构建的Mat上实际执行颜色空间操作时。详情如下: