Als*_*ton 3 opencv background mask object foreground
我想屏蔽视频中的移动物体.我发现OpenCV有一些内置的BackgroundSubtractors可以节省我的时间.但是,根据官方参考,功能:
void BackgroundSubtractorMOG2::operator()(InputArray image, OutputArray fgmask, double learningRate=-1)
Run Code Online (Sandbox Code Playgroud)
应该输出一个掩码,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;
}
Run Code Online (Sandbox Code Playgroud)
输出视频的快照是:

ps我的工作环境是OSX 10.8上的OpenCV2.4.3和带有Apple LLVM编译器4.1的XCode 4.5.2.
如果你想获得前景中填充了白色像素的整个物体,那么我会请你告诉我一些你的经历.
我的问题是,对于上面提到的代码,当你在相机前产生更多动作时,你会得到更多的白色像素吗?
如果是,则有两个参数可供您了解.
首先是History参数.你在构造函数BackgroundSubtractorMOG2中配置为30 (30,16.0,false); .您可以通过incresing测试此参数,比如说300.它将保持对象在前景中的运动历史.因此,如果您已经完全从300帧内的起始位置移动,那么您可以根据需要获得覆盖有白色像素的整个对象.但它会逐渐被抹去.所以它不能给你100%的解决方案.
第二个参数称为学习率.在你提到的代码中bg(frame,fmask,-1); 其中-1是你的学习率.您可以将其设置为0.0到1.0,默认值为-1.当您将其设置为0时,您将获得所需的对象,这些对象不是视频开头的帧的一部分.你可以将这种对象称为"异物".您将获得覆盖有白色像素的异物.
从我上面提到的信息中探索您的测试并分享您的经验.