如何使用OpenCv模糊矩形

时间:2014-11-08 21:41:44

标签: java android opencv image-processing

有没有办法在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&)

这意味着锚点超出范围,但我查了the (0,0) point for open CV is the upper left point所以我认为它不应该超出范围。

同样理想情况下,我想在区域中进行高斯模糊(而不仅仅是模糊),但我无法弄清楚如何将其绑定在矩形中:它总是模糊整个图像。

Link to ImgProc docs。非常感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

好的,我想出了怎么做:

Mat mask = blurred.submat(rect);
Imgproc.GaussianBlur(mask, mask, new Size(55, 55), 55); // or any other processing

然后模糊将有模糊的区域。这是因为submat不会模糊地复制数据,而是引用它,所以当应用模糊时,它只会模糊掩模引用的模糊部分。

答案 1 :(得分:0)

我不是专家,但我认为你应用的是k大小的滤波器,实际上是k x k像素,k k(3x3,5x5等)。当你试图将自己定位在(0,0)过滤器的范围之外时,因为过滤器将它的中心映射到(0,0)像素中。例如,如果k为3,则需要从(2,2)开始。如果你想要一个高斯二维滤波器,记得在x方向上应用一次,在y方向上应用一次,而在(x.y)中应用一次。这是出于性能原因。