gpt4 book ai didi

object - 如何使用 OpenCV BackgroundSubtractorMOG2 获取移动物体的掩码

转载 作者:太空宇宙 更新时间:2023-11-03 21:01:55 25 4
gpt4 key购买 nike

我想屏蔽视频中的移动物体。 我发现 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;
}

输出视频的快照是: enter image description here

附注我的工作环境是 OSX 10.8 上的 OpenCV2.4.3 和带有苹果 LLVM 编译器 4.1 的 XCode 4.5.2。

最佳答案

如果你想获取前景中充满白色像素的整个对象,那么我想请你告诉我一些你的经历。

我的问题是,对于您上面提到的代码,当您在相机前产生更多运动时,是否会获得更多白色像素?

如果是,那么有两个参数需要了解以满足您的要求。

首先是历史参数。您在构造函数 BackgroundSubtractorMOG2(30,16.0,false); 中配置为 30。您可以通过增加来测试此参数,比如增加到 300。它将保持前景中对象的运动历史。因此,如果您在 300 帧内从起始位置完全移动,那么您将根据需要使整个对象覆盖有白色像素。但它会逐渐被抹去。所以它不能给你 100% 的解决方案。

第二个参数称为学习率。在您提到的代码中 bg(frame,fmask,-1); 其中 -1 是您的学习率。您可以将其设置为 0.0 到 1.0,默认值为 -1。当您将其设置为 0 时,您将获得视频开头不属于帧的对象的所需内容。您可以将这种对象称为“外来对象”。你会得到覆盖着白色像素的异物。

从我上面提到的信息中探索你的测试并分享你的经验。

关于object - 如何使用 OpenCV BackgroundSubtractorMOG2 获取移动物体的掩码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13600021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com