【问题标题】:OpenCV resize failingOpenCV调整大小失败
【发布时间】:2016-06-22 14:09:29
【问题描述】:

我有一个使用来自 OpenCV for android 的 A JavaCameraView 的应用程序,它使用以下回调

CameraBridgeViewBase.CvCameraViewListener cvListener = new CameraBridgeViewBase.CvCameraViewListener() {
    @Override
    public void onCameraViewStarted(int width, int height) {

    }

    @Override
    public void onCameraViewStopped() {

    }

    @Override
    public Mat onCameraFrame(Mat inputFrame) {
        Size newSize = new Size(400, 200);
        Mat fit = new Mat(newSize, CvType.CV_8UC4);
        Imgproc.resize(inputFrame,fit,newSize);
        return fit;
    }
};

但是,当调整大小发生时,会出现错误提示

E/CameraBridge: Utils.matToBitmap() throws an exception: /Volumes/Linux/builds/master_pack-android/opencv/modules/java/generator/src/cpp/utils.cpp:97: 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)
E/cv::error(): 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 /Volumes/Linux/builds/master_pack-android/opencv/modules/java/generator/src/cpp/utils.cpp, line 97
E/org.opencv.android.Utils: nMatToBitmap catched cv::Exception: /Volumes/Linux/builds/master_pack-android/opencv/modules/java/generator/src/cpp/utils.cpp:97: 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)
E/CameraBridge: Mat type: Mat [ 244*432*CV_8UC4, isCont=true, isSubmat=false, nativeObj=0x1ade1b0, dataAddr=0x5dbc6010 ]
E/CameraBridge: Bitmap type: 240*160

在实际的 UI 中什么都没有发生。我不确定为什么会看到这个错误,因为我从来没有打电话给Utils.bitmapToMatUtils.matToBitmap。当我取出Imgproc.resize(inputFrame,fit,newSize); 并返回inputFrame 时,一切正常。

【问题讨论】:

    标签: android opencv


    【解决方案1】:

    对于onCameraFrame,我相信您必须退回与您的inputFrame 相同大小的Mat。由于从您的相机获得的图像的分辨率是 240*160(参考这个-> E/CameraBridge: Bitmap type: 240*160)你需要在完成处理后将你的 Mat fit 调整回 240*160..

    一个简单的修复:

    @Override
    public Mat onCameraFrame(Mat inputFrame) {
        Size newSize = new Size(400, 200);
        Mat fit = new Mat(newSize, CvType.CV_8UC4);
        Imgproc.resize(inputFrame,fit,newSize);
    
        /**Your processing code */
    
        Imgproc.resize(fit,fit,inputFrame.size()); <- Add this line
    
        return fit;
    }
    

    要更改您从相机接收到的图像大小,您必须致电mOpenCvCameraView.setMaxFrameSize(width, height);,但分辨率将从相机硬件支持的分辨率列表中选择。要了解更多为什么您不能为您需要在 Android Camera API 上读取的分辨率设置任意值,因为这是 OpenCV 用来抓取背面图像的原因 :)

    【讨论】:

      猜你喜欢
      • 2014-03-02
      • 1970-01-01
      • 2017-11-22
      • 2017-02-04
      • 2014-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-16
      相关资源
      最近更新 更多