C++ opencv 读取视频、保存视频 示例

读取视频:

终端输入mp4视频文件的路径

#include 
#include 

int main(int argc, char **argv)
{   
    // 读取视频:创建一个 videoCapture 对象,参数为视频路径
    cv::VideoCapture capture(argv[1]);
    // 判断视频是否读取成功,返回True代表成功
    if (!capture.isOpened())
    {
        std::cout << "无法读取视频:" << argv[1] << std::endl;
        return 1;
    }
    // 读取视频帧,使用Mat类型的frame存储返回的帧
    cv::Mat frame;
    // 循环读取视频帧
    while (true)
    {
        // 读取视频帧,使用 >> 运算符 或者 reda() 函数, 他的参数是返回的帧
        capture.read(frame);
        // capture >> frame

        // 判断是否读取成功
        if (frame.empty())
        {
            std::cout << "文件读取完毕" << std::endl;
            break;
        }

        // 显示视频帧
        cv::imshow("gray frame", frame);  // 正常

        // 等待按键 延迟30ms 否则播放太快
        int k = cv::waitKey(30);
        // 按下ESC键退出
        if (k == 27)
        {
            std:: cout << "退出" << std::endl;
            break;
        }
    }
    return 0;
}

保存处理后的视频

重点注意:

// 读取视频:创建了一个VideoCapture对象,参数为摄像头编号
cv::VideoCapture capture(0);

// 写入MP4文件,参数分别是:文件名,编码格式,帧率,帧大小  
cv::VideoWriter writer("record.mp4", cv::VideoWriter::fourcc('H', '2', '6', '4'), 20, cv::Size(640, 480));

// 写入视频
writer.write(frame);

示例演示:

// 导入opencv 库
#include 
#include 

int main(int argc, char **argv)
{
    // 读取视频:创建了一个VideoCapture对象,参数为摄像头编号
    cv::VideoCapture capture(0);
    // 设置指定摄像头的分辨率
    int width = 640;
    int height = 480;

    // 设置摄像头宽度和高度
    capture.set(cv::CAP_PROP_FRAME_WIDTH, width);
    capture.set(cv::CAP_PROP_FRAME_HEIGHT, height);

    // 判断视频是否读取成功,返回true表示成功
    if (!capture.isOpened())
    {
        // std::cout << "无法打开摄像头: " << FLAGS_camera << std::endl;
        std::cout << "无法打开摄像头: " << 0 << std::endl;
        return 1;
    }
    // 读取视频帧,使用Mat类型的frame存储返回的帧
    cv::Mat frame;
    // 写入MP4文件,参数分别是:文件名,编码格式,帧率,帧大小
    cv::VideoWriter writer("./record.mp4", cv::VideoWriter::fourcc('H', '2', '6', '4'), 20, cv::Size(width, height));

    // 循环读取视频帧
    while (true)
    {
        // 读取视频帧,使用 >> 运算符或者read()函数,他的参数是返回的帧
        capture.read(frame);
        // capture >> frame;
        // flip
        cv::flip(frame, frame, 1);
        // 显示视频帧
        cv::imshow("opencv demo", frame);
        // 写入视频
        writer.write(frame);
        // 等待按键,延迟30ms,否则视频播放太快
        int k = cv::waitKey(30);
        // 按下ESC键退出
        if (k == 27)
        {
            std::cout << "退出" << std::endl;
            break;
        }
    }

    return 0;
}

使用gflags命令行工具

// 导入opencv 库
#include 
#include 
// 导入gflags 库
#include 
// 定义命令行参数
DEFINE_int32(camera, 0, "Input camera"); // 摄像头编号

int main(int argc, char **argv)
{
    // 解析命令行参数
    gflags::ParseCommandLineFlags(&argc, &argv, true);
    // 读取视频:创建了一个VideoCapture对象,参数为摄像头编号
    cv::VideoCapture capture(FLAGS_camera);
    // 设置指定摄像头的分辨率
    int width = 640;
    int height = 480;

    // 设置摄像头宽度和高度
    capture.set(cv::CAP_PROP_FRAME_WIDTH, width);
    capture.set(cv::CAP_PROP_FRAME_HEIGHT, height);

    // 判断视频是否读取成功,返回true表示成功
    if (!capture.isOpened())
    {
        std::cout << "无法打开摄像头: " << FLAGS_camera << std::endl;
        return 1;
    }
    // 读取视频帧,使用Mat类型的frame存储返回的帧
    cv::Mat frame;
    // 写入MP4文件,参数分别是:文件名,编码格式,帧率,帧大小
    cv::VideoWriter writer("./record.mp4", cv::VideoWriter::fourcc('H', '2', '6', '4'), 20, cv::Size(width, height));

    // 循环读取视频帧
    while (true)
    {
        // 读取视频帧,使用 >> 运算符或者read()函数,他的参数是返回的帧
        capture.read(frame);
        // capture >> frame;
        // flip
        cv::flip(frame, frame, 1);
        // 显示视频帧
        cv::imshow("opencv demo", frame);
        // 写入视频
        writer.write(frame);
        // 等待按键,延迟30ms,否则视频播放太快
        int k = cv::waitKey(30);
        // 按下ESC键退出
        if (k == 27)
        {
            std::cout << "退出" << std::endl;
            break;
        }
    }

    return 0;
}

你可能感兴趣的:(C++,opencv,学习笔记,opencv,c++,音视频)