Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.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
C++ 帧差噪声?_C++_Image Processing_Opencv - Fatal编程技术网

C++ 帧差噪声?

C++ 帧差噪声?,c++,image-processing,opencv,C++,Image Processing,Opencv,我尝试使用帧差来检测运动。如果有议案,我会输入另一种方法;如果没有,我不会输入那种方法。问题是,当我使用absdiff()或bitwise_xor()进行帧差分时,会得到一个噪声帧,它总是被检测为运动 我试图通过使用腐蚀()和扩张()方法来消除噪声,它减少了噪声的影响,但仍然存在噪声。如何消除这种噪音 我当前代码的一部分: capture >> Frame; // get a new frame from camera cvtColor(Frame,Frame1,CV_RGB2GR

我尝试使用帧差来检测运动。如果有议案,我会输入另一种方法;如果没有,我不会输入那种方法。问题是,当我使用absdiff()或bitwise_xor()进行帧差分时,会得到一个噪声帧,它总是被检测为运动

我试图通过使用腐蚀()和扩张()方法来消除噪声,它减少了噪声的影响,但仍然存在噪声。如何消除这种噪音

我当前代码的一部分:

capture >> Frame; // get a new frame from camera

cvtColor(Frame,Frame1,CV_RGB2GRAY);
threshold(Frame1,Frame1,50,255,CV_THRESH_BINARY);

waitKey(500);
capture >> PreFrame;

cvtColor(PreFrame,PreFrame,CV_RGB2GRAY);
threshold(PreFrame,PreFrame,50,255,CV_THRESH_BINARY);

//Result = Frame1 - PreFrame1;
//absdiff(Frame1,PreFrame1,Result);

bitwise_xor(Frame1,PreFrame,Result);
erode(Result,Result,Mat());
dilate(Result,Result,Mat());

imshow("Result",Result);

if (norm(Result,NORM_L1)==0){
    printf(" no change \n")
}
else
{
    // motion detected
}

您可以通过几种不同的方式降低噪声,只需在捕获帧后立即应用以下技术之一:

