1

我正在尝试在 MAC 10.6.8 上使用 openCV 2.4.0 读取 avi 视频并重新写入,没有任何更改

我的视频是灰度的,frame_rate = 25 和 Codec = 827737670,这是 FFV1(我猜)

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

我不确定是什么问题!

这是我给感兴趣的人的代码

提前感谢您的帮助:D

赛琳

注意:我的电脑上有 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;}

   } 
4

2 回答 2

3

检查此fourcc 代码列表,并搜索未压缩的代码,例如HFYU.

您可能还会发现这篇文章很有趣:使用 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
  • 解码格式:Planar 4:2:0 YUV

玩的时候看起来还不错。

我正在使用 OpenCV 2.4.3。

于 2013-02-08T16:33:02.580 回答
1

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

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

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

解决方案是,通过提供YUV240等多种格式的FFMPEG项目读写此类视频,在FFMPEG教程中有代码可以做到这一点

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

于 2013-04-13T03:09:09.860 回答