有什么方法可以使OpenCv中的Mat对象模糊(适用于Android),从而使模糊包含在Rect对象中?我正在做一个人脸模糊的应用程序,并尝试了此操作:
Mat mat = ...; // is initialized properly to 480*640
...
Mat blurred = new Mat();
for (Rect rect : faceDetections.toArray()) {
int xStart = Math.max(0, rect.x);
int yStart = Math.max(0, rect.y);
Imgproc.blur(mat, blurred, new Size(rect.width/2, rect.height/2), new Point(xStart, yStart));
Core.rectangle(blurred, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height),
new Scalar(0, 255, 0));
}
如果我注释掉
Imgproc.blur
部分,则可以通过在面部周围绘制一个矩形来使其正常工作。但是,当我用这一行运行它时,我在日志中得到以下内容:11-07 17:27:54.100: E/AndroidRuntime(25665): Caused by: CvException [org.opencv.core.CvException: cv::Exception: /hdd2/buildbot/slaves/slave_ardbeg1/50-SDK/opencv/modules/imgproc/src/filter.cpp:182: error: (-215) 0 <= anchor.x && anchor.x < ksize.width && 0 <= anchor.y && anchor.y < ksize.height in function void cv::FilterEngine::init(const cv::Ptr<cv::BaseFilter>&, const cv::Ptr<cv::BaseRowFilter>&, const cv::Ptr<cv::BaseColumnFilter>&, int, int, int, int, int, const Scalar&)
这意味着 anchor 超出范围,但是我已经查看了the (0,0) point for open CV is the upper left point,因此我认为它不应超出范围。
同样,理想情况下,我想对该区域进行高斯模糊处理(而不只是模糊处理),但是我也不知道如何在矩形中进行绑定(bind):它总是使整个图像模糊。
Link to ImgProc docs。任何帮助是极大的赞赏!
最佳答案
好的,我想出了办法:
Mat mask = blurred.submat(rect);
Imgproc.GaussianBlur(mask, mask, new Size(55, 55), 55); // or any other processing
然后模糊将具有模糊区域。这是因为submat不会复制模糊的数据,而是引用它,因此,应用模糊处理时,它只会模糊蒙版所引用的模糊部分。