模糊(帧内平均) 请看一些不同的模糊操作符,如:

  • (速度快,但不太平滑)
  • (速度较慢,但更平稳)
  • (减少脉冲噪声)
  • medianBlur
    有助于控制脉冲噪声,同时保留图像中的边缘

    帧平均(平均不同帧)
  • 对于帧平均,只需将累积结果除以累积的帧数即可得到平均帧。您可能需要一个滚动平均窗口,例如5-10帧,以显著降低噪音。但是,当对象移入或移出视野时,窗口大小越大,意味着运动越模糊。如果你的相机是静止的,这将是最好的


    希望有帮助

    您可以通过几种不同的方式降低噪音,只需在捕获帧后立即应用以下技术之一:

    模糊(帧内平均) 请看一些不同的模糊操作符,如:

  • (速度快,但不太平滑)
  • (速度较慢,但更平稳)
  • (减少脉冲噪声)
  • medianBlur
    有助于控制脉冲噪声,同时保留图像中的边缘

    帧平均(平均不同帧)
  • 对于帧平均,只需将累积结果除以累积的帧数即可得到平均帧。您可能需要一个滚动平均窗口,例如5-10帧,以显著降低噪音。但是,当对象移入或移出视野时,窗口大小越大,意味着运动越模糊。如果你的相机是静止的,这将是最好的


    希望有帮助

    如果获取灰度图像的绝对差值,然后对结果设置阈值以消除轻微的强度变化,会发生什么情况?这将允许像素强度帧到帧的微小变化,同时如果有任何重大变化,仍会触发运动检测器

    例如:

    // Obtain image two images in grayscale
    cvtColor(Frame,Frame1,CV_RGB2GRAY);
    cvtColor(PreFrame,PreFrame,CV_RGB2GRAY);
    
    // Take the absolute difference, this will be zero for identical
    // pixels, and larger for greater differences
    absdiff(Frame, PreFrame, Result)
    
    // Threshold to remove small differences
    threshold(Result,Result,20,255,CV_THRESH_BINARY);
    
    // Prepare output, using Result as a mask
    Mat output = Mat::zeros(Frame.size(), Frame.type());
    add(
        Frame,   // Add frame
        0,       // and zero
        output,  // to output
        Result   // Only if result is non-zero
    );
    

    您有任何可以共享的示例输入/输出图像吗?

    如果获取灰度图像的绝对差值,然后对结果设置阈值以消除轻微的强度变化,会发生什么情况?这将允许像素强度帧到帧的微小变化,同时如果有任何重大变化,仍会触发运动检测器

    例如:

    // Obtain image two images in grayscale
    cvtColor(Frame,Frame1,CV_RGB2GRAY);
    cvtColor(PreFrame,PreFrame,CV_RGB2GRAY);
    
    // Take the absolute difference, this will be zero for identical
    // pixels, and larger for greater differences
    absdiff(Frame, PreFrame, Result)
    
    // Threshold to remove small differences
    threshold(Result,Result,20,255,CV_THRESH_BINARY);
    
    // Prepare output, using Result as a mask
    Mat output = Mat::zeros(Frame.size(), Frame.type());
    add(
        Frame,   // Add frame
        0,       // and zero
        output,  // to output
        Result   // Only if result is non-zero
    );
    

    您有任何可以共享的输入/输出图像示例吗?

    通过在获取差异之前对图像进行阈值化,您可以大大增强噪声的效果。直接使用
    absdiff
    对灰度图像进行减法,而不是
    按位异或

    通过在进行差分之前对图像进行阈值化,可以大大提高噪声的效果。直接使用
    absdiff
    而不是
    按位异或
    对灰度图像进行减法将消除读出噪声(帧间差异)。模糊将消除像素差异,如FPN和PRNU。帧平均将消除读出噪声(帧间差异)。模糊将消除像素差异,如FPN和PRNU。可能的重复无法完全消除噪声。您应该尝试并采用“非常低的变化”的方法工作-例如,查看噪声的平均值,然后将低于平均值的所有帧差异视为噪声造成的。高于平均值,称之为“高变化”,如果你愿意,你假设图像中除了噪声影响之外还有其他影响,然后去计算所需的内容。可能的重复没有办法完全消除噪声。你应该尝试采用“非常低变化”的方法工作——例如,看看噪声的平均值是多少,然后,所有低于平均值的帧差异被视为是由于噪声引起的。所有这些都高于平均值,如果你愿意,可以称之为“高变化”,你假设图像中除了噪声影响之外还有其他影响,然后去计算所需的内容。@Mark Ransom谢谢你的帮助,这种方法可以最小化噪声,但帧颜色以一种奇怪的方式出现,我不知道为什么?!你说的框架颜色是什么意思?您已经转换为灰度,执行了图像减法,然后对结果进行了阈值化,因此
    result
    是一个二值图像,对应于图像中任何显著的强度变化。之后,我必须将帧返回到RGB,因此我使用了cvtColor(result,Result1,CV_GRAY2RGB);按位_和(Result1,Frame,SResult1)@Amr我已经用可能的解决方案更新了我的答案。如果我理解正确,您基本上希望使用结果作为遮罩从输入图像中选择特定像素。在这个例子中,我使用了一个虚拟函数来实现这一点,虽然可能有更优雅的方法。是的,这正是我想要的,现在它工作得很好,非常感谢much@Mark勒索谢谢你的帮助,这种方法使噪音降到了最低,但是画面的颜色却以一种奇怪的方式出现了,我不知道为什么?!你说的框架颜色是什么意思?您已经转换为灰度,执行了图像减法,然后对结果进行阈值化,因此
    结果
    是一个二值图像,对应于图像中任何显著的强度变化。之后,我必须将帧返回到RGB,因此我使用了cv