OpenCV 视频处理与保存

一、知识点
1、VideoCapture类

(1)、用于从视频文件、摄像机或图像序列中捕获视频帧。

(2)、构造函数 VideoCapture(const String & filename, int apiPreference = CAP_ANY)

a、filename可以是视频文件的名称(例如"video.avi"),可以是图像序列(例如"img%02.jpg", 它将读取"img00.jpg"、"img01.jpg"、"img02.jpg"等),还可以是URL。

b、apiPreference是实际执行捕获的API后端,VideoCaptureAPIs枚举值,如: CAP_ANY、CAP_FFMPEG、CAP_IMAGES等。

(3)、构造函数 VideoCapture(int index, int apiPreference = CAP_ANY)

a、打开摄像头进行视频拍摄。

b、index是视频捕获设备的索引,默认摄像头传递0。

c、apiPreference是实际执行捕获的API后端,VideoCaptureAPIs枚举值,如: CAP_ANY、CAP_FFMPEG、CAP_IMAGES等。

(4)、成员函数 virtual bool read(OutputArray image)

a、抓取、解码并返回一个视频帧。

b、image为返回的视频帧。 如果没有抓取任何帧,则图像为空,返回false。

(5)、成员函数 virtual void release();

a、关闭视频文件或捕获设备。

(6)、成员函数 double get(int propId) const;

a、用于检索视频流的各种属性值。

b、propId是VideoCaptureProperties枚举值。

c、VideoCaptureProperties的具体值如:

CAP_PROP_FRAME_WIDTH=3,//视频流中帧的宽度

CAP_PROP_FRAME_HEIGHT=4,//视频流中帧的高度

CAP_PROP_FPS=5,//帧率

CAP_PROP_FOURCC=6,//4个字符的编解码器代码

CAP_PROP_FRAME_COUNT=7,//视频文件中的帧数

2、视频分辨率

(1)、P,Progressive,逐行扫描,即视频纵向的像素行数。

如720P,分辨率为1280 * 720像素。

如1080P,分辨率为1920 * 1080像素。

(2)、K,视频横向的像素列数。

如2K,分辨率为2560 * 1440像素。

如4K,分辨率为3840 * 2160 或 4096 * 2160像素。

如8K,分辨率为7680 * 4320像素。

(3)、MP,百万像素,即像素行数和列数相乘后的结果。

如2MP,是1920 * 1080 = 2073600像素,约等于2MP。

(4)、超高清(Ultra HD),4K分辨率,3840 * 2160。

全高清(Full HD),1080P分辨率,1920 * 1080。

高清(HD),720P分辨率,1280 * 720。

标清(SD),480P分辨率,720 * 480。

3、视频码率

(1)、码率指视频在单位时间内传输或处理的数据量,单位通常是比特每秒(bps)、千比特每秒(Kbps)、兆比特每秒(Mbps)。

(2)、它是影响视频质量和文件大小的核心参数。

(3)、码率的本质是视频数据压缩程度的体现,在视频编码过程中,编码器通过算法将原始图像信息压缩为更小的数据流。

(4)、码率越高,压缩程度越低,图像细节保留越多,文件体积越大; 反之,低码率会牺牲画质但节省存储空间和带宽。

4、视频帧速率

(1)、视频帧速率,简称FPS,代表视频每秒内显示的图像帧数。

(2)、帧速率越高,画面越流畅,但也需要更多的数据量来存储和传输。

5、视频分辨率、码率、帧速率关系:

(1)、相同分辨率和帧速率下,码率越高,视频画面质量越出色。

(2)、相同的分辨率和码率下,合理范围内,帧速率越高,视频画面流畅度越好。(超出合理范围容易出现卡顿)

(3)、相同的帧速率和码率下,合理范围内,分辨率越高,视频画面清晰度越高。(超出合理范围容易出现噪点和模糊)

6、VideoWriter类

(1)、用于编写视频文件或图像序列。

(2)、构造函数 VideoWriter(const String & filename, int fourcc, double fps, Size frameSize, bool isColor = true)

filename: 输出视频文件的名称。

fourcc: 压缩帧的编解码器。

fps: 输出视频流的帧率。

frameSize: 视频帧的大小。

isColor: true编码器期望编码彩色帧,false使用灰度帧。

(3)、成员函数 virtual void write(InputArray image)

a、将指定的图像写入视频文件。

b、image表示要写入的图像,一般彩色图像采用BGR格式,大小和构造时指定的frameSize一样。

(4)、virtual void release()

a、释放资源。

7、注意:

(1)、OpenCV不处理音频。

(2)、OpenCV处理视频有大小限制,理论上不要超过2G。

二、示例代码

cpp 复制代码
#include <iostream>
#include <opencv2/opencv.hpp>


int main()
{
    cv::VideoCapture capture("../images/video.mp4");
    
    double frame_width = capture.get(cv::CAP_PROP_FRAME_WIDTH);
    double frame_height = capture.get(cv::CAP_PROP_FRAME_HEIGHT);
    double count = capture.get(cv::CAP_PROP_FRAME_COUNT);
    double fps = capture.get(cv::CAP_PROP_FPS);
    std::cout << "frame_width = " << frame_width << std::endl;
    std::cout << "frame_height = " << frame_height << std::endl;
    std::cout << "count = " << count << std::endl;
    std::cout << "fps = " << fps << std::endl;

    cv::VideoWriter writer("C:/Users/ml/Desktop/new_video.mp4", capture.get(cv::CAP_PROP_FOURCC), fps, cv::Size(frame_width, frame_height), true);

    cv::Mat frame;
    while (true)
    {
        capture.read(frame);
        if (frame.empty())
        {
            break;
        }

        cv::imshow("视频演示", frame);

        writer.write(frame);

        //此处时间影响"视频演示"窗口的图片流显示快慢
        int c = cv::waitKey(33);
        if (c == 27)
        {
            break;
        }
    }
    
    capture.release();
    writer.release();
    
    return 0;
}
相关推荐
achene_ql4 分钟前
OpenCV C++ 图像处理教程:灰度变换与直方图分析
c++·图像处理·人工智能·opencv·计算机视觉
mortimer33 分钟前
当PySide6遇上ModelScope:一场关于 paraformer-zh is not registered 的调试旅程
人工智能·github·阿里巴巴
Baihai IDP37 分钟前
深度解析 Cursor(逐行解析系统提示词、分享高效制定 Cursor Rules 的技巧...)
人工智能·ai编程·cursor·genai·智能体·llms
神经星星41 分钟前
MIT 团队利用大模型筛选 25 类水泥熟料替代材料,相当于减排 12 亿吨温室气体
人工智能·深度学习·机器学习
Jamence1 小时前
多模态大语言模型arxiv论文略读(125)
论文阅读·人工智能·语言模型·自然语言处理·论文笔记
AI浩1 小时前
TradingAgents:基于多智能体的大型语言模型(LLM)金融交易框架
人工智能·语言模型·自然语言处理
澳鹏Appen1 小时前
对抗性提示:进阶守护大语言模型
人工智能·语言模型·自然语言处理
源图客2 小时前
大语言模型指令集全解析
人工智能·语言模型·自然语言处理
wenzhangli72 小时前
筑牢安全防线:电子文件元数据驱动的 AI 知识库可控管理方案
大数据·人工智能
北京地铁1号线2 小时前
OCRBench:评估多模态大模型的OCR能力
人工智能