我有一个程序,它使用 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);