[英]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
}
在捕獲幀后立即使用以下技術之一,您可以通過幾種不同的方式降低噪聲:
看看幾個不同的模糊運算符,如:
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
);
您是否有可以共享的示例輸入/輸出圖像?
通過在拍攝差異之前對圖像進行閾值處理,可以大大增加噪聲的影響。 直接用absdiff
而不是bitwise_xor
對灰度圖像進行bitwise_xor
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.