使用openCV在MAC上读/写avi视频

时间:2013-02-07 17:03:34

标签: c macos video opencv grayscale

我正在尝试阅读avi视频,并在MAC 10.6.8上使用openCV 2.4.0进行重新编写,而不做任何更改

我的视频是灰度的,frame_rate = 25,编解码器= 827737670,这是FFV1(我猜)

问题是...... 当我读取和写入视频时......我看到大小和颜色有很多变化...... 写完3到4次后,我可以看到视频开始是(粉红色)!!!!

我不确定是什么问题!!!

这是我感兴趣的人的代码

提前感谢您的帮助:D

Seereen

注意:我的计算机上有FFMPEG V 0.11(我不知道这是否重要)

{    

int main (int argc, char * const argv[]) {
    char name[50];

    if (argc==1)
    {
        printf("\nEnter the name of the video:");
        scanf("%s",name); 

    } else if (argc == 2)
        strcpy(name, argv[1]);

    else 
    {
        printf("To run this program you should enter the name of the program at least, or you can enter the name of the program then the file name");
        return 0; 
    }

    cvNamedWindow( "Read the video", CV_WINDOW_AUTOSIZE );

    // GET video
    CvCapture* capture = cvCreateFileCapture( name );
    if (!capture ) 
    {
        printf( "Unable to read input video." );
        return 0;
    }

    double fps = cvGetCaptureProperty( capture,CV_CAP_PROP_FPS);
     printf( "fps %f ",fps );
    int codec = cvGetCaptureProperty( capture,CV_CAP_PROP_FOURCC);
    printf( "codec %d ",codec );
    // Read frame
    IplImage* frame = cvQueryFrame( capture );
    // INIT the video writer
    CvVideoWriter *writer = cvCreateVideoWriter( "x7.avi", codec, fps, cvGetSize(frame),1);
    while(1) 
    {
        cvWriteFrame( writer, frame );
        cvShowImage( "Read the video", frame );
        // READ next frame
        frame = cvQueryFrame( capture );
        if( !frame ) 
            break;
        char c = cvWaitKey(33);
        if( c == 27 ) 
            break;
    }

    // CLEAN everything
    cvReleaseImage( &frame );
    cvReleaseCapture( &capture );
    cvReleaseVideoWriter( &writer );
    cvDestroyWindow( "Read the video" );    
    return 0;}

   } 

2 个答案:

答案 0 :(得分:3)

选中此list of fourcc codes,然后搜索未压缩的内容,例如HFYU

你也可能会发现这篇文章很有趣:Truly lossless video recording with OpenCV

修改

我有一台Mac OS X 10.7.5可供您使用,因为您提供了测试视频,我决定分享我的发现。

我为测试目的编写了以下源代码:它会加载您的视频文件并将其写入新文件 out.avi ,同时保留编解码器信息:

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

#include <iostream>

int main(int argc, char* argv[])
{
    // Load input video
    cv::VideoCapture input_cap(argv[1]);
    if (!input_cap.isOpened())
    {
        std::cout << "!!! Input video could not be opened" << std::endl;
        return -1;
    }

    // Setup output video
    cv::VideoWriter output_cap("out.avi", 
                               input_cap.get(CV_CAP_PROP_FOURCC),
                               input_cap.get(CV_CAP_PROP_FPS),
                               cv::Size(input_cap.get(CV_CAP_PROP_FRAME_WIDTH), input_cap.get(CV_CAP_PROP_FRAME_HEIGHT)));                          
    if (!output_cap.isOpened())
    {
        std::cout << "!!! Output video could not be opened" << std::endl;
        return -1;
    }

    // Loop to read from input and write to output
    cv::Mat frame;
    while (true)
    {       
        if (!input_cap.read(frame))             
            break;

        output_cap.write(frame);
    }

    input_cap.release();
    output_cap.release();

    return 0;
}

输出视频呈现出与输入相同的特征:

  • 编解码器:FFMpeg视频1(FFV1)
  • 分辨率:720x480
  • 帧率:25
  • 解码格式:平面4:2:0 YUV

玩的时候看起来很好。

我正在使用OpenCV 2.4.3。

答案 1 :(得分:1)

我找出问题,,,,, 以YUV240像素格式编写的原始视频(并且是灰色的)

openCV默认读取BGR上的视频,所以每当我读取它时openCV将像素值转换为BGR

经过几次读写后,错误开始变大(因为转换操作) 为什么像素值会改变.....我看到视频粉红色!

解决方案是,FFMPEG项目读取和写入这种视频,提供YUV240和许多其他格式 有一个代码可以在FFMPEG教程中执行此操作

我希望这可以帮助面临类似问题的其他人