簡體   English   中英

調試一種使用C ++中的OpenCV從視頻中查找幀的移動平均值以進行運動檢測的方法

[英]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.

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