Operaciones de lectura y escritura de video Opencv (resolver el video guardado es más rápido que la velocidad de reproducción real)

Hay una clase VideoWriter en opencv que guarda videos.
El significado de varios parámetros del constructor VideoWriter:
* 1. La ruta del archivo de salida
* 2. fourcc es el códec de los cuatro caracteres utilizados para representar el marco comprimido. Por ejemplo:
CV_FOURCC ('P', 'I', 'M', '1') = códec MPEG-1
CV_FOURCC ('M', 'J', 'P', 'G') = códec jpeg de movimiento
CV_FOURCC ('M', 'P', '4', '2') = códec MPEG-4.2
CV_FOURCC ('D', 'I', 'V', '3') = códec MPEG-4.3
CV_FOURCC ('D', 'I', 'V', 'X') = códec MPEG-4
CV_FOURCC ('U', '2', '6', '3') = códec
H263 CV_FOURCC ('I', '2', '6', '3') = H263I códec
CV_FOURCC ('F', 'L', 'V', '1') = códec FLV1
Si el código del codificador es -1, aparecerá un cuadro de selección del codificador cuando se ejecute
3. Guarde la velocidad de fotogramas del vídeo
4. frame_size contiene el ancho y el alto del video.
5. Si isColor no es cero, el codificador esperará obtener un marco de color y codificar; de lo contrario, es un marco en escala de grises (este indicador solo es compatible con Windows)
Observaciones: El método de codificación que ocupa el menor espacio para el archivo generado es el códec MPEG-4.2. El parámetro constructor de la clase VideoWriter es CV_FOURCC ('M', 'P', '4', '2').
El más grande es el códec MPEG-1, el parámetro constructor correspondiente a la clase VideoWriter es CV_FOURCC ('P', 'I', 'M', '1'), que
ocupa 5,7 veces el espacio en disco del primero. Por lo tanto, si necesita grabación y monitoreo las 24 horas, puede dar prioridad al uso del códec MPEG-4.2.
Cabe señalar que al guardar un video, debe esperar un cierto tiempo entre cada dos fotogramas. El tiempo de espera es de 1000 ms / velocidad de fotogramas de video, de lo contrario el video guardado se reproducirá más rápido que el original. El
código específico es el siguiente:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char **argv) {
    
    
    VideoCapture capture(1);
    if (!capture.isOpened()) {
    
    
        printf("could not load video data...\n");
        return -1;
    }
    double fps = capture.get(CV_CAP_PROP_FPS);    //读取视频帧率
    Size size = Size(capture.get(CV_CAP_PROP_FRAME_WIDTH), capture.get(CV_CAP_PROP_FRAME_HEIGHT));
    printf("FPS : %f", fps);
    VideoWriter writer("/home/fuhong/code/cpp/opencv_learning/src/object_tracing/video/test.avi",
                       CV_FOURCC('M', 'P', '4', '2'), 15.0, size, true);


    // create window
    Mat frame, gray, binary;
    namedWindow("video-demo", CV_WINDOW_AUTOSIZE);

    // show each frame and save
    vector<Mat> bgr;
    while (capture.read(frame)) {
    
    
        //inRange(frame, Scalar(0, 127, 0), Scalar(127, 255, 127), gray);
        //cvtColor(frame, gray, COLOR_BGR2GRAY);
        //threshold(gray, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);
        //bitwise_not(frame, frame);
        flip(frame, frame, 1);
        imshow("video-demo", frame);
        writer.write(frame);
        char c = waitKey(1000/fps);  //这里等待的时间为1000ms/视频帧率,要不然保存的视频会比原来播放的快.
        if (c == 27) {
    
    
            break;
        }
    }

    waitKey(0);
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/hongge_smile/article/details/108765240
Recomendado
Clasificación