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

标签 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

干杯 斯蒂芬

最佳答案

您的代码不是我要求的最小示例。它不完整,识别错误,无法编译,因此无法判断它有什么问题。

它在最新的 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;
}

在 VS 9 Express(Windows XP 32 位)和 Fedora Linux(也是 32 位)上使用 OpenCV 2.3.1 进行了测试。

关于c - 使用 cvVideoWriter 时 OpenCV 2.3.1 highgui 在退出时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10206837/

相关文章:

c++ - SVM 支持 vector 机回归 openCv c++

android - 删除记录时Android崩溃

c - 从 C 中的节点删除特定成员

c++ - clang: error: linker command failed with exit code 1 (使用 -v 查看调用) MINIX3

c - system() C函数可以吗?

python cv2.circle 子像素绘图

c# - 如何在EMGU CV 3.1上拍摄相机的屏幕截图?

iphone - iPhone上的NSString drawAtPoint崩溃(NSString drawAtPoint)

mongodb - mongod崩溃(以信号5终止)

c - 在c文件操作中不要追加