【问题标题】:reading video from file opencv从文件opencv读取视频
【发布时间】:2012-12-04 18:14:22
【问题描述】:

嗨所以我写了这段代码来从文件中捕获视频

#include <stdio.h>
#include <cv.h>
#include "highgui.h"
#include <iostream>

//using namespace cv

int main(int argc, char** argv)
{
    CvCapture* capture=0;
    IplImage* frame=0;
    capture = cvCaptureFromAVI(char const* filename); // read AVI video    
    if( !capture )
        throw "Error when reading steam_avi";

    cvNamedWindow( "w", 1);
    for( ; ; )
    {
        frame = cvQueryFrame( capture );
        if(!frame)
            break;
        cvShowImage("w", frame);
    }
    cvWaitKey(0); // key press to close window
    cvDestroyWindow("w");
    cvReleaseImage(&frame);
}

每次我运行它,我都会收到以下错误:

CaptureVideo.cpp:在函数“int main(int, char**)”中:

CaptureVideo.cpp:13:28: 错误:“char”之前的预期主表达式

任何帮助将不胜感激。

【问题讨论】:

  • 而不是 char const* filename 您应该输入实际的文件名(或包含它的变量),例如capture = cvCaptureFromAVI("myvideo.avi")
  • 好的,我已经使用了我想要的视频的名称,但后来出现了这个错误:在抛出 'char const*' 实例后调用终止已中止(核心转储)
  • 可能是因为如果视频无法打开,您会抛出const char*...确保路径正确并且您安装了正确的编解码器。
  • 我可以抛出什么异常?
  • 您可以抛出任何您喜欢的异常,但您的问题是(很可能)视频无法打开(无论出于何种原因,我概述了一些可能的原因)。

标签: c++ c opencv


【解决方案1】:

这是 C++ 问题,所以你应该使用 C++ 接口。

原始代码中的错误:

  • 您忘记删除 cvCaptureFromAVI 中的 char const*
  • 您无需等待显示框架。 ShowImage 仅在其后跟 WaitKey 时有效。
  • 我不确定 capture=NULL 是否意味着您的文件未打开。请改用isOpened

我已更正您的代码并将其放入 C++ 接口,因此它现在是正确的 C++ 代码。我的重写与您的程序一样逐行进行。

//#include <stdio.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
//#include <iostream>

using namespace cv;
using std::string;

int main(int argc, char** argv)
{
    string filename = "yourfile.avi";
    VideoCapture capture(filename);
    Mat frame;

    if( !capture.isOpened() )
        throw "Error when reading steam_avi";

    namedWindow( "w", 1);
    for( ; ; )
    {
        capture >> frame;
        if(frame.empty())
            break;
        imshow("w", frame);
        waitKey(20); // waits to display frame
    }
    waitKey(0); // key press to close window
    // releases and window destroy are automatic in C++ interface
}

【讨论】:

  • 我们必须将if(!frame) 替换为 if( frame.empty() )
  • 我收到terminate called after throwing an instance of 'char const*' Aborted (core dumped)
  • @mkuse 我认为值得提出一个问题。我建议你把你使用的环境、确切的opencv版本、c++版本和编译器也放在那里。
  • @mkuse 这个问题看起来不错,我对在 linux 上自定义安装的 opencv 没有太多经验,抱歉。我希望有人会在这个详尽的描述之后提供帮助。祝你好运!
猜你喜欢
  • 2018-07-22
  • 1970-01-01
  • 2014-04-30
  • 2018-01-27
  • 2023-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多