您的代码不是我要求的最小示例。它不完整,非常糟糕,无法编译,因此无法判断它有什么问题。
它在最新的 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 位)。