从提取的前景中移除阴影 我是OpenCV+C++ ++ Visual Studio 2012的新手。现在我需要学习它们。 这是背景减法/前景提取的代码,我需要从前景中移除阴影,并将它们包含到背景模型中

从提取的前景中移除阴影 我是OpenCV+C++ ++ Visual Studio 2012的新手。现在我需要学习它们。 这是背景减法/前景提取的代码,我需要从前景中移除阴影,并将它们包含到背景模型中,opencv,foreground,background-subtraction,computer-vision,shadow-removal,Opencv,Foreground,Background Subtraction,Computer Vision,Shadow Removal,包括opencv2/opencv.hpp 包括iostream 包含向量 intmain(intargc,char*argv[]) { cv::垫架; cv::垫背; cv::Mat-fore; cv::视频捕获上限(0); cv::背景:MOG2 bg; bg.nmixtures=3; bg.bShadowDetection=true; bg.nShadowDetection=0;//已解决! bg.fTau=0.5;//已解决! 矢量轮廓; cv::namedWindow(“框架”); 简历

包括opencv2/opencv.hpp 包括iostream 包含向量

intmain(intargc,char*argv[])
{
cv::垫架;
cv::垫背;
cv::Mat-fore;
cv::视频捕获上限(0);
cv::背景:MOG2 bg;
bg.nmixtures=3;
bg.bShadowDetection=true;
bg.nShadowDetection=0;//已解决!
bg.fTau=0.5;//已解决!
矢量轮廓;
cv::namedWindow(“框架”);
简历::namedWindow(“背景”);
对于(;;)
{
cap>>框架;
bg.operator()(帧,前);
背景:getBackgroundImage(背面);
侵蚀(前,前,cv::Mat());
cv::扩张(前,前,cv::Mat());
cv::findContours(前轮廓、轮廓、后轮廓、外轮廓、链轮廓、无轮廓);
cv::drawContours(框架,轮廓,-1,cv::Scalar(0,0255),2);
cv::imshow(“帧”,帧);
cv::imshow(“背景”,背面);
如果(cv::waitKey(30)>=0)中断;
}
返回0;
}

我更改了bshadowdetection=true或false,但什么也没发生。那我该怎么办? 谢谢。:)

注:对不起,我的英语不好D

================

决心

如果要从前景中删除阴影,只需在bg.bShadowDetection=True之后添加以下代码:

bg.nShadowDetection=0和bg.fTau=0.5,请参见上面的代码!:D

如果仍检测到阴影,则可以调整该值

bg.fTau=0.5意味着,如果像素的颜色比阴影深2倍以上,那么它就不是阴影

bg.nShadowDetection默认值为127。如果要移除阴影,只需将前景最小阈值设置为127。或者你也可以像我一样将bg.nShadowDetection设置为0


干杯D

您是否尝试过opencv中提供的所有不同背景减法?首先,如果它们都不能解决您的阴影问题,您可能需要编写自己的或使用其他库。然而,如果你对计算机视觉和C++是新的,这将是一个挑战。p> 不管怎样,我的建议是看色调(没有强度的颜色),而不是直接看颜色值。阴影通常不改变色调,只改变强度,因此这是一种将两者分开的方法。色调很容易计算

您可以尝试在opencv中通过将彩色图像转换为HSL颜色空间来实现这一点。然后提取H通道(H代表色调,S代表饱和度,L代表亮度)作为灰度图像,并将其输入背景减法器

解决了

如果要从前景中删除阴影,只需在bg.bShadowDetection=True之后添加以下代码:

bg.nShadowDetection=0和bg.fTau=0.5,请参见问题中的上述代码!:D

如果仍检测到阴影,则可以调整该值

bg.fTau=0.5意味着,如果像素的颜色比阴影深2倍以上,那么它就不是阴影

bg.nShadowDetection默认值为127。如果要移除阴影,只需将前景最小阈值设置为127。或者你也可以像我一样将bg.nShadowDetection设置为0


干杯D

我尝试了一些背景减法,但它们都没有在背景模型中包含阴影。也许因为背景减法需要背景的最佳效果,我指的是没有前景元素的纯背景。我想我需要一个单独的阴影检测代码。哈哈,顺便说一句,好主意!我试试你的建议。谢谢!:) include opencv2/opencv.hpp include iostream include vector

int main(int argc, char *argv[])
{
    cv::Mat frame;
    cv::Mat back;
    cv::Mat fore;
    cv::VideoCapture cap(0);

    cv::BackgroundSubtractorMOG2 bg;
    bg.nmixtures = 3;
    bg.bShadowDetection = true;
    bg.nShadowDetection = 0; //resolved!
    bg.fTau = 0.5;           //resolved!


    std::vector<std::vector<cv::Point> > contours;

    cv::namedWindow("Frame");
    cv::namedWindow("Background");

    for(;;)
    {
        cap >> frame;
        bg.operator ()(frame,fore);
        bg.getBackgroundImage(back);

        cv::erode(fore,fore,cv::Mat());
        cv::dilate(fore,fore,cv::Mat());

        cv::findContours(fore,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);
        cv::drawContours(frame,contours,-1,cv::Scalar(0,0,255),2);

        cv::imshow("Frame",frame);
        cv::imshow("Background",back);
        if(cv::waitKey(30) >= 0) break;
    }
    return 0;
}