如何使用OpenCv模糊一个rectagle

如何使用OpenCv模糊一个rectagle

问题描述:

有没有什么办法可以模糊OpenCv中的Mat对象(对于Android),以便模糊包含在Rect对象中?我做一个脸部模糊处理的应用程序,并尝试这样的:如何使用OpenCv模糊一个rectagle

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一部分,那么它周围绘制面对rectagle正常工作。然而,当我用这条线运行它,我获取日志中的下列情况:

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。任何帮助是极大的赞赏!

+1

您是否尝试过调用函数而未设置锚点?默认情况下,它把它放在内核中心,这可能更适合你的情况。 – VAndrei 2014-11-08 21:50:44

好吧,我想通了,如何做到这一点:

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

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

我不是专家,但我认为你正在应用一个k大小的滤镜,所以实际上k×k像素与k奇(3x3,5x5等)。当您尝试将自己置于(0,0)中时,过滤器的边界会超出范围,因为过滤器会将其置于(0,0)像素的中心。如果你的k是3,例如你需要从(2,2)开始。如果你想要一个高斯二维滤波器记住在x方向上应用一次而在y方向上应用一次而不是在(x.y)中应用一次。这是出于性能原因。