2017-12-27 292 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; 
}