将Mat转换为Android位图时出现Android OpenCV错误

时间:2015-03-05 02:26:50

标签: android opencv java-native-interface opencv4android

我正在编写一个将视频从网络摄像头流式传输到Android设备的应用程序。流式客户端使用C ++编写,并使用imencode压缩图像,以便可以通过UDP发送。我有一个模拟"接收器",也在C ++中,可以接收图像并显示它们。我将接收器移植到Android,并且只使用opencv java sdk(我不是在编写自己的JNI东西)。将接收到的字节数组转换为Mat然后是位图的代码如下 -

Mat frame = Highgui.imdecode(new MatOfByte(packet.getData()), 0);
bm = Bitmap.createBitmap(frame.cols(), frame.rows(),Bitmap.Config.ARGB_8888);
Utils.matToBitmap(frame, bm);
im.post(new Runnable() {
    @Override
    public void run() {
        im.setImageBitmap(bm);
    }
});

Util.matToBitmap的调用会出现以下错误 -

OpenCV Error: Assertion failed (AndroidBitmap_lockPixels(env, bitmap, &pixels) >= 0) in void Java_org_opencv_android_Utils_nMatToBitmap2(JNIEnv*, jclass, jlong, jobject, jboolean), file /hdd2/buildbot/slaves/slave_ardbeg1/50-SDK/opencv/modules/java/generator/src/cpp/utils.cpp, line 99 03-04 19:04:46.337  15034-15148/ E/org.opencv.android.Utils﹕ nMatToBitmap catched cv::Exception: /hdd2/buildbot/slaves/slave_ardbeg1/50-SDK/opencv/modules/java/generator/src/cpp/utils.cpp:99: error: (-215) AndroidBitmap_lockPixels(env, bitmap, &pixels) >= 0 in function void Java_org_opencv_android_Utils_nMatToBitmap2(JNIEnv*, jclass, jlong, jobject, jboolean) 03-04 19:04:46.452  15034-15148/E/AndroidRuntime﹕ FATAL EXCEPTION: Thread-924

这只是对使用TCP的以前工作代码的略微修改,我无法找到此错误实际意味着什么。任何人都知道发生了什么?或者有关如何调试我没有编写的JNI代码的任何建议?

1 个答案:

答案 0 :(得分:-1)

我不太确定,我现在无法测试,但我想你的Matrix和Bitmap需要具有相同的尺寸。您可能需要先创建一个带有位图尺寸的空白矩阵,然后用您收到的数据填充它。

或者至少调试应用以检查它们是否具有相同的尺寸。

编辑:所以,我已经检查了我之前的一个项目,在这里我是如何创建Bitmap的,请查看下面的代码。不同之处在于Mat对象的方法。我使用mat.getWidth()代替mat.cols()这可能是该异常的原因。试一试。

Bitmap frame = Bitmap.createBitmap(mat.width(), mat.height(), Config.ARGB_8888);