1

最近,我在 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

干杯斯蒂芬

4

2 回答 2

1

您的代码不是我要求的最小示例。它不完整,非常糟糕,无法编译,因此无法判断它有什么问题。

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

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

  • 从相机读取帧;

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

就这2个任务,就这么简单!忘记所有其他的东西,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 位)。

于 2012-04-18T17:06:27.710 回答
0

目前可用的最新OpenCV是2.4 beta 2。请尝试一下,看看问题是否仍然存在。

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

于 2012-04-18T09:51:31.503 回答