Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCV:如何使用createBackgroundSubtractorMOG_Opencv_Background Subtraction_Mog - Fatal编程技术网

OpenCV:如何使用createBackgroundSubtractorMOG

OpenCV:如何使用createBackgroundSubtractorMOG,opencv,background-subtraction,mog,Opencv,Background Subtraction,Mog,我试图通过这个教程påOpenCV.org: MOG指针初始化为 Ptr<BackgroundSubtractor> pMOG; //MOG Background subtractor 但是,这会产生以下错误: Error: Identifier "createBackgroundSubtractorMOG" is undefined Error: class "cv::BackgroundSubtractor" has no member "apply" 此

我试图通过这个教程påOpenCV.org:

MOG指针初始化为

Ptr<BackgroundSubtractor> pMOG; //MOG Background subtractor
但是,这会产生以下错误:

    Error: Identifier "createBackgroundSubtractorMOG" is undefined
    Error: class "cv::BackgroundSubtractor" has no member "apply"
此外,要更新背景模型时,将使用以下命令:

pMOG->apply(frame, fgMaskMOG);
这反过来会产生以下错误:

    Error: Identifier "createBackgroundSubtractorMOG" is undefined
    Error: class "cv::BackgroundSubtractor" has no member "apply"
你知道该怎么办吗? 非常感谢

以下是完整的教程代码:

//opencv
#包括
#包括
//C
#包括
//C++
#包括
#包括
使用名称空间cv;
使用名称空间std;
//全局变量
垫架//当前帧
Mat fgMaskMOG//用MOG方法生成fg掩模
Mat fgMaskMOG2//fg掩模由MOG2方法生成的fg掩模
Ptr-pMOG//背景减法器
Ptr-pMOG2//MOG2背景减法器
int键盘;
//函数声明
无效帮助();
void processVideo(char*videoFilename);
void processImages(char*firstFrameFilename);
无效帮助()
{
库特

我今天碰巧遇到了这个问题。本教程针对的是opencv 3.0,而不是opencv 2.4+,请进行以下更改:

//opencv
#包括
#包括
#包括
//C
#包括
//C++
#包括
#包括
使用名称空间cv;
使用名称空间std;
//全局变量
Mat frame;//当前帧
Mat fgMaskMOG;//由MOG方法生成的fg掩码
Mat fgMaskMOG2;//fg mask由MOG2方法生成的fg mask fg mask
Ptr pMOG;//MOG背景减法器
Ptr pMOG2;//MOG2背景减法器
int键盘;
//函数声明
无效帮助();
void processVideo(char*videoFilename);
void processImages(char*firstFrameFilename);
无效帮助()
{
库特

根据前面的回答,背景减法器也可定义为:

BackgroundSubtractorMOG MOG;
而不是:

Ptr<BackgroundSubtractor> pMOG;
pMOG= new BackgroundSubtractorMOG(); //MOG approach
代替:

pMOG->operator()(frame, fgMaskMOG);
openCV的默认假设是背景非常恒定,不需要任何更新,因此,在学习初始阶段后,高斯混合不再改变。这里还可以找到详细而清晰的描述:

我也有同样的问题: 错误:标识符“createBackgroundSubtractorMOG”未定义,这是因为在我的算法中缺少指向opencv库libopencv_video.so的链接

我通过包含libopencv_video.so解决了这个问题,在项目链接过程中,可以在您的Makefile中这样做:
-L/usr/local/lib/libopencv\u video.so

它解决了错误,我可以使用原始教程,如下所示:

如果您希望MOG方法起作用,您应该

#include "opencv2/bgsegm.hpp"
然后

pMOG = bgsegm::createBackgroundSubtractorMOG();

虽然它不太好用,至少不适合在网络摄像机前跟踪一个人,但在街上或类似的地方跟踪人可能会更好。它似乎永远不会忘记第一帧。无论我使用什么参数值,第一帧就像一个恒定的遮罩。我假设我在没有任何其他更改的情况下se VideoCapture(0);而不是VideoCapture(videoFilename);好的,我知道了!只是更改了学习速率:
pMOG->operator()(frame,fgMaskMOG,0.1)
我真的不明白为什么0.0会是默认值,但不管怎样,我现在很高兴:)你好。我该如何运行这个程序?我的意思是如何输入像
-Video\u 001.avi这样的命令。谢谢你可以在main中解析argv(int-argc,char**argv)如您所愿;如果您使用的是linux,函数getopt_long可能会很有帮助。我在中找到了一个关于背景提取的教程。您认为他使用MOG方法吗。如我所见,他捕获第一帧并用作背景,然后与其他帧进行比较,使用阈值来获取对象。有人使用过这种方法吗?谢谢您的澄清。officia唯一推荐的方法是使用
makePtr
Algorithm::create
,而不是
new
。有趣的是,刚刚建议了正确的答案(链接到所需的视频模块)。+1但请注意,当前教程中的函数(从3.1开始)是
createBackgroundSubtractorMOG2
,它附带在opencv2/video/background_segm.hpp中声明,这将使您非常清楚应该链接哪个模块。:)