Ubuntu系统VScode实现opencv(c++)视频的处理与保存

通过OpenCV等计算机视觉工具,开发者可以像处理静态图像一样对视频流逐帧分析:从简单的裁剪、旋转、色彩校正,到复杂的稳像、目标跟踪、超分辨率重建。而如何将处理后的高帧率、高动态范围数据高效压缩并封装为通用格式(如MP4、AVI),则决定了成果能否跨越设备与平台无缝传播。

到这里,我们已经学会了如何调用摄像头以及播放视频,接下来是视频的属性及处理后如何保存。

对于视频来说,其实就是每一帧的图片,那么视频也是有宽和高的,还有视频的帧率以及这个视频总共有多少帧图片。

1.宽高

复制代码
    int frame_width = capture.get(CAP_PROP_FRAME_WIDTH);
    int frame_height = capture.get(CAP_PROP_FRAME_HEIGHT);

当然,我们也可以通过set设置我们想要的宽高,但是必须是硬件支持对应的宽高比;

复制代码
    int frame_width = capture.set(CAP_PROP_FRAME_WIDTH);
    int frame_height = capture.set(CAP_PROP_FRAME_HEIGHT);

2.总共帧率

这段代码就是获取这个导入视频的总共帧率。 如果调用摄像头理论就是-1。

复制代码
int count = capture.get(CAP_PROP_FRAME_COUNT);

3.实时帧率

这段代码就是获取视频的实时帧率。

复制代码
int fps = capture.get(CAP_PROP_FPS);

那么整体代码如下:这里我打印了相关信息,以便验证

复制代码
void Demo::video_Demo(Mat &image)
{
    VideoCapture capture(0);
    int frame_width = capture.get(CAP_PROP_FRAME_WIDTH);
    int frame_height = capture.get(CAP_PROP_FRAME_HEIGHT);
    int fps = capture.get(CAP_PROP_FPS);
    int count = capture.get(CAP_PROP_FRAME_COUNT);
    cout<<"frame_width:"<<frame_width<<endl;
    cout<<"frame_height:"<<frame_height<<endl;
    cout<<"fps:"<<fps<<endl;//每秒多少怎帧
    cout<<"count:"<<count<<endl;//总共有多少帧

    Mat frame;
    while (1)
    {
        capture.read(frame);
        if (frame.empty())break;
        // Do something
        flip(frame,frame,1);
        colorspace_Demo(frame);
        int c = waitKey(10);
        if (c == 27){
            capture.release();//释放摄像头
            break; 
        }
    }
}

运行结果:当我们调用摄像头,总帧率count给的就是-1,而导入视频时,就会给出确切的视频总帧率。

视频保存

首先我们需要实例化一个保存的类VideoWriter

复制代码
VideoWriter save("/home/xlh/c++code/2.MP4",VideoWriter::fourcc('a','v','c','1'),
fps,Size(frame_width,frame_height),true);

第一个参数是保存的路径,第二个参数是视频的编码方式,第三个是视频的实时帧率,第四个是视频的宽高比。

紧接着我们只需要在每一帧处理后的代码加上一个方法调用就可以保存视频了。

复制代码
void Demo::video_Demo(Mat &image)
{
    VideoCapture capture("/home/xlh/c++code/1.webm");
    int frame_width = capture.get(CAP_PROP_FRAME_WIDTH);
    int frame_height = capture.get(CAP_PROP_FRAME_HEIGHT);
    int fps = capture.get(CAP_PROP_FPS);
    int count = capture.get(CAP_PROP_FRAME_COUNT);
    cout<<"frame_width:"<<frame_width<<endl;
    cout<<"frame_height:"<<frame_height<<endl;
    cout<<"fps:"<<fps<<endl;//每秒多少怎针
    cout<<"count:"<<count<<endl;//总共有多少针
    VideoWriter save("/home/xlh/c++code/2.MP4",VideoWriter::fourcc('a','v','c','1'),fps,Size(frame_width,frame_height));

    Mat frame;
    while (1)
    {
        capture.read(frame);
        if (frame.empty())break;
        // Do something

        flip(frame,frame,1);
        colorspace_Demo(frame);
        save.write(frame);//视频保存
        int c = waitKey(10);
        if (c == 27){
            capture.release();//释放摄像头
            save.release();
            break; 
        }
    }
}

这里后改动的地方是 save.write(frame);以及save.release();我们保存完成后就要释放这个资源。

这样就完成保存了。

这里我运行后已经保存了我的视频为2.MP4。

相关推荐
Forerror2026几秒前
MAI Gateway能力解析:API网关能做什么?AI网关核心功能详解
人工智能·api网关·maigateway·企业ai网关·企业级大模型治理网关
武子康1 分钟前
RoboLab 解读:机器人策略评测为什么不能只看二元成功率
人工智能·llm·agent
天空之城--4 分钟前
C++ ODR-use 深度解析:从原理到实战
c++
在线考试系统推荐4 分钟前
拆成多道小题,优考试“理解题“怎么用?
服务器·人工智能·学习
Elastic 中国社区官方博客6 分钟前
机构如何统一智慧城市数据以改善公共服务?
大数据·人工智能·物联网·elasticsearch·搜索引擎·全文检索·智慧城市
小白学大数据6 分钟前
API 调用错误处理实战:分层定位、有纪律地重试与可观测性设计
开发语言·网络·人工智能
Raas1007 分钟前
MAI Gateway(魔芋企业级AI网关)详解:企业为什么需要AI网关,一文读懂企业AI流量治理
大数据·人工智能·gateway·api·ai网关·mai gateway
yangdaxiageo9 分钟前
白帽GEO的结构化信任工程:杨大侠GEO商业方法论研讨
人工智能·科技·aigc·agi
Swift社区9 分钟前
Wi-Fi 6 的核心技术特性
人工智能·python
人才瘾大10 分钟前
从Agent Loop到PlanMode:一套能跑生产的AI Agent工程骨架
人工智能·ai编程