[英]debugging a method for finding running average of frames from video for motion detection using OpenCV in C++
因此,為了練習C ++,我正在編寫一個運動檢測程序,該程序使用OpenCV庫將照片上傳到Dropbox ,該項目是我去年夏天在pyton中按照本教程進行的: https : //www.pyimagesearch.com/2015/05/25 /使用python和opencv進行基本運動檢測和跟蹤/
此部分代碼運行一次,然后在第二個循環上引發錯誤。
這是代碼:
Mat set_delta(Mat &average, Mat gray_frame)
{
Mat delta_frame;
if (average.empty()==1)
{
cout<<"gray frame depth: "<<gray_frame.depth();
gray_frame.convertTo(average, CV_32FC(gray_frame.channels()));
//Mat Acc(gray_frame.rows, gray_frame.cols,CV_32FC(gray_frame.channels()));
}
//cout<<"gray_frame average: "<< get_average(gray_frame)<<
// "\naverage_frame average: "<<get_average(average);
Mat Acc(average.rows, average.cols,CV_32FC(average.channels()));
cout<<"average depth: "<<average.depth()<<"\nAcc depth: "<<Acc.depth();
accumulateWeighted(gray_frame, average, .5);
convertScaleAbs(average, average);
absdiff(gray_frame,average,delta_frame);
return delta_frame;
}
我收到此錯誤:
OpenCV Error: Assertion failed (func != 0) in accumulateWeighted, file /build/opencv/src/opencv-3.3.1/modules/imgproc/src/accum.cpp, line 635
terminate called after throwing an instance of 'cv::Exception'
what(): /build/opencv/src/opencv-3.3.1/modules/imgproc/src/accum.cpp:635: error: (-215) func != 0 in function accumulateWeighted
錯誤是由累積加權函數生成的,在閱讀以下頁面后,我試圖通過創建本地數組Acc來解決此問題:
http://answers.opencv.org/question/63781/accumulateweighted-problems/
斷言失敗,OpenCV中的accumulateWeighted
我需要找出為什么這終止於第二個循環。 我認為這是一個錯誤。 該代碼按編寫的方式運行,但是我的指令實際上並不是我打算/不需要的。
一些可能有用的信息:
Acc最初基於gray_frame,但我意識到此方法的設計取決於全局值平均值,從而導致增量幀在所有后續幀中都有原始幀的輪廓。 因此,我正在嘗試對其進行重新設計,以堅持使用全球平均水平。
所有3個通道(gray_frame,平均值和Acc)均為1。 灰框的深度保持為0。首先,平均值的深度為5(在if語句之后),然后為0,而Acc的深度保持為5。似乎主循環執行一次,然后退出。
在第二個循環的累加加權之前,平均值的單個平均值與第一個循環的平均值相同。 大約97.89
整個C ++程序(正在進行中)可以在這里找到: https : //github.com/skewballfox/SauronsEye/blob/master/SauronsEye.cpp
我去年夏天的工作被用作指導(主要是供我練習,從未真正打算被觀看過,因此有點混亂): https : //github.com/skewballfox/opencv-practice/ Blob / master / pi_surveillance.py
問題是,在convertScaleAbs()中縮放平均值時,會將平均值的類型更改為0或CV_8U。 通過創建一個空的Mat()並將結果存儲在其中,而不是縮放平均值本身,可以解決此問題:
Mat set_delta(Mat &average, Mat gray_frame)
{
Mat delta_frame, scaled_average;
//delta_frame is the storage for the difference between the accumulated average
//and the current gray frame. scaled average is for storing the output of convertScaleAbs()
//otherwise the depth of global average is 0 and causes an error on the second loop
if (average.empty()==1)
{
gray_frame.convertTo(average, CV_32FC(gray_frame.channels()));
}
accumulateWeighted(gray_frame, average, .5);
convertScaleAbs(average, scaled_average);
absdiff(gray_frame,scaled_average,delta_frame);
return delta_frame;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.