如何用OpenCV编写视频文件?

CCS*_*CCS 14 macos opencv video-capture

我正在尝试编写一个程序来分析情感表达,比如眼泪.作为我的跟踪器的一部分,我使用OpenCV来录制示例视频.特别是,我不确定如何正确选择FPS(10FPS似乎应该工作).我也不确定我应该在OS X上使用哪个Codec,我也从这里尝试了所有可能的CV_FOURCC 但是返回了以下错误:

Stream #0.0: Video: rawvideo, yuv420p, 640x480, q=2-31, 19660 kb/s, 90k tbn, 10 tbc
Assertion failed: (image->imageSize == avpicture_get_size( (PixelFormat)input_pix_fmt, image->width, image->height )), function writeFrame, file /opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_release_ports_graphics_opencv/work/OpenCV-2.2.0/modules/highgui/src/cap_ffmpeg.cpp, line 1085.
Run Code Online (Sandbox Code Playgroud)

你们都有一些使用cvWriteFrame的工作代码吗?感谢您花时间看看我的问题!

对于那些感兴趣的人,整个计划是:

#include <cv.h>
#include <cxcore.h>
#include <highgui.h>

int main (int argc, const char * argv[]) 
{
    CvCapture *capture;
    IplImage  *img;
    int       key = 0;
    CvVideoWriter *writer;

    // initialize camera
    capture = cvCaptureFromCAM( 0 );
    // capture = cvCaptureFromAVI("AVIFile");

    // always check
    assert( capture );

    // create a window
    cvNamedWindow( "video", 1 );

    int color = 1; // 0 for black and white

    // get the frame size
    CvSize size = cvSize((int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH),(int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT));

    writer = cvCreateVideoWriter(argv[1], -1 , 10 , size, color);

    while( key != 'q' ) {
        // get a frame
        img = cvQueryFrame( capture );

        // always check
        if( !img ) break;

        cvWriteFrame( writer, img );        
        cvShowImage("video", img );

        // quit if user press 'q'
        key = cvWaitKey( 5 );
    }

    // free memory
    cvReleaseVideoWriter( &writer );
    cvReleaseCapture( &capture );
    cvDestroyWindow( "video" );

    return 0;   
}
Run Code Online (Sandbox Code Playgroud)

mpe*_*kov 19

看看这里推荐使用的编解码器.

基本上:

  • 您可以使用-1而不是CV_FOURCC(...) 仅在Windows上使用(请参阅手册).由于您使用的是OSX,因此无法使用它.
  • 用于CV_FOURCC('I', 'Y', 'U', 'V')使用yuv420p编码到未压缩的AVI容器中 - 这是推荐的方法
  • 如果你想要压缩视频,那么你可以使用像ffmpegOpenCV压缩AVI输出的工具

OpenCV不推荐使用压缩编解码器的原因可能是因为每个编解码器都有大量特定于编解码器的选项,并且通过简单的OpenCV视频编写器接口处理所有这些选项是不可能的.

编辑

我有一些坏消息:

不幸的是,我们仍然没有适用于Mac OS X的工作(即原生)视频编写器.如果您需要视频编写,您当前应该配置ffmpeg或xine并禁用QuickTime.

听起来您可能需要重新配置和重新编译库.

编辑2

或者,您可以将每个帧写入JPEG文件,然后使用ffmpeg(应该在OS/X上工作)将这些JPEG文件拼接成电影.无论如何,这基本上就是MJPEG.但是,使用利用时间冗余的编解码器(例如MPEG4,H.264等)可能会获得更好的压缩率.