2017-12-27 279 views
0

因此,要練習C++,我正在編寫一個運動檢測程序,將照片上傳到下拉框使用OpenCV庫,我做了一個項目去年夏天在pyton繼本教程後:https://www.pyimagesearch.com/2015/05/25/basic-motion-detection-and-tracking-with-python-and-opencv/調試使用OpenCV在C++中查找運動檢測視頻幀的運行平均值的方法

這部分代碼運行一次,然後在第二個循環中拋出一個錯誤。

這是代碼:

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/

Assertion failed with accumulateWeighted in OpenCV

我需要找出爲什麼終止於第二個循環。我認爲這是一個語義錯誤。代碼按照書面形式運行,但我的指示實際上並不是我打算/需要它執行的操作。

一些可能有用的信息:

加速最初基於關閉gray_frame但我意識到這種方法的設計依賴於全球數值平均,導致三角框架有原始幀的所有出發框架大綱。所以我試圖重新設計它,堅持使用全球平均水平。

所有3(gray_frame,average和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

+0

你有什麼實際問題?你問你爲什麼會斷言錯誤嗎? – MFisherKDX

+0

有點是啊,我知道這個問題是與accumulateWeighted()由於我最初調試時發現這兩個頁面:[https://stackoverflow.com/questions/7059817/assertion-failed-with-accumulateweighted-in-opencv ]和下面的問題中列出的錯誤 –

+0

我想弄清楚之間的差異(創建基於灰色框架的值和平均(初始化爲empy矩陣,但作爲一個浮動值複製的灰色框。我需要這種方法來平均工作,因爲我需要有一個運行的平均幀,以確定是否有任何東西在幀中移動。 –

回答

0

的問題是在縮放平均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; 
}