我使用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());
}
答案 0 :(得分:0)
我会回答我自己的问题,因为我一开始并不认为这是直接明显的。我们可以将单个矩阵写入ROI,用于ROI中的每个像素。
// Use 0xFF for all channels of the mask.
mask(r) |= cv::Mat(1, image.channels(), CV_8U, {0xFF});