[英]How to get moving object's mask using OpenCV BackgroundSubtractorMOG2
我想屏蔽视频中的移动物体。 我发现OpenCV有一些内置的BackgroundSubtractors可以节省我的时间。 但是,根据官方参考 ,功能:
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;
}
输出视频的快照是:
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时,您将获得所需的对象,这些对象不是视频开头的帧的一部分。 你可以将这种对象称为“异物”。 您将获得覆盖有白色像素的异物。
从我上面提到的信息中探索您的测试并分享您的经验。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.