【问题标题】:OpenCV 2.4 Bilateral filteringOpenCV 2.4 双边过滤
【发布时间】:2017-05-15 19:19:36
【问题描述】:

在 OpenCV android 中,是否可以应用双边过滤?我知道我可以像Imgproc.GaussianBlur(gray, gray, new Size(15,15), 0); 那样做高斯模糊,但我似乎找不到双边过滤的代码。

【问题讨论】:

    标签: java android opencv image-processing filtering


    【解决方案1】:

    似乎有可能:

    Imgproc.bilateralFilter(mat, dstMat, 10, 50, 0);
    

    来自herehere

    更新

    这个:

    E/AndroidRuntime: FATAL EXCEPTION: Thread-1376 Process: PID: 30368 CvException [org.opencv.core.CvException: cv::Exception: /Volumes/build-storage/build/2_4_pack-android/opencv/modules‌​/imgproc/src/smooth.‌​cpp:1925: error: (-215) (src.type() == CV_8UC1 || src.type() == CV_8UC3) && src.type() == dst.type() && src.size() == dst.size() && src.data != dst.data in function void cv::bilateralFilter_8u(const cv::Mat&, cv::Mat&, int, double, double, int)
    

    是因为处理Mat的颜色格式错误。您应该将 4 通道 RGBA 格式转换为 3 通道 RGB 以供 bilateralFilter() 应用(如在 bilateralFilterTutorial() 方法 here 中)。所以,你的代码应该是这样的:

    // load Mat from somewhere (e.g. from assets)
    mSourceImageMat = Utils.loadResource(this, R.drawable.<your_image>);
    // convert 4 channel Mat to 3 channel Mat
    Imgproc.cvtColor(mSourceImageMat, mSourceImageMat, Imgproc.COLOR_BGRA2BGR);
    
    // create dest Mat
    Mat dstMat = mSourceImageMat.clone();
    
    // apply bilateral filter
    Imgproc.bilateralFilter(mSourceImageMat, dstMat, 10, 250, 50);
    
    // convert to 4 channels Mat back
    Imgproc.cvtColor(dstMat, dstMat, Imgproc.COLOR_RGB2RGBA);
    
    // create result bitmap and convert Mat to it
    Bitmap bm = Bitmap.createBitmap(mSourceImageMat.cols(), mSourceImageMat.rows(), Bitmap.Config.ARGB_8888);
    Utils.matToBitmap(dstMat, bm);
    
    // show bitmap on ImageView
    mImageView.setImageBitmap(bm);
    

    【讨论】:

    • E/AndroidRuntime: 致命异常: Thread-1376 进程: PID: 30368 CvException [org.opencv.core.CvException: cv::Exception: /Volumes/build-storage/build/2_4_pack-android /opencv/modules/imgproc/src/smooth.cpp:1925: 错误: (-215) (src.type() == CV_8UC1 || src.type() == CV_8UC3) && src.type() == dst .type() && src.size() == dst.size() && src.data != dst.data in function void cv::bilateralFilter_8u(const cv::Mat&, cv::Mat&, int, double, double , int)
    • 太棒了。我的错误是我使用的是同一张垫子,所以检查 src.data != dst.data 失败了。双边过滤器需要创建一个新的垫子
    • @AndriiOmelchenko 感谢您的回答。不过我有一个问题 - 为什么你首先使用 BGRA2BGR 进行通道转换,然后使用 RGB2RGBA(我希望你第二次使用 BGR2BGRA)。我对opencv还不是很熟悉,所以我想了解一下。再次感谢。
    • @noamgot 嗯,看来是我的错。 Imgproc.bilateralFilter() 的 3 个频道 Mat 很重要,但频道顺序并不重要(实际上,它只是数字矩阵)。可能和BGRA2BGR-&gt;BGR2BGRA一起你会得到更好的结果。
    【解决方案2】:

    问题可能是,您使用的是 PNG 图像,该图像具有第四个透明度通道。使用前将其从 4 通道转换为 3 通道。

    Imgproc.cvtColor(src,dst,Imgproc.COLOR_BGRA2BGR);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-07
      • 2020-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-21
      • 2022-06-15
      相关资源
      最近更新 更多