我有一个Mat图像,它是我分割的二进制掩码和一个标识特定区域的cv :: Rect。当我得到二进制掩码的轮廓时,图像是这样的:
我想在面具中填充与矩形相交的区域。我该怎么做?
提前致谢。
答案 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.
答案 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.
}
}