使用OpenCV进行有效的背景减法

时间:2010-01-08 09:59:50

标签: opencv background-subtraction

我想使用OpenCV方法在视频文件中进行背景扣除。现在我可以做背景减法,但问题是我无法在彩色模式下获得输出。减去背景后的所有输出都是灰度颜色模式 :( 。我想获取前景的颜色信息,这是减去背景后的结果输出。

我可以使用遮蔽技术吗?就像我正在考虑的以下程序一样。

  1. 捕获输入 - InputFrame(RGB)
  2. 处理InputFrame
  3. 减去背景,将前景存储在TempFrame中(以灰度显示 :(
  4. 使用TempFrame
  5. 创建遮罩
  6. 将创建的面具应用于InputFrame
  7. 将彩色前景设为OutFrame
  8. 我对使用OpenCV进行屏蔽感到兴奋。我只是OpenCV的初学者。请帮助我克服这一点。

    提前致谢。

2 个答案:

答案 0 :(得分:21)

http://vimeo.com/27477093

代码在这里

http://code.google.com/p/derin-deli-mavi/downloads/detail?name=denemeOpenCv23.zip&can=2&q=

到达彩色前景 只需使用前景蒙版复制图像

// image.copyTo(前景,前景);

答案 1 :(得分:11)

好吧,如果你使用背景减法,我不明白TempFrame(你的前景)是如何灰度的。您必须使用非常特殊的算法。但假设TempFrame是灰度,那么你会这样做:

cv::Mat mask = tempFrame > 0.5;

cv::Mat outFrame;
capturedFrame.copyTo(outFrame, mask);

这是上面的OpenCV 2.0代码。数字0.5是一个阈值,您需要将其设置为适当的值。如果你没有使用浮点图像,你可能会将它设置为128或类似的东西。这与OpenCV 1.1代码中的内容相同:

CvMat* mask = cvCreateMat(tempFrame.rows, tempFrame.cols, CV_8UC1);
cvCmpS(tempFrame, 0.5, mask);

CvMat* outFrame = cvCreateMat(capturedFrame.rows, capturedFrames.cols, CV_32FC3);
cvCopy(capturedFrame, outFrame, mask);