pie*_*tro 8 opencv background-subtraction
我有一个背景场景的图像和前面有物体的同一场景的图像.现在我想用背景减法创建前景中对象的蒙版.两个图像都是RGB.
我已经创建了以下代码:
cv::Mat diff;
diff.create(orgImage.dims, orgImage.size, CV_8UC3);
diff = abs(orgImage-refImage);
cv::Mat mask(diff.rows, diff.cols, CV_8U, cv::Scalar(0,0,0));
//mask = (diff > 10);
for (int j=0; j<diff.rows; j++) {
// get the address of row j
//uchar* dataIn= diff.ptr<uchar>(j);
//uchar* dataOut= mask.ptr<uchar>(j);
for (int i=0; i<diff.cols; i++) {
if(diff.at<cv::Vec3b>(j,i)[0] > 30 || diff.at<cv::Vec3b>(j,i)[1] > 30 || diff.at<cv::Vec3b>(j,i)[2] > 30)
mask.at<uchar>(j,i) = 255;
}
}
Run Code Online (Sandbox Code Playgroud)
我不知道我这样做是否正确?
看看OpenCV 的inRange函数.这将允许您为3通道图像同时设置多个阈值.
因此,要创建您正在寻找的面具,请执行以下操作:
inRange(diff, Scalar(30, 30, 30), Scalar(255, 255, 255), mask);
Run Code Online (Sandbox Code Playgroud)
这也应该比尝试自己访问每个像素更快.
编辑:如果皮肤检测是你想要做的,我会先做皮肤检测,然后做背景扣除删除背景.否则,您的皮肤探测器将不得不考虑减法引起的强度偏移.
看看我的其他答案,关于皮肤检测的好技术.
编辑:
这更快吗?
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;
}
Run Code Online (Sandbox Code Playgroud)
此代码根据您的输入图像生成此蒙版:

最后,这是我使用简单的阈值方法得到的:
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);
Run Code Online (Sandbox Code Playgroud)
这产生以下面具:

| 归档时间: |
|
| 查看次数: |
10468 次 |
| 最近记录: |