read/write avi video on MAC using openCV

南楼画角 提交于 2019-12-08 04:08:47

问题


I am trying to read avi video and write it again as it is without any change using openCV 2.4.0 on MAC 10.6.8

My videos is grayscale with frame_rate = 25 and Codec = 827737670 which is FFV1 (I guess)

The problem is .... when I read and write the video as it is .... I see many changes in size and in color ... After 3 or 4 times of writing I can see the video start to be (Pink) color !!!

I am not sure what is the problem !!!

this is my code for the people who interest

Appreciate your help in advance :D

Seereen

Note : I have on my computer FFMPEG V 0.11 (I do not know if this important)

{    

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;}

   } 

回答1:


Check this list of fourcc codes, and search for the uncompressed ones, like HFYU.

You also might find this article interesting: Truly lossless video recording with OpenCV.

EDIT:

I have a Mac OS X 10.7.5 at my disposal and since you gave us the video for testing I decided to share my findings.

I wrote the following source code for testing purposes: it loads your video file and writes it to a new file out.avi while preserving the codec information:

#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;
}

The output video presented the same characteristics of the input:

  • Codec: FFMpeg Video 1 (FFV1)
  • Resolution: 720x480
  • Frame rate: 25
  • Decoded format: Planar 4:2:0 YUV

and it looked fine when playing.

I'm using OpenCV 2.4.3.




回答2:


I figure out the problem ,,,,, The original videos written in YUV240 pixel format (and it is gray)

the openCV read the video on BGR by default , so each time when I read it the openCV convert the pixel values to BGR

after few time of reading and writing , the error start to be bigger (because the conversion operation) that why the pixels values change .....and I see the video pink !

The Solution is , read and write this kind of videos by FFMPEG project which provide YUV240 and many other format there is a code can do this operation in the tutorial of FFMPEG

I hope this can help the others who face similar problem



来源:https://stackoverflow.com/questions/14756767/read-write-avi-video-on-mac-using-opencv

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!