使用cvVideoWriter时,OpenCV 2.3.1 highgui在退出时崩溃

时间:2012-04-18 09:44:35

标签: c opencv crash exit

最近,我建议在Stackoverflow上升级到OpenCV 2.3.1,以便用cvVideoWriter(视频的最后一帧既不读/写)也能用v.2.3.1改进结果阅读没关系,但写作仍然是一个问题。不过我修复了这个问题,但不能应对另一个问题:使用VideoWriter函数时,我的程序总会崩溃。我检查了原因,结果证明是highgui(2.3.1)的新版本,因为如果我使用highgui210而不发生崩溃(当然最后一帧问题)。有谁知道这个问题以及如何解决它?顺便说一句,我不知道它是否有任何重要性:我已按照下页的说明在我的系统上安装OpenCV 2.3.1(我使用的是VS 9 Express):

http://www.arunkumarr.co.in/site/index.php/articles/10-configuring-opencv-23-in-visual-studio-2008

干杯 斯蒂芬

2 个答案:

答案 0 :(得分:1)

您的代码不是我要求的最小示例。它是不完整的,可怕的,它不能编译,因此不可能分辨出它有什么问题。

它在最新的OpenCV版本中崩溃的事实并不一定意味着OpenCV有一个问题:可能是他们最终在一个在以前的版本中几乎没有做任何事情的功能中做了不错的实现。

您最合适的行动方案是:编写一个执行您感兴趣的核心任务的最小应用程序,通过阅读您的代码,它似乎是:

  • 从相机中读取相框;

  • 打开视频编辑器,将相机中的帧记录到磁盘中;

这两项任务就是这么简单!忘记所有其他内容,CreateAvi()CloseAvi()remove()以及其他不属于OpenCV的函数。

简单的应用程序将演示OpenCV的工作原理,并且您看到的问题可能是由从此简单应用程序中删除的代码中存在的其他内容引起的。

这个问题不在OpenCV中,它来自你编写的代码。

修改

德国老兄,我不觉得你的问题受到了攻击,也没有开发OpenCV。现在,下面的应用程序完成了从一开始就应该做的事情。 这是一个使用OpenCV读取视频文件,在窗口上显示帧然后将帧写入磁盘上的新文件的最小示例。它很简单,很有效,它演示了我一直想告诉你的内容:你观察到的问题不是由OpenCV 2.3.1中的错误引起的。享受:

#include <cv.h>
#include <highgui.h>

int main()
{   
    CvCapture* capture = cvCreateFileCapture("green_lantern_sample.avi");
    if (!capture)
    {
        printf("!!! cvCreateFileCapture failed\n");
        return -1; 
    }

    int frame_count = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT);
    int fps = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);
    int video_w = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH);
    int video_h = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT);
    printf("* %d x %d\n", video_w, video_h);

    CvVideoWriter* writer = cvCreateVideoWriter("out.avi", 
                                                CV_FOURCC('X','V','I','D'), 
                                                fps, 
                                                cvSize(video_w, video_h), 
                                                1);
    if (!writer)
    {
        printf("!!! cvCreateVideoWriter failed\n");
        return -1; 
    }

    cvNamedWindow("video");
    IplImage* frame = NULL;
    while (true)
    {        
        frame = cvQueryFrame(capture);
        if(!frame)
            break;

        cvWriteFrame(writer,frame);                 

        cvShowImage("video", frame);
        cvWaitKey(1);        
    }

    cvReleaseVideoWriter(&writer);
    cvReleaseCapture(&capture);
    cvDestroyWindow("video");

    return 0;
}

使用OpenCV 2.3.1进行测试:VS 9 Express(Windows XP 32位)和Fedora Linux(32位)。

答案 1 :(得分:0)

目前,最新的OpenCV版本是2.4 beta 2.请尝试一下,检查问题是否仍然存在。

但问题也可能是由错误的配置引起的 - 检查所有路径(ENV变量,Visual Studio配置,bin文件,lib文件和包括dirs指向正确的OpenCV版本)