c++ OpenCV VideoCapture 打开摄像头 保存视频 读取视频

c++ OpenCV VideoCapture 打开摄像头 保存视频 读取视频

一、打开摄像头

#include <iostream>
#include <filesystem>
#include <string>
#include <windows.h>
#include <opencv2/opencv.hpp>

namespace fs = std::filesystem;
using namespace cv;
using namespace std;

// 摄像头
void video()
{
    // 读取摄像头
    VideoCapture capture(0);

    while (true)
    {
        Mat frame;
        capture >> frame;
        imshow("摄像头", frame);
        waitKey(30); // 延时30
    }
}

int main()
{
    video();

    waitKey(0);
    destroyAllWindows();
    return 0;
}

二、保存视频

其中fourcc编码格式可选参数如下:

参数                 编码格式
MPEG-1          CV_FOURCC(‘P’,‘I’,‘M’,‘1’)
motion-jpeg   CV_FOURCC(‘M’,‘J’,‘P’,‘G’)
MPEG-4.2       CV_FOURCC(‘M’, ‘P’, ‘4’, ‘2’)
MPEG-4.3       CV_FOURCC(‘D’, ‘I’, ‘V’, ‘3’)
MPEG-4         CV_FOURCC(‘D’, ‘I’, ‘V’, ‘X’)
H263             CV_FOURCC(‘U’, ‘2’, ‘6’, ‘3’)
H263I            CV_FOURCC(‘I’, ‘2’, ‘6’, ‘3’)
FLV1              CV_FOURCC(‘F’, ‘L’, ‘V’, ‘1’)

#include <iostream>
#include <filesystem>
#include <string>
#include <windows.h>
#include <opencv2/opencv.hpp>

namespace fs = std::filesystem;
using namespace cv;
using namespace std;

// 保存视频
void test_video_save()
{
    VideoCapture capture(0); // 创建VideoCapture类
    int frame_width = capture.get(CAP_PROP_FRAME_WIDTH); // 获取摄像头的宽、高
    int frame_height = capture.get(CAP_PROP_FRAME_HEIGHT);

    VideoWriter writer;	// 创建VideoWriter类
    int fourcc = writer.fourcc('D', 'I', 'V', 'X');	// 定义编码格式

    // 保存视频
    /*
    filename,		// 文件路径。
    fourcc,			// 四个字符用来表示压缩帧的codec。
    fps,			// 被创建视频流的帧率。
    frameSize,		// 视频流的大小。
    isColor = true	// True则每一帧为彩色图,否则为灰度图。
    */
    writer.open("D:/opencv/console/x64/Debug/test.mp4", fourcc, 30, Size(frame_width, frame_height), true);

    Mat frame; // 定义Mat对象用于存储每一帧数据
    while (capture.isOpened()) {
        capture.read(frame); // 逐帧读取视频
        /*
        src 原图像。
        dst 翻转后的图像。

        flipCode == 0垂直翻转(沿X轴翻转)。
        flipCode > 0水平翻转(沿Y轴翻转)。
        flipCode < 0水平垂直翻转(先沿X轴翻转,再沿Y轴翻转,等价于旋转180°)。
        */
        flip(frame, frame, 1); // 将读取的视频左右反转

        // 如果视频结束或未检测到摄像头则跳出循环
        if (frame.empty()) {
            break;
        }

        writer.write(frame);
        imshow("Video", frame);	// 每次循环显示一帧图像
        char k = waitKey(33);	// 两帧读取的间隔时间 1s/30fps=33ms

        // 按下q键退出循环
        if (k == 'q') {
            break;
        }
    }
    capture.release(); // 释放视频
    writer.release();
}

int main()
{
    // 保存视频
    test_video_save();

    waitKey(0);
    destroyAllWindows();
    return 0;
}

三、读取视频

#include <iostream>
#include <filesystem>
#include <string>
#include <windows.h>
#include <opencv2/opencv.hpp>

namespace fs = std::filesystem;
using namespace cv;
using namespace std;

// 读取视频
void test_play()
{
    // 读取视频
    VideoCapture capture("D:/opencv/console/x64/Debug/test.mp4");
    while (true)
    {
        Mat frame;
        capture >> frame;

        // 判断当前帧是否为空
        if (frame.empty())
        {
            break;
        }

        imshow("读取视频", frame);
        waitKey(30); // 延时30ms
    }

}

int main()
{
    // 读取视频
    test_play();

    waitKey(0);
    destroyAllWindows();
    return 0;
}

 

发表回复

您的电子邮箱地址不会被公开。