未处理的 OpenCV - cvReleaseCapture 和 cvReleaseImage - C++



我有一个程序,它使用 OpenCV 库(版本 2.4.1)从笔记本电脑的网络摄像头(或任何其他连接的相机)捕获视频并将其保存到.avi文件中。当我在Visual Studio 2010中调试时,在程序的最后,当CvCapture或IplImage发布时,我会收到一个未经处理的异常。这是代码:

    // WriteRealTimeCapturedVideo.cpp : Defines the entry point for the console application.
    #include "stdafx.h"
    #include "cv.h"
    #include "highgui.h"
    #include <stdio.h>
    int main()
    {
        CvCapture* capture = cvCaptureFromCAM( 1 ); //CV_CAP_ANY
        if ( !capture )
        {
            fprintf( stderr, "ERROR: capture is NULL n" );
            getchar();
            return -1;
        }
        // Create a window in which the captured images will be presented
        cvNamedWindow( "mywindow", CV_WINDOW_AUTOSIZE );
        double fps = cvGetCaptureProperty (capture, CV_CAP_PROP_FPS);
        CvSize size = cvSize((int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH), (int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT));
        #ifndef NOWRITE
        CvVideoWriter* writer = cvCreateVideoWriter("Capture.avi", CV_FOURCC('M','J','P','G'), fps, size); //CV_FOURCC('M','J','P','G')
        #endif
        int width = (int)(cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH));
        int height = (int)(cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT));
        IplImage* frame = cvCreateImage( cvSize( width,height ), IPL_DEPTH_8U, 1);
        while ( 1 )
        {
            // Get one frame
            frame = cvQueryFrame( capture );
            if ( !frame ) 
            {
                fprintf( stderr, "ERROR: frame is null...n" );
                getchar();
                break;
            }
            cvShowImage( "mywindow", frame );
            #ifndef NOWRITE
            cvWriteToAVI( writer, frame );
            #endif
            char c = cvWaitKey(33);
            if( c == 27 ) break;
        }
        #ifndef NOWRITE
        cvReleaseVideoWriter( &writer );
        #endif
        cvDestroyWindow( "mywindow" );
        cvReleaseImage( &frame );
        cvReleaseCapture( &capture );
        return 0;
    }

发现我必须将 tbb.dll 和 tbb_debug.dll 与源代码(.cpp 文件)放在同一个目录中才能使程序正常工作。这些 dll 可以从英特尔下载。

视频

捕获有效,即窗口出现并显示视频,但无论我如何重新排列发布语句,都会发生异常。如果我删除发布语句(视频编写器除外),则不会收到异常,但是无法打开生成的.avi文件。当用户按 Esc 键时,程序退出 while 循环。

来自 openCV 文档:

cvQueryFrame

从相机或文件中抓取并返回帧

IplImage* cvQueryFrame( CvCapture* capture );

捕获 视频捕获结构。

函数 cvQueryFrame 从相机或视频文件中抓取帧, 解压缩并返回它。这个函数只是 cvGrabFrame 和 cvRetrieveFrame 在一个调用中。返回的图像应 用户不得发布或修改。

所以你不必分配或释放"框架"

删除:

IplImage* frame = cvCreateImage( cvSize( width,height ), IPL_DEPTH_8U, 1);

cvReleaseImage( &frame );

并替换

frame = cvQueryFrame( capture );

IplImage* frame = cvQueryFrame( capture );

我认为这条线导致了问题

IplImage* frame = cvCreateImage( cvSize( width,height ), IPL_DEPTH_8U, 1);

尝试另一个代码,例如

IplImage* frame = cvCreateImage( cvSize( width,height ), IPL_DEPTH_8U, 3);

相关内容

  • 没有找到相关文章

最新更新