5

我认为我的问题非常基本,但我在 OpenCV 中编写这段代码只是为了简单地从网络摄像头捕获视频数据并将其保存到文件中。现在的问题是文件是在所需的目的地生成的,它最初的大小约为 286 字节。然后当我将第一帧分配给指针时,大小增加到 414 字节。但是,当我运行整个代码时,保存的视频大小仍然是 414 字节。当然,结果我的媒体播放器无法播放该文件并显示“不是 QuickTime Player 能够理解的格式”。VLC 播放器也是如此。

这是我的代码:

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>

int main( int argc, char** argv ) {
CvCapture* capture;

capture = cvCreateCameraCapture(0);

assert( capture != NULL );

IplImage* bgr_frame = cvQueryFrame( capture );

CvSize size = cvSize(
                     (int)cvGetCaptureProperty( capture,
                                               CV_CAP_PROP_FRAME_WIDTH),
                     (int)cvGetCaptureProperty( capture,
                                               CV_CAP_PROP_FRAME_HEIGHT)
                     );

cvNamedWindow( "Webcam", CV_WINDOW_AUTOSIZE );

CvVideoWriter *writer = cvCreateVideoWriter(    "/Users/user/Desktop/OpenCV_trial/OpenCV_trial/vidtry.AVI",
                                            CV_FOURCC('D','I','V','X'),
                                            30,
                                            size
                                            );

while( (bgr_frame = cvQueryFrame( capture )) != NULL ) 
{
    cvWriteFrame(writer, bgr_frame );
    cvShowImage( "Webcam", bgr_frame );
    char c = cvWaitKey( 33 );
    if( c == 27 ) break;
}
cvReleaseVideoWriter( &writer );
cvReleaseCapture( &capture );
cvDestroyWindow( "Webcam" );
return( 0 );
}

我不知道为什么会这样。我正在使用 mac OSX Lion 并运行 Xcode。

有没有人遇到过这个问题?如果是这样,我该如何解决?

谢谢!

-雅什

4

3 回答 3

2

嗨,我想我找到了问题的答案。

正如 Velthune 所建议的,这似乎是一个编解码器问题,MAC OS 只能运行其中的几个。这是所有可用的链接: Mac os 端口支持的 QuickTime 编解码器列表

不过,并非所有列出的编解码器都有效。在我尝试过的所有方法中,只有 WRLE 似乎有效。

非常感谢 Velthune。-雅什

于 2012-12-04T10:21:52.500 回答
1

您是否尝试过使用其他播放器打开文件?例如 VLC..

这是因为 Quicktime 和 .avi 不能很好地相处。

看看苹果文档

否则尝试更改视频编解码器,这是 opencv参考

于 2012-12-04T09:03:10.650 回答
0

其实我也试图做同样的事情。但它是我在 Windows 7 的 Visual C++ (Express Edition) 中尝试的。但在这种情况下,我们需要添加额外的标题作为“#include”stdafx.h“并确保保存文件的链接存在。例如我修改的代码如下:

#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>

int main( int argc, char** argv ) {
CvCapture* capture;

capture = cvCreateCameraCapture(0);

assert( capture != NULL );

IplImage* bgr_frame = cvQueryFrame( capture );

CvSize size = cvSize(
                     (int)cvGetCaptureProperty( capture,
                                               CV_CAP_PROP_FRAME_WIDTH),
                     (int)cvGetCaptureProperty( capture,
                                               CV_CAP_PROP_FRAME_HEIGHT)
                     );

cvNamedWindow( "Webcam", CV_WINDOW_AUTOSIZE );

CvVideoWriter *writer = cvCreateVideoWriter("D:/vidtry.AVI",CV_FOURCC('D','I','V','X'),15,size);

while( (bgr_frame = cvQueryFrame( capture )) != NULL ) 
{
    cvWriteFrame(writer, bgr_frame );
    cvShowImage( "Webcam", bgr_frame );
    char c = cvWaitKey( 33 );
    if( c == 27 ) break;
}
cvReleaseVideoWriter( &writer );
cvReleaseCapture( &capture );
cvDestroyWindow( "Webcam" );
return( 0 );
}
于 2013-03-26T09:31:25.107 回答