在OpenCV android中,是否可以应用双边过滤?我知道我可以像Imgproc.GaussianBlur(gray, gray, new Size(15,15), 0);
那样进行高斯模糊,但我似乎无法找到双边过滤的代码。
答案 0 :(得分:4)
似乎有可能:
Imgproc.bilateralFilter(mat, dstMat, 10, 50, 0);
<强>更新强>
此:
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);
答案 1 :(得分:0)
问题可能是您使用的PNG图像具有第4个透明通道。在使用前将其从4通道转换为3通道。
Imgproc.cvtColor(src,dst,Imgproc.COLOR_BGRA2BGR);