【问题标题】:OpenCV saving video to fileOpenCV将视频保存到文件
【发布时间】:2012-11-21 20:02:25
【问题描述】:

我认为我的问题非常基本,但我在 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。

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

谢谢!

-亚什

【问题讨论】:

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

标签: c++ xcode macos opencv computer-vision


【解决方案1】:

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

正如 Velthune 所建议的,这似乎是一个编解码器问题,MAC OS 只能运行其中的几个。这是所有有效的链接: List of QuickTime codecs supported by the mac os port

但并非所有列出的编解码器都能正常工作。在我尝试过的所有方法中,只有 WRLE 似乎有效。

非常感谢 Velthune。 -Yash

【讨论】:

  • 感谢您的链接实例!
【解决方案2】:

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

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

看看苹果documentation

要不然换个视频编解码器试试,这个是opencvreference

【讨论】:

  • 是的,VLC 也是如此。此外,我认为代码运行的方式有问题,因为文件的大小没有增长。另外,在我自己的代码出现相同错误之后,我从博客中获取了代码。
  • 我测试了你的代码,一切正常,视频 .avi 已创建,我可以用 mplayer 打开它(我在 linux 下工作,所以我可以测试 quicktime)。
  • 哦,好吧,我想我确信代码可以正常工作。您是否在代码中添加任何头文件?或者以任何其他方式调整代码?我相信,问题似乎在于 Xcode 执行代码的方式。但我不确定。
  • 我用过这个头文件:#include #include
  • 好的。所以这不是问题所在。出于某种奇怪的原因,代码只是拒绝将数据写入我创建的文件中。
【解决方案3】:

其实我也在尝试做同样的事情。但它是我在 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 );
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-14
    • 2011-03-24
    • 1970-01-01
    • 2019-09-14
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多