2014-11-08 35 views
0

有沒有什麼辦法可以模糊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

回答

2

好吧,我想通了,如何做到這一點:

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

然後模糊將有清晰的區域。這是因爲submat不會模糊地複製數據,而是引用它,所以當應用模糊時,它只會模糊掩模引用的模糊部分。

0

我不是專家,但我認爲你正在應用一個k大小的濾鏡,所以實際上k×k像素與k奇(3x3,5x5等)。當您嘗試將自己置於(0,0)中時,過濾器的邊界會超出範圍,因爲過濾器會將其置於(0,0)像素的中心。如果你的k是3,例如你需要從(2,2)開始。如果你想要一個高斯二維濾波器記住在x方向上應用一次而在y方向上應用一次而不是在(x.y)中應用一次。這是出於性能原因。