我想屏蔽视频中的移动物体。 我发现OpenCV有一些内置的BackgroundSubtractors可以节省我的时间。但是,根据official reference,函数:
void BackgroundSubtractorMOG2::operator()(InputArray image, OutputArray fgmask, double learningRate=-1)
应该输出一个掩码,fgmask,但它没有。在调用上述方法之后,fgmask变量将包含“掩码的轮廓”。那真是怪了。我想要的只是一个填充白色的简单封闭区域(例如)来表示移动的物体。我怎么能这样做?
任何回复或推荐都会非常感激。非常感谢。
这是我的代码:
int main(int argc, char *argv[])
{
cv::BackgroundSubtractorMOG2 bg = BackgroundSubtractorMOG2(30,16.0,false);
cv::VideoCapture cap(0);
cv::Mat frame, mask, _frame, _fmask;
cvNamedWindow("mask", CV_WINDOW_AUTOSIZE);
for(;;)
{
cap >> frame;
bg(frame,fmask,-1);
_frame = IplImage(frame);
_fmask = IplImage(fmask);
cvShowImage("mask", &_fmask);
if(cv::waitKey(30) >= 0) break;
}
return 0;
}
输出视频的快照是:
P.S。我的工作环境是OSX 10.8上的OpenCV2.4.3和带有Apple LLVM编译器4.1的XCode 4.5.2。
答案 0 :(得分:8)
如果你想获得前景中充满白色像素的整个物体,那么我会请你告诉我一些你的经历。
我的问题是,对于上面提到的代码,当您在相机前产生更多动作时,是否会获得更多白色像素?
如果是,则有两个参数可供您了解。
首先是History参数。您已在构造函数 BackgroundSubtractorMOG2(30,16.0,false); 中配置为30。您可以通过incresing测试此参数,比如说300.它将保持对象在前景中的运动历史。因此,如果您已经完全从300帧内的起始位置移动,那么您可以根据需要获得覆盖有白色像素的整个对象。但它会逐渐被抹去。所以它不能给你100%的解决方案。
第二个参数称为学习率。在您提到的代码中 bg(frame,fmask,-1); 其中-1是您的学习率。您可以将其设置为0.0到1.0,默认值为-1。当您将其设置为0时,您将获得所需的对象,这些对象不是视频开头的帧的一部分。你可以将这种对象称为“异物”。您将获得覆盖有白色像素的异物。
根据我上面提到的信息探索您的测试并分享您的经验。