调试一种方法,用于使用C 中的OpenCV从视频中查找帧的平均帧

debugging a method for finding running average of frames from video for motion detection using OpenCV in C++

本文关键字:视频 OpenCV 中的 查找 一种 方法 用于 调试      更新时间:2023-10-16

因此,要练习C 我正在编写一个运动检测程序,该程序将照片上传到 dropbox 使用OpenCV库,这是我去年夏天在Pyton进行的一个项目。本教程:https://www.pyimagesearch.com/2015/05/25/basic-motion-detection-and-tracking-with-python-and-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中的累积压力失败

我需要找出为什么在第二个循环中终止这一点。我认为这是一个象征性的错误。代码按书面运行,但我的说明实际上并不是我打算/需要做的。

一些可能有用的信息:

ACC最初是基于Gray_frame的,但我意识到该方法的设计取决于全球值的平均值,从而导致三角洲框架在所有程序框架中都具有原始帧的轮廓。因此,我正在尝试重新设计它以使用全球平均值。

所有3个通道(gray_frame,peratas和acc)都是一个。灰色框架的深度保持在0。首先,平均深度为5(在IF语句之后),然后是0,而ACC的深度保持在5。

在第二回路的积累加权之前,平均值的平均值与第一个循环的平均值相同。大约97.89

可以在此处找到整个C 程序(正在进行的工作):https://github.com/skewballfox/sauronseye/blob/master/master/sauronseye.cpp

我从去年夏天开始用作指导的我的工作(这主要是我练习,并且从未真正被观看,所以有点混乱):https://github.com/skewballfox/opencv-practice/blob/master/pi_surveillance.py

问题是当在convertscaleabs()中缩放平均值时,这将平均类型的类型更改为0或CV_8U。这是通过创建一个空垫()并将结果存储在其中而不是平均缩放本身来解决的:

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;
}