Opencv 비디오 읽기 및 쓰기 작업 (저장된 비디오 해결이 실제 재생 속도보다 빠름)

비디오를 저장하는 Opencv에는 VideoWriter 클래스가 있습니다.
VideoWriter 생성자의 여러 매개 변수의 의미 :
* 1. 출력 파일의 경로
* 2. fourcc는 압축 된 프레임을 나타내는 데 사용되는 4 개의 문자 코덱입니다. 예 :
CV_FOURCC ( 'P', 'I', 'M', '1') = MPEG-1 코덱
CV_FOURCC ( 'M', 'J', 'P', 'G') = motion-jpeg 코덱
CV_FOURCC ( 'M', 'P', '4', '2') = MPEG-4.2 코덱
CV_FOURCC ( 'D', 'I', 'V', '3') = MPEG-4.3 코덱
CV_FOURCC ( 'D', 'I', 'V', 'X') = MPEG-4 코덱
CV_FOURCC ( 'U', '2', '6', '3') = H263 코덱
CV_FOURCC ( 'I', '2', '6', '3') = H263I 코덱
CV_FOURCC ( 'F', 'L', 'V', '1') = FLV1 코덱
인코더 코드가 -1이면 실행시 인코더 선택 상자가 나타납니다 .3 .
비디오 프레임 속도를 저장합니다
. frame_size는 비디오의 너비와 높이를 포함합니다.
5. isColor가 0이 아닌 경우 인코더는 색상 프레임을 가져와 인코딩하고, 그렇지 않으면 회색조 프레임입니다 (이 플래그는 Windows에서만 지원됨).
참고 : 생성 된 파일에 대해 가장 작은 공간을 차지하는 인코딩 방법은 MPEG-4.2 코덱입니다. VideoWriter 클래스의 생성자 매개 변수는 CV_FOURCC ( 'M', 'P', '4', '2')입니다.
가장 큰 코덱은 MPEG-1 코덱이며, VideoWriter 클래스에 해당하는 생성자 매개 변수는 CV_FOURCC ( 'P', 'I', 'M', '1')로
전자보다 5.7 배 많은 공간 차지합니다. 따라서 24 시간 녹화 및 모니터링이 필요한 경우 MPEG-4.2 코덱을 우선적으로 사용할 수 있습니다.
동영상 저장시 두 프레임마다 일정 시간 동안 기다려야합니다. 대기 시간은 1000ms / 동영상 프레임 속도이며 그렇지 않으면 저장된 동영상이 원본보다 빠르게 재생됩니다.
구체적인 코드는 다음과 같습니다.

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

추천

출처blog.csdn.net/hongge_smile/article/details/108765240