OpenCV accumWeight错误(通道和大小比较时断言失败)

时间:2013-05-16 12:05:26

标签: c++ opencv image-processing g++

我正在运行以下代码来计算从OpenCV上的视频读取的图像集合的运行平均值。

编辑:(代码已更新)

#include <iostream>
#include <string>
#include <iomanip>
#include <sstream>
#include <cstdio>
#include "opencv2/core/core.hpp"
#include "opencv2/opencv.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/video/video.hpp"

using namespace std;
using namespace cv;
int main(int argc, char *argv[]) {
    if(argc < 2) {
        printf("Quitting. Insufficient parameters\n");
        return 0;
    }
    char c;
    int frameNum = -1;

    const char* WIN_MAIN = "Main Window";
    namedWindow(WIN_MAIN, CV_WINDOW_AUTOSIZE);
    VideoCapture capture;
    capture.open(argv[1]);
    Mat acc, img;
    capture.retrieve(img, 3);
    acc = Mat::zeros(img.size(), CV_32FC3);
    for(;;) {
        if(!capture.grab()) {
            printf("End of frame\n");
            break;
        }

        capture.retrieve(img, 3);
        Mat floating;
        img.convertTo(floating, CV_32FC3);
        accumulateWeighted(floating, acc, 0.01);
        imshow(WIN_MAIN, img);
        waitKey(10);
    }
    return 0;
}

在运行带有示例视频的代码时,会弹出以下错误

OpenCV Error: Assertion failed (dst.size == src.size && dst.channels() == cn) in accumulateWeighted, file /usr/lib/opencv/modules/imgproc/src/accum.cpp, line 430
terminate called after throwing an instance of 'cv::Exception'
  what():  /usr/lib/opencv/modules/imgproc/src/accum.cpp:430: error: (-215) dst.size == src.size && dst.channels() == cn in function accumulateWeighted

Aborted (core dumped)

错误的可能原因是什么?你能指导我正确的方向吗?

使用的编译器:g ++ OpenCV版本:2.4.5

谢谢!

3 个答案:

答案 0 :(得分:3)

来自refman的

src – Input image as 1- or 3-channel, 8-bit or 32-bit floating point.
dst – Accumulator image with the same number of channels as input image, 32-bit or 64-bit
floating-point.

所以,你的相机输入img CV_8UC3,你的acc img是(当前)CV_32F。那是不合适的。

你想要acc的3channel浮点数,那就是:

acc = Mat::zeros(img.size(), CV_8UC3);`

为了获得更高的精度,您也希望将img更改为float类型,因此它将是:

   acc = Mat::zeros(img.size(), CV_32FC3);  // note: 3channel now

    for (;;) {

        if(!capture.grab()) {
            printf("End of frame\n");
            break;
        }

        capture.retrieve(img); // video probably has 1 stream only
        Mat floatimg;
        img.convertTo(floatimg, CV_32FC3);
        accumulateWeighted(floatimg, acc, 0.01);

编辑:

尝试通过以下方式替换抓取/检索序列:

for(;;) {
    capture >> img;
    if ( img.empty() )
        break;

答案 1 :(得分:0)

我可以阅读retrieve

的OpenCV文档
  

C ++:bool VideoCapture :: retrieve(Mat&amp; image,int channel = 0);

第二个参数是频道 在accumulateWeighted的文档中,它说:

  

C ++:void accumulateWeighted(InputArray src,InputOutputArray dst,   double alpha,InputArray mask = noArray())

     

参数:src - 输入图像为1或3通道,8位或32位   浮点。

但是在你的代码中:

capture.retrieve(img, 2);

我猜你的频道参数错误

答案 2 :(得分:0)

我遇到了同样的问题,这是我的解决方案。

Mat frame, acc;
// little hack, read the first frame
capture >> frame;
acc = Mat::zeros(frame.size(), CV_32FC3);

for(;;) {
...