簡體   English   中英

幀差噪聲?

[英]Frame difference noise?

我正在嘗試使用幀差來檢測運動。 如果有動作,我會輸入另一種方法,如果沒有,我將不會輸入該方法。 問題是當我通過使用absdiff()或bitwise_xor()來制作幀差異時,我得到一個嘈雜的幀,它總是被檢測為一個運動。

我試圖通過使用erode()和dilate()方法消除噪音,它降低了噪音的影響,但仍有噪音。 我怎樣才能消除這種噪音?

我當前代碼的一部分:

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
}

在捕獲幀后立即使用以下技術之一,您可以通過幾種不同的方式降低噪聲:

模糊(幀內平均)

看看幾個不同的模糊運算符,如:

  1. 模糊 (快速,但不太流暢)
  2. GaussianBlur (慢,但更平滑)
  3. medianBlur (降低脈沖噪音)

medianBlur有助於控制脈沖噪聲,同時保留圖像中的邊緣。

幀平均(平均不同幀)

  1. 積累
  2. accumulateWeighted

對於幀平均,僅將累積結果除以累積的幀數以獲得平均幀。 你可能想要一個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
);

您是否有可以共享的示例輸入/輸出圖像?

通過在拍攝差異之前對圖像進行閾值處理,可以大大增加噪聲的影響。 直接用absdiff而不是bitwise_xor對灰度圖像進行bitwise_xor

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM