请查看OpenCV中的
inRange函数。这将允许您同时为3通道图像设置多个阈值。
因此,要创建您正在寻找的掩模,请执行以下操作:
inRange(diff, Scalar(30, 30, 30), Scalar(255, 255, 255), mask);
这样做比尝试自己访问每个像素要快。
编辑:如果您正在尝试进行皮肤检测,我建议先进行皮肤检测,然后再进行背景减除以去除背景。否则,您的皮肤检测器将不得不考虑由减法引起的强度变化。
查看我的其他答案,了解有关皮肤检测的良好技术。
编辑:
这样做会更快吗?
int main(int argc, char* argv[])
{
Mat fg = imread("fg.jpg");
Mat bg = imread("bg.jpg");
cvtColor(fg, fg, CV_RGB2YCrCb);
cvtColor(bg, bg, CV_RGB2YCrCb);
Mat distance = Mat::zeros(fg.size(), CV_32F);
vector<Mat> fgChannels;
split(fg, fgChannels);
vector<Mat> bgChannels;
split(bg, bgChannels);
for(size_t i = 0; i < fgChannels.size(); i++)
{
Mat temp = abs(fgChannels[i] - bgChannels[i]);
temp.convertTo(temp, CV_32F);
distance = distance + temp;
}
Mat mask;
threshold(distance, mask, 35, 255, THRESH_BINARY);
Mat kernel5x5 = getStructuringElement(MORPH_RECT, Size(5, 5));
morphologyEx(mask, mask, MORPH_OPEN, kernel5x5);
imshow("fg", fg);
imshow("bg", bg);
imshow("mask", mask);
waitKey();
return 0;
}
这段代码根据您输入的图像生成此掩膜:
最后,使用我的简单阈值方法得到的结果如下:
Mat diff = fgYcc - bgYcc;
vector<Mat> diffChannels;
split(diff, diffChannels);
// only operating on luminance for background subtraction...
threshold(diffChannels[0], bgfgMask, 1, 255.0, THRESH_BINARY_INV);
Mat kernel5x5 = getStructuringElement(MORPH_RECT, Size(5, 5));
morphologyEx(bgfgMask, bgfgMask, MORPH_OPEN, kernel5x5);
这将产生以下掩码: