调试一种方法,用于使用C 中的OpenCV从视频中查找帧的平均帧
debugging a method for finding running average of frames from video for motion detection using OpenCV in C++
因此,要练习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;
}
- 如何使用OpenCV-C++编写*.mp4视频?
- OpenCV QT,显示视频的帧(不使用while循环)
- 在 openCV 中手动停止视频
- 在macOS Mojave上尝试OpenCV视频捕获时"Abort Trap: 6"
- 如何OPENCV+CUDA+视频捕获?
- 如何使用OpenCV同时显示"深度"和"颜色"视频图像
- 帧提取 使用OpenCV的视频文件开头只有几秒钟
- 如何使用OpenCV作为运动检测器(而不是寻找视频输出)
- Opencv cpp 使用多线程处理同一视频的不同部分
- OpenCV 检查计算机上是否安装了视频编解码器 (C++)
- Opencv 树莓派 3 视频播放 c++
- 使用opencv在受控环境中进行视频跟踪的跟踪标记和跟踪算法选择
- 使用 OpenCV C++ 每 1 分钟创建新的视频文件
- 使用 OpenCV 捕获 C++ 视频
- 从iPhone相机拍摄的视频似乎被OpenCV旋转了90度?我该如何解决这个问题?
- 我想在C++中用 openCV 拼接多个视频
- 使用 OpenCV 读取视频帧到指定的指针 (C++)
- 使用OpENCV中的两个视频仪捕获同一设备
- Opencv 保存视频
- OpenCV没有显示来自Macbook网络摄像头的视频