我正在编写一个将视频从网络摄像头流式传输到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代码的任何建议?
答案 0 :(得分:-1)
我不太确定,我现在无法测试,但我想你的Matrix和Bitmap需要具有相同的尺寸。您可能需要先创建一个带有位图尺寸的空白矩阵,然后用您收到的数据填充它。
或者至少调试应用以检查它们是否具有相同的尺寸。
编辑:所以,我已经检查了我之前的一个项目,在这里我是如何创建Bitmap的,请查看下面的代码。不同之处在于Mat对象的方法。我使用mat.getWidth()
代替mat.cols()
这可能是该异常的原因。试一试。
Bitmap frame = Bitmap.createBitmap(mat.width(), mat.height(), Config.ARGB_8888);