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;
}
相关推荐
JoannaJuanCV3 分钟前
自动驾驶—CARLA仿真(19)automatic_control demo
人工智能·机器学习·自动驾驶
热爱生活的五柒6 分钟前
PolSAR Image Registration——极化合成孔径雷达(PolSAR)图像配准
人工智能·计算机视觉·sar
qq_233772717 分钟前
**给复杂机器“装上行车记录仪”:一篇量子论文如何照亮AI时代的信任之路**
人工智能
美林数据Tempodata7 分钟前
案例分享|西安财经大学打造全覆盖、全链条人工智能通识教育培养体系
人工智能
O561 6O623O7 安徽正华露11 分钟前
露,生物信号采集处理系统一体机 生物机能实验系统 生物信号采集处理系统 生理机能实验
人工智能
AI营销快线14 分钟前
原圈科技如何引领AI营销内容生产升级:行业进化路线与闭环创新洞察
人工智能
AI营销先锋17 分钟前
2025 AI市场舆情分析行业报告:原圈科技如何帮助企业穿越迷雾,寻找增长北极星
大数据·人工智能
找方案21 分钟前
hello-agents 学习笔记:智能体发展史 —— 从符号逻辑到 AI 协作的进化之旅
人工智能·笔记·学习·智能体·hello-agents
skywalk816323 分钟前
Auto-Coder用Qwen3-Coder-30B-A3B-Instruct模型写一个学习汉字的项目
人工智能·学习·auto-coder
Alluxio37 分钟前
Alluxio正式登陆Oracle云市场,为AI工作负载提供TB级吞吐量与亚毫秒级延迟
人工智能·分布式·机器学习·缓存·ai·oracle