填充蒙版轮廓与Rect

时间:2017-01-31 04:27:50

标签: c++ opencv

我有一个Mat图像,它是我分割的二进制掩码和一个标识特定区域的cv :: Rect。当我得到二进制掩码的轮廓时,图像是这样的:

Binary Mask

Contours generated

我想在面具中填充与矩形相交的区域。我该怎么做?

提前致谢。

2 个答案:

答案 0 :(得分:1)

比@ ZdaR的解决方案更简单:使用感兴趣区域(ROI)直接选择要处理的边界矩形区域。

cv::Rect boundingRect(/* x, y, width, height */);
contours_image(boundingRect).setTo(255, binary_image(boundingRect));

在这里,我使用运算符括号contours_image(boundingRect)binary_image(boundingRect)选择每个区域,并使用二进制图像部分作为掩码将所有对应像素设置为255.

enter image description here

答案 1 :(得分:0)

一个很好的选择是将cv::min()与二进制图像一起使用,将另一个cv :: Mat()与cv::Rect()下的区域绘制为白色。它将过滤掉Rect下的所需部分:

// Create a grayscale canvas with black background
cv::Mat canvas = cv::Mat(binary_img.size(), CV_8UC1, cv::Scalar(0));

// I created a dummy rect replace it with original rect coordinates.
cv::Rect boundingRect = cv::Rect(100, 100, 200, 200);

// Draw filled rect onto the black canvas with white color
cv::rectangle(binary_image, boundingRect, cv::Scalar(255), -1);

// Take the min of binary image and canvas to filter out the contours
cv::min(binary_image, canvas, binary_image);

编辑:

如果要过滤与cv::Rect相交的轮廓,则需要迭代每个轮廓,计算boundingRect并检查它是否与给定的矩形相交。

for (int i=0; i<contours.size(); i++) {
    if ((cv::boundingRect(contours[i]) & boundingRect).area() > 0) {
        // Your desired contours found.
    }
}