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

基于 C++ OpenCV 生成小视频

制作个人小视频

一、实验内容和要求

基于 OpenCV 生成小视频,制作有浙大元素的图片和个人信息的片头,自己设计情节,其中要缓慢地画一张画面,最后自己设计一个片尾。

做了一个火柴人初见了 OpenCV,尝试了一下,发现非常神奇,大受震撼,最后开心地跑走了的视频。

二、实验器材

C++ OpenCV 4.5.0

开发平台:Visual Studio 2019 Debug x64

三、具体实现

3.1 基本图片与视频的读入

将一些图片和视频作为素材准备好,通过 C++的 fstream 库中定义的 finddata_t 结构来获取文件结构,findfirst 函数来检索指定目录下的文件,并通过文件的扩展名来获取文档,存入 vector 中。

对应的函数如下:

图片可以通过 OpenCV 的接口读入并按帧写入视频中。写视频采用的是 cv::VideoWriter 类,可以通过流的形式将 Mat(帧)写入视频文件中。

读取视频采用了 cv::VideoCapture 类,通过流的形式逐帧读入,进行 resize 以后再用 writer 逐帧写入。

3.2 绘图:绘制 OpenCV logo 和火柴人

逐帧绘制的部分调用了 OpenCV 自带的一些几何体绘制函数,下面以OpenCV 的 logo 绘制为例进行说明。

下面代码是一个红色部分的绘制。调用 ellipse 函数来画椭圆,参数说明如下:

void ellipse(InputOutputArray img, Point center, Size axes, double angle, double startAngle, double endAngle,  const Scalar& color, int thickness = 1,   int lineType = LINE_8, int shift = 0);

ellipse 函数将椭圆画到图像 img 上,椭圆中心为点 center,并且大小位于矩形 axes 内,椭圆旋转角度为 angle, 扩展的弧度从 0 度到 360 度,图形颜色为 Scalar(x, y,z),线宽 (thickness)为 1,线型(lineType)为 8 (8 联通线型)。当线性设为-1 的时候为全填充。

为了达到逐渐绘制的效果,在扩展弧度的部分采用 fps 控制,在帧内逐帧绘制。

效果如下:

另一个简笔画是火柴人,效果如下:

3.3 转场效果

编程实现了两种转场效果,一个是从模糊到清晰的过渡,一个是从右到左的进入。

模糊过渡调用 OpenCV 的 GaussianBlur 函数,根据 fps 控制逐帧从边缘到内部进行高斯模糊。

效果如下:

平移转场效果先设置一张空的图片,然后一列一列地将目标图片的像素复制到空图片的右侧,通过时间控制帧的写入。

效果如下:

3.4 播放与键盘控制

视频的播放采用 VideoCapture 类进行读入,逐帧用 imshow 函数进行输出。

调用 OpenCV 的 waitKey 函数来判断键盘交互。

四、实验结果与分析

实验结果请参见生成视频 output.mp4。其中一些重点的实现在上一部分也有讲述。

此处为语雀视频卡片,点击链接查看:output.mp4

但是在实验的过程中出现了一个现象:程序读取图片、视频和绘制的速度非常慢,整个一分多钟的小视频画完需要 45 秒左右。这一点后面还会再考虑是什么问题。(我认为可能是读取视频并解析的速度比较慢,因为不仅要逐帧读入、调整大小,还要逐帧写出)

五、实验体会与心得

通过这次实验,又捡回了对于 C++的编程,感觉自己的代码变得规范点了(之前老写 python,写的有点乱)。之前我经常使用 Python 语言的 cv2 库,但是都是在做一些检测之类的 demo。这次实验熟悉了 OpenCV 的基本函数,掌握了对图像和视频的读写,还没有探索更多炫酷的 OpenCV 制作动画效果,因为 OpenCV 主要的用途还是在于辅助功能,而不是视频编辑功能。

在实验的过程中遇到了一个小问题就是“逐渐”绘制的过程,最后为了达到效果,查阅了一些资料,想到了用 for 循环结合 fps 来控制。最后达到了预期的效果。

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

相关文章:

  • 个人网站审批网站防止采集
  • 5.6 Multiple region interfaces
  • 聊聊缓存测试用例设计方案
  • IU5516T低功耗,1M@2.0A降压稳压器
  • Arbess从初级到进阶(3) - 使用Arbess+GitLab+SonarQube搭建Java项目自动化部署
  • 外贸的网站有哪些网站开发心得体会
  • Spring Boot参数校验全流程解析
  • C++进阶:(十)深度解析哈希表:原理、实现与实战
  • 6.3 代码自动生成Agent:程序员的AI副驾驶
  • 最好的网站开发系统网站设计介绍怎么写
  • 如何丰富网站内容在本地搭建wordpress
  • MySQL: 存储引擎深度解析:Memory与Federated的特性与应用场景
  • Java+Leaflet:湖南省道路长度WebGIS的构建与实践
  • 大模型强化学习GRPO-1
  • 网站建设与管理基础带端口的服务器怎么做网站
  • 金融/医疗/教育的第三方软件检测有哪些特别关注点?
  • 文本处理工具:grep、awk、sed 的高级文本分析与处理
  • 【图像处理基石】什么是光流法?
  • Spring事务隔离级别全解析:从读未提交到序列化
  • PostIn从初级到进阶(4) - 如何使用Mock数据尽早满足前后端接口开发需求
  • 建设机械官方网站门源网站建设公司
  • 用 Doris 托底实时明细与聚合Flink CDC Pipeline 的 Doris Sink 实战
  • FLINK CDC 的学习
  • AI音乐生成 | 音乐流派分类的原理和python实现
  • WSL下将Ubuntu从C盘迁移到D盘(个人记录、详细图解)
  • LRU缓存淘汰算法详解与C++实现
  • AbMole小讲堂丨Cyclophosphamide(环磷酰胺):应用于肿瘤与免疫研究的热门烷化工具
  • 网站建设费用如何收取什么叫网站开发应用框架
  • 怎么在.Net中做团购网站专门做钻石国外网站
  • 教程上新丨Deepseek-OCR 以极少视觉 token 数在端到端模型中实现 SOTA