当前位置: 首页 > news >正文

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 somethingflip(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 somethingflip(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。

 

http://www.dtcms.com/a/313429.html

相关文章:

  • [硬件电路-129]:模拟电路 - 继电器的工作原理、关键指标、常用芯片与管脚定义
  • SpringAI的使用
  • Socket编程——TCP协议
  • 从一到无穷大 #51:突破阿姆达尔定律:COZ因果剖析与串行优化八法
  • Java学习第一百零一部分——网关(Gateway)
  • java测试题(ssm框架)
  • 02.Redis 安装
  • MPLS 静态LSP
  • TV电视版软件集合分享
  • 深入理解Java并发编程:原理、实战与最佳实践
  • Redis 7 中的 Set 和 Zset 使用
  • 基于transformer的目标检测——匈牙利匹配算法
  • 深入解析HashMap:原理与性能优化
  • Vim编辑器详解:从入门到高效使用
  • 从零开始的CAD|CAE开发: LBM源码实现分享
  • 编程语言分类
  • JAVAEE--5.多线程之常见的锁策略
  • AI Competitor Intelligence Agent Team
  • 【openlayers框架学习】七:绘制线要素以及点击画线功能
  • 力扣热题100----------141.环形链表
  • 基于BiLSTM+CRF实现NER
  • 【机器人】VLN-R1 微调 | 增强训练 | 连续导航
  • Web3合约ABI,合约地址生成部署调用及创建,连接钱包,基础交易流程
  • ARPO:让LLM智能体更高效探索
  • 【Linux网络编程基础--socket地址API】
  • 多 4G 通讯模组共存时的干扰问题深度解析与解决方案
  • leecode-每日一题-2106. 摘水果
  • vmfusion启动centos6.10 一直卡到call 169.254.169.254
  • 全面解析 BGE Embedding 模型:训练方式、模型系列与实战用法
  • Redis——常用指令汇总指南(三)(哈希类型)