OpenCV之视频分析与对象跟踪(一) 视频读写

支持常见的视频格式:mp4 avi flash 甚至是 rtsp 实时流

每帧间隔超过 300ms 人眼就会认定为两张独立的图像,FPS 15 帧 20 帧 是可以接受的,最低甚至可以接受 5帧

代码

    #include "../common/common.hpp"

    void main(int argc, char** argv) 
    {
        //VideoCapture capture(0);
        VideoCapture capture;
        capture.open(getCVImagesPath("videos/sample.mp4"));
        double fps = capture.get(CV_CAP_PROP_FPS); // 获取视频帧率
        double frameWidth = capture.get(CV_CAP_PROP_FRAME_WIDTH); // 获取视频帧的宽高
        double frameHeight = capture.get(CV_CAP_PROP_FRAME_HEIGHT);
        cout << "fps=" << fps << ", frameWidth=" << frameWidth << ", frameHeight=" << frameHeight << endl;

        VideoWriter writer;
        /*
            bool open( // 打开要写的视频
                const String& filename, // 要写入的路径
                int apiPreference, 
                //  fourcc为 四个字符用来表示压缩帧的codec 例如:
                        CV_FOURCC('P','I','M','1')    = MPEG-1 codec
                        CV_FOURCC('M','J','P','G')    = motion-jpeg codec
                        CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec
                        CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec
                        CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec
                        CV_FOURCC('U', '2', '6', '3') = H263 codec
                        CV_FOURCC('I', '2', '6', '3') = H263I codec
                        CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec
                        若编码器代号为 -1,则运行时会弹出一个编码器选择框(实际运行,没有对话框,直接写入了, writer传.mp4自动识别了?)
                int fourcc, 
                double fps, // 被创建视频流的帧率
                Size frameSize, // 视频流的大小
                bool isColor = true // 如果非零,编码器将希望得到彩色帧并进行编码;否则,是灰度帧(只有在Windows下支持这个标志)
            );
        */
        writer.open(getCVImagesPath("videos/_mywrite.mp4"), CV_FOURCC('D', 'I', 'V', 'X'), fps==0 ? 15 : fps, Size(frameWidth, frameHeight), true);

        Mat frame, gray, binary;
        while (capture.read(frame))
        {
            cvtColor(frame, gray, COLOR_BGR2GRAY);
            threshold(gray, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);
            bitwise_not(frame, frame);
            imshow("src6-2", frame);
            writer.write(frame); // 写入每一帧,写入的视频的帧率与原视频的一致,算法的耗时与下面的waitKey的时长不会影响帧率
            if (waitKey(40) == 27) break;
        }
        capture.release();
        writer.release(); // 释放资源

        waitKey(0);
    }

效果图

这里写图片描述

猜你喜欢

转载自blog.csdn.net/huanghuangjin/article/details/81479344