如何屏蔽cv :: Mat中的所有通道?

时间:2016-04-30 01:33:59

标签: c++ opencv mask

我使用HOGDescriptor来检测图像中的行人。我的目的是掩盖人物矩形之外的所有像素。我首先创建一个全零的掩码图像,并且每个矩形都想在ROI上用0xFF覆盖所有三个通道。

结果最终只有一个通道被设置为掩码。我想要的是有一个带有白色矩形的黑色面具。我也检查了矩阵输出,可以看到只有一个组件是255而其他组件是0。

  

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0       0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 255 0 0 255       0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0       255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255       0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0

void ImageUtil::detectPersonRectangles(cv::Mat image)
{
    cv::HOGDescriptor HoG;
    HoG.setSVMDetector(cv::HOGDescriptor::getDefaultPeopleDetector());

    cv::Mat mask = cv::Mat::zeros(image.size(), image.type());
    std::vector<cv::Rect> found;
    HoG.detectMultiScale(image, found, 0, cv::Size(8,8), cv::Size(32,32), 1.05, 2);
    for (int i = 0; i < found.size(); i++) {
        cv::Rect r = found[i];
        std::cout << " HoG detected rectangle " << i << " : " << r << "\n";
        mask(r) |= 0xFF;
    }

    static int index = 0;
    cv::Mat maskedImage = image & mask;
    std::stringstream name;
    name << "masked_" << index++;
    ImageUtil::dumpDebugImage(mask, name.str());
}

enter image description here

1 个答案:

答案 0 :(得分:0)

我会回答我自己的问题,因为我一开始并不认为这是直接明显的。我们可以将单个矩阵写入ROI,用于ROI中的每个像素。

// Use 0xFF for all channels of the mask.
mask(r) |= cv::Mat(1, image.channels(), CV_8U, {0xFF});