【问题标题】:OpenCV nMatToBitmap Assertion FailedOpenCV nMatToBitmap 断言失败
【发布时间】:2012-11-26 04:46:38
【问题描述】:

我在使用 OpenCV for Android 中的一些通用函数时遇到以下错误

12-05 21:08:55.486: E/cv::error()(6658): OpenCV Error: Assertion failed (src.dims == 2 && info.height == (uint32_t)src.rows && info.width == (uint32_t)src.cols) in void Java_org_opencv_android_Utils_nMatToBitmap2(JNIEnv*, jclass, jlong, jobject, jboolean), file /home/oleg/sources/opencv/modules/java/generator/src/cpp/utils.cpp, line 107
12-05 21:08:55.486: E/org.opencv.android.Utils(6658): nMatToBitmap catched cv::Exception: /home/oleg/sources/opencv/modules/java/generator/src/cpp/utils.cpp:107: error: (-215) src.dims == 2 && info.height == (uint32_t)src.rows && info.width == (uint32_t)src.cols in function void Java_org_opencv_android_Utils_nMatToBitmap2(JNIEnv*, jclass, jlong, jobject, jboolean)
12-05 21:08:55.486: E/CameraBridge(6658): Mat type: Mat [ 144*192*CV_8UC3, isCont=true, isSubmat=false, nativeObj=0x1024c0, dataAddr=0x44783010 ]
12-05 21:08:55.486: E/CameraBridge(6658): Bitmap type: 384*288
12-05 21:08:55.486: E/CameraBridge(6658): Utils.matToBitmap() throws an exception: /home/oleg/sources/opencv/modules/java/generator/src/cpp/utils.cpp:107: error: (-215) src.dims == 2 && info.height == (uint32_t)src.rows && info.width == (uint32_t)src.cols in function void Java_org_opencv_android_Utils_nMatToBitmap2(JNIEnv*, jclass, jlong, jobject, jboolean)

我不确定这是错误本身还是由其他问题引起的。

【问题讨论】:

    标签: android opencv android-ndk java-native-interface


    【解决方案1】:

    断言错误告诉您以下一项或多项测试失败:

    src.dims == 2
    info.height == (uint32_t)src.rows
    info.width == (uint32_t)src.cols
    

    我猜info 包含目标位图的尺寸。在这种情况下,您的源 Mat 不是二维或目标位图的尺寸与源 Mat 的尺寸不匹配。

    这两行

    12-05 21:08:55.486: E/CameraBridge(6658): Mat type: Mat [ 144*192*CV_8UC3, isCont=true, isSubmat=false, nativeObj=0x1024c0, dataAddr=0x44783010 ]
    12-05 21:08:55.486: E/CameraBridge(6658): Bitmap type: 384*288
    

    建议您的 Mat 是 144x192,而您的位图是 384x288。看起来一个是纵向的,另一个是横向的,加上您的位图是 Mat 分辨率的两倍。

    【讨论】:

    • 有人可以建议一种方法将 Mat 缩放为与位图相同的大小吗?我遇到了同样的问题,但我仍在学习 OpenCV,所以没有足够的技能......提前致谢!
    • 问题最好作为问题发布,而不是作为答案的 cmets。一定要包含一小段代码,显示您到目前为止已经尝试过的内容以及您想要完成的内容。
    • 你完全正确。我只是想,因为与这个问题密切相关,可以在这里发布。感谢您的快速回复。
    • 尝试改变:Size size = new Size(sourceBitmap.getWidth(), sourceBitmap.getHeight());
    • 在此错误中,Mat 尺寸报告为高度 * 宽度,而位图暗淡为宽度 * 高度。因此,在 OP 的情况下,方向都是相同的,只是分辨率不匹配。在我的错误中,我的 Mat 是 1024*768*CV_8UC4 vs. Bitmap 1024*768,这让我很困惑,直到我发现了不一致。
    【解决方案2】:

    我没有足够的代表发表评论,所以我将提供一个答案:

    使用 'onCameraFrame' 方法时 - 如果您返回的 'mat' 与用于显示输出的帧的大小不匹配,则会引发此断言。

    换句话说 - 如果您正在调整大小以进行某种处理,请确保在将其放回显示器之前将其恢复为原始大小。

    @Override
    public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame 
    inputFrame) {
        mRgba = inputFrame.rgba();
    
        Mat resizeImage = new Mat();
        Size sz = new Size(800, 600); // Scale up to 800x600
        Imgproc.resize(mRgba, resizeImage, sz);
    
        // Do some sort of processing here on resized image.
    
        Mat afterResize = new Mat();
        Size szAfter = new Size(640, 480); // Scale back down to 640x480 (original dim.)
        Imgproc.resize(resizeImage, afterResize, szAfter);
    
        return afterResize;
    }
    

    【讨论】:

    猜你喜欢
    • 2014-02-10
    • 2014-11-24
    • 2014-05-28
    • 2020-12-31
    • 2015-09-12
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    相关资源
    最近更新 更多