【问题标题】:OpenCV VideoWriter Assertion Failed img.cols == width && img.rows == height*3OpenCV VideoWriter 断言失败 img.cols == width && img.rows == height*3
【发布时间】:2019-03-10 22:45:11
【问题描述】:

我正在尝试使用 VideoWriter 类(当然还有 VideoCapture)来使用相机并保存视频,如果视频长于 10 秒,则最后 10 秒将保存在输出文件中。代码中有两个 VideoWriter 实例。但是,在运行时,我总是在控制台窗口中收到以下错误:
OpenCV Error: Assertion failed (img.cols == width && img.rows == height*3) in cv::mjpeg::MotionJpegWriter::write, file C:\build\master_winpack-build-win64- vc14\opencv\modules\videoio\src\cap_mjpeg_encoder.cpp, line 842
这是我的代码:(C++)

void main()
{
    VideoCapture vdc(0);
    VideoWriter vw("REC.avi", CV_FOURCC('M', 'J', 'P', 'G'), 100.0, Size(vdc.get(CAP_PROP_FRAME_WIDTH), vdc.get(CAP_PROP_FRAME_HEIGHT)),true);
    VideoWriter vw1("REC2.avi", CV_FOURCC('M', 'J', 'P', 'G'), 100.0, Size(vdc.get(CAP_PROP_FRAME_WIDTH), vdc.get(CAP_PROP_FRAME_HEIGHT)),true);
    char cmd = 'a';
    Mat frm;
    DWORD st, ed;
    st = GetTickCount();
    while (cmd != 27 && vdc.isOpened())
    {
        vdc >> frm;
        vw << frm;
        vw1 << frm;
        imshow("Camera", frm);
        cmd = waitKey(10);
    }
    ed = GetTickCount();
    destroyAllWindows();
    cout << ed - st << endl;
    vdc.release();
    vw.release();
    vw1.release();
    if (ed - st > 10000)
    {
        VideoCapture vdc2("REC2.avi");
        VideoWriter vw2("REC.avi", CV_FOURCC('M', 'J', 'P', 'G'), 100.0, Size(vdc2.get(CAP_PROP_FRAME_WIDTH), vdc2.get(CAP_PROP_FRAME_HEIGHT)),true);
        DWORD st2, ed2;
        st2 = getTickCount();
        Mat frame;
        while (vdc2.isOpened())
        {
            ed2 = getTickCount();
            vdc2 >> frame;
            if (ed2 - st2 > ed - st - 10000)
            {
                vw2 << frame;
                waitKey(10);
                if (vw2.get(CAP_PROP_POS_AVI_RATIO) == 1)break;
            }
        }
    }
}

我确定频道数是三个,我用vw没有问题(实际上REC2.avi可以正常打开但REC.avi不能)。
我在Win10中使用VS2017和最新版本的OpenCV。
我是 OpenCV 的新手,没有什么可以尝试的。

【问题讨论】:

  • 您在源代码的哪一行获得了 OpenCV 中的断言?
  • 这一行:vw2&lt;&lt;frame
  • 看看这个。 link.
  • 但是这个和那个完全不同(而且似乎矛盾)。调整大小是没有用的,我已经检查了好几次,并且确定通道和大小是正确的——毕竟第一个 VideoWriter 是正确的。 @I.Newton

标签: c++ opencv


【解决方案1】:

我注意到了几个问题:

  1. 您在 vw1 和 vw2 中打开同一个文件。我不确定 vw1.release() 是否正确关闭文件。

  2. 使用滴答计数来计算 10 秒的视频持续时间有点棘手。不如使用帧计数器和帧速率来代替?

【讨论】:

  • 我不太确定第一点,我渴望更好的解决方案;
  • 但是第二个问题不是重点——我把它改成GetTickCount() 时间没问题,但问题还是存在。
【解决方案2】:

我不确定,但框架的尺寸和 vw2 中提到的尺寸不匹配。尝试调整框架的大小,然后编写它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-10
    • 2021-01-25
    • 2014-03-19
    • 2012-11-26
    • 2014-11-24
    • 2014-05-28
    • 2020-12-31
    • 2015-09-12
    相关资源
    最近更新 更多