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