【问题标题】:cvQueryFrame(capture) always returns nullcvQueryFrame(capture) 总是返回 null
【发布时间】:2012-05-18 05:45:44
【问题描述】:

有人知道为什么我总是收到空帧吗?我尝试跳过前五个,但仍然为空。

int _tmain(int argc, char** argv)
{
CvCapture *capture  = cvCaptureFromFile(argv[1]);

int fps = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
IplImage* frame;
cvNamedWindow("video", CV_WINDOW_AUTOSIZE);
while(1)
{
    frame = cvQueryFrame(capture);
    if(!frame)
        break;
    cvShowImage("video", frame);
    char c = cvWaitKey(1000/fps);
    if(c == 33)
        break;
}
cvReleaseCapture( &capture);
cvDestroyWindow( "video" );

return 0;
}

【问题讨论】:

    标签: c++ opencv video-capture


    【解决方案1】:

    视频文件必须解压 avi! 所以实际上我得到的是空帧,因为 cvCapture 返回了一个空值,因为我的输入视频文件没有解压缩。

    【讨论】:

    • 虽然我没有解决问题,但很明显这个答案应该是官方的。尽可能接受它。但请始终考虑投票选出对您有帮助的答案,以及引导您走上正轨的答案。
    • 这点很好。你帮我追查到问题的根源。谢谢!
    【解决方案2】:

    我使用您的代码进行测试,然后它与“xvid”格式的视频一起运行良好。 我认为 OpenCV 的“捕获”功能可能会处理一些流行和旧格式的视频。 “H264”格式的视频可能无法播放。

    【讨论】:

      【解决方案3】:

      cvCaptureFromFile() 失败时,它返回NULL,我怀疑它失败了:

      CvCapture *capture  = cvCaptureFromFile(argv[1]);
      if (!capture)
      {
          // print error, quit application
      }
      

      它通常由于以下原因之一而失败:它找不到文件,或者 OpenCV 不知道如何打开它。例如,.mkv 文件不受 OpenCV 支持。

      【讨论】:

      • 我将一个 .wmv 文件放在与应用程序 (.exe) 相同的文件夹中。我尝试使用调试属性下的 VC++ 以及作为命令行参数将视频传递给应用程序。对于调试属性,我指定了 Wildlife.wmv,对于命令行参数,我键入 >HelloWorld.exe “Wildlife.wmv”。我做错了吗?
      • 尝试其他视频类型,例如 .AVI。结果将回答您的问题。
      • 即使使用 .avi 也会发生同样的事情。有没有办法确定问题是找不到文件还是不支持?
      • 当然,尝试fopen() argv[1] 中的任何内容并检查它是否成功。如果是这样,您就知道 OpenCV 很有可能因为编解码器相关问题而无法加载视频。
      • 我认为它也失败了我试过:FILE *file = fopen(argv[1], "r"); 并且文件为空。顺便说一下,这是 OpenCV 2.2。我之前使用的是 2.4,但我刚刚读到那是它的错误。
      猜你喜欢
      • 2014-03-04
      • 2016-11-02
      • 2014-05-06
      • 2012-06-05
      • 2014-05-30
      • 2014-02-23
      • 2017-10-12
      • 2013-08-16
      • 2016-03-28
      相关资源
      最近更新 更多