C++ 使用背景减法去除阴影以检测静止对象

C++ 使用背景减法去除阴影以检测静止对象,c++,opencv,computer-vision,background-subtraction,C++,Opencv,Computer Vision,Background Subtraction,我必须使用Opencv V4.4.0检测预定义区域中的静止对象。我正在使用两个背景减法器,它们存储两个不同的背景遮罩,一个存储静止的初始背景遮罩,另一个检测运动对象作为更新的遮罩;我已经用MOG2背景减法器实现了它们,但是阴影移除系统似乎不能正常工作 两个背景减法器MOG2的安装: Ptr<BackgroundSubtractorMOG2> bgSubtractor; Ptr<BackgroundSubtractorMOG2> bgSubtractorMotion; b

我必须使用Opencv V4.4.0检测预定义区域中的静止对象。我正在使用两个背景减法器,它们存储两个不同的背景遮罩,一个存储静止的初始背景遮罩,另一个检测运动对象作为更新的遮罩;我已经用MOG2背景减法器实现了它们,但是阴影移除系统似乎不能正常工作

两个背景减法器MOG2的安装:

Ptr<BackgroundSubtractorMOG2> bgSubtractor;
Ptr<BackgroundSubtractorMOG2> bgSubtractorMotion;

bgSubtractor = createBackgroundSubtractorMOG2(500, 16.0);
bgSubtractor->setDetectShadows(false);
bgSubtractor->setShadowValue(0); 
//bgSubtractor->setShadowThreshold(50);
bgSubtractor->setVarThresholdGen(15);
bgSubtractor->setNMixtures(5);

bgSubtractorMotion = createBackgroundSubtractorMOG2(500, 16.0);
bgSubtractorMotion->setDetectShadows(false); 
bgSubtractorMotion->setShadowValue(0); 

//bgSubtractorMotion->setShadowThreshold(50);
bgSubtractorMotion->setVarThresholdGen(5);
bgSubtractorMotion->setNMixtures(5);
现在,我必须使用运动物体的遮罩来找到该区域内的静止物体,但是系统也会将阴影识别为静止物体,这种问题使得系统无法在白天正常工作,并且阳光充足,阴影清晰。我试图将背景检测器属性DetectShadows设置为false,但这似乎没有用。我还尝试从静止的背景和更新的背景对生成的遮罩设置阈值,但没有任何结果。 这个问题有一个可行的解决方案吗


提前感谢。

您可以创建自己的高斯(或其他类型)背景减法器,并尝试为shadowscheck将其剪切
// stationary initial background mask

bgSubtractor->apply(sourceFrame, backMaskFrame, 0.0);
blur(backMaskFrame, backMaskFrame, cv::Size(15, 15), cv::Point(-1, -1));
threshold(backMaskFrame, backMaskFrame, 254, 255, THRESH_BINARY);

// updated background mask

bgSubtractorMotion->apply(sourceFrame, backgroundSubtractionUpdatedFrame);

blur(backgroundSubtractionUpdatedFrame, backgroundSubtractionUpdatedFrame, cv::Size(15, 15), cv::Point(-1, -1));
threshold(backgroundSubtractionUpdatedFrame, backgroundSubtractionUpdatedFrame, 254, 255, THRESH_BINARY);