> # ♻️ 资源
> **大小:** 9.71MB
> **文档链接:**[**https://www.yuque.com/sxbn/ks/100010476**](https://www.yuque.com/sxbn/ks/100010476)
> **➡️ 资源下载:**[**https://download.csdn.net/download/s1t16/87390874**](https://download.csdn.net/download/s1t16/87390874)
> **注:更多内容可关注微信公众号【神仙别闹】,如当前文章或代码侵犯了您的权益,请私信作者删除!**
> ![qrcode_for_gh_d52056803b9a_344.jpg](https://cdn.nlark.com/yuque/0/2023/jpeg/2469055/1692147256036-49ec7e0c-5434-4963-b805-47e7295c9cbc.jpeg#averageHue=%23a3a3a3&clientId=u8fb96484-770e-4&from=paste&height=140&id=u237e511a&originHeight=344&originWidth=344&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=8270&status=done&style=none&taskId=ud96bf5f7-fe85-4848-b9c2-82251181297&title=&width=140.1999969482422)
# 制作个人小视频
# 一、实验内容和要求
基于 OpenCV 生成小视频,制作有浙大元素的图片和个人信息的片头,自己设计情节,其中要缓慢地画一张画面,最后自己设计一个片尾。
做了一个火柴人初见了 OpenCV,尝试了一下,发现非常神奇,大受震撼,最后开心地跑走了的视频。
# 二、实验器材
C++ OpenCV 4.5.0
开发平台:Visual Studio 2019 Debug x64
# 三、具体实现
## 3.1 基本图片与视频的读入
将一些图片和视频作为素材准备好,通过 C++的 fstream 库中定义的 _ finddata_t 结构来获取文件结构,_findfirst 函数来检索指定目录下的文件,并通过文件的扩展名来获取文档,存入 vector 中。
对应的函数如下:
![334d568bcee39f632894fe196bed55c3.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1711937799201-ab6f9b2b-2824-480b-baf7-66636e4ee248.png#averageHue=%23fdfcfc&clientId=ube0b720a-9000-4&from=paste&height=562&id=u7954a862&originHeight=702&originWidth=1090&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=112572&status=done&style=none&taskId=ufde43d16-b739-4a3f-9a67-b1029c08a2d&title=&width=872)
图片可以通过 OpenCV 的接口读入并按帧写入视频中。写视频采用的是 cv::VideoWriter 类,可以通过流的形式将 Mat(帧)写入视频文件中。
![3ad34119620598d4736d5889826c592f.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1711937811334-7ed925e7-1c47-4a15-a278-4bb319e3c892.png#averageHue=%23f2f0ea&clientId=ube0b720a-9000-4&from=paste&height=125&id=u5e2f890f&originHeight=156&originWidth=482&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=18616&status=done&style=none&taskId=ub803c06a-cb66-4105-a791-afce21489df&title=&width=385.6)
读取视频采用了 cv::VideoCapture 类,通过流的形式逐帧读入,进行 resize 以后再用 writer 逐帧写入。
![fc456dfc77c0b34c68f190ae4b883a67.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1711937823484-ca56c0e1-5105-4d7a-9d9e-55bb4f9dc8e5.png#averageHue=%23f0eee8&clientId=ube0b720a-9000-4&from=paste&height=226&id=u1a43fe2d&originHeight=283&originWidth=479&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=24838&status=done&style=none&taskId=u95088498-5dc5-4d93-829c-d90c11312ea&title=&width=383.2)
## 3.2 绘图:绘制 OpenCV logo 和火柴人
逐帧绘制的部分调用了 OpenCV 自带的一些几何体绘制函数,下面以OpenCV 的 logo 绘制为例进行说明。
下面代码是一个红色部分的绘制。调用 ellipse 函数来画椭圆,参数说明如下:
```c
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 控制,在帧内逐帧绘制。
![515d40f70c2fd96f6d8ec2b9c64a7b74.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1711937844287-74696c90-154f-425a-b658-2bc456d1d25b.png#averageHue=%23efede7&clientId=ube0b720a-9000-4&from=paste&height=123&id=u1b266e0d&originHeight=154&originWidth=1088&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=28797&status=done&style=none&taskId=ue383e7b4-be61-41de-a77a-4dbdfd6f8ab&title=&width=870.4)
效果如下:
![0a4d5a3509d0f84a72e7a436992ca654.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1711937856137-67d9ed21-8533-4425-8fb0-6a837aa7f7a7.png#averageHue=%23140402&clientId=ube0b720a-9000-4&from=paste&height=640&id=ua018963d&originHeight=800&originWidth=1052&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=43300&status=done&style=none&taskId=uba8dfada-9699-42a8-a058-976052244f2&title=&width=841.6)
另一个简笔画是火柴人,效果如下:
![125a714be166b1cdc4783b6ef1a53bf4.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1711937869089-af4a01e4-62ef-4e84-9ab3-5187b705e07d.png#averageHue=%23f7f9f6&clientId=ube0b720a-9000-4&from=paste&height=670&id=ud9f78bef&originHeight=838&originWidth=1029&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=35601&status=done&style=none&taskId=u52cb4671-4ee7-4829-86d7-76b02b9bfbe&title=&width=823.2)
## 3.3 转场效果
编程实现了两种转场效果,一个是从模糊到清晰的过渡,一个是从右到左的进入。
模糊过渡调用 OpenCV 的 GaussianBlur 函数,根据 fps 控制逐帧从边缘到内部进行高斯模糊。
![586d90a4daae64a88fa249139882d95f.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1711937885003-c7cdf30b-8015-44c2-b423-4a0ecd5048f5.png#averageHue=%23fdfdfc&clientId=ube0b720a-9000-4&from=paste&height=203&id=u4d8aa612&originHeight=254&originWidth=676&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=26470&status=done&style=none&taskId=u96f3fabe-c2da-4f12-b7d2-a09ecea8c84&title=&width=540.8)
效果如下:
![5f5f46acf62305f0d7b9ea12641fca7a.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1711937910046-8d9d604c-32b2-427a-abbc-afc0d04efa0a.png#averageHue=%23fafdfa&clientId=ube0b720a-9000-4&from=paste&height=319&id=u7f7300b7&originHeight=399&originWidth=594&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=54066&status=done&style=none&taskId=u09a7abdb-9bde-4410-bf55-f0b092a0961&title=&width=475.2)![b8c4eaf96798350fca6f3eb564dd68f7.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1711937910057-6de722f4-bb08-4463-ae75-525cb009e9ae.png#averageHue=%23f4fbf9&clientId=ube0b720a-9000-4&from=paste&height=299&id=ud5574456&originHeight=374&originWidth=567&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=36368&status=done&style=none&taskId=ue77b4309-1459-4bea-817d-b4933874121&title=&width=453.6)![da5cf2ee07d78d4d52ebb59520d3f5ec.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1711937910058-59b45a26-8804-44c2-946c-b8b60f98abdd.png#averageHue=%23eef5f4&clientId=ube0b720a-9000-4&from=paste&height=306&id=u5008c298&originHeight=382&originWidth=574&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=30345&status=done&style=none&taskId=u9a32210d-37df-45d5-92a7-326a0b5aee2&title=&width=459.2)
平移转场效果先设置一张空的图片,然后一列一列地将目标图片的像素复制到空图片的右侧,通过时间控制帧的写入。
![e9f090cfe7d926e43cb933e50bc0d5c1.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1711937929881-7c8ac7db-758a-4f19-89d4-8b0afb96782c.png#averageHue=%23fdfcfc&clientId=ube0b720a-9000-4&from=paste&height=242&id=uf566ca0d&originHeight=303&originWidth=1013&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=49117&status=done&style=none&taskId=u0609a6e6-687f-40da-ac85-ced79728d68&title=&width=810.4)
效果如下:
![1c4e0af65ef5c5f3ecbcb076a98937bf.PNG](https://cdn.nlark.com/yuque/0/2024/png/2469055/1711937960388-ec8329d
神仙别闹
- 粉丝: 4164
- 资源: 7485
最新资源
- 基于S7-200 PLC和MCGS组态的水箱水位控制系统设计 组态王动画仿真,带PLC源代码,plc程序每一条都带着解释,组态王源代码,图纸,IO地址分配
- 猫狗识别 matlab代码.rar
- 模拟了一个QAM系统,生成格雷编码的QAM星座,并使用信号处理技术提取载波。matlab代码.rar
- 生成地震动反应谱的matlab函数,输入加速度时程,阻尼比,输出:1列:加速度反应谱,2列:速度反应谱,3列:位移反应谱 matlab代码.rar
- 设计了一个非线性模型预测控制器,以优化双电机电池电动汽车的扭矩分配simulink.rar
- 使用DH参数分析了6自由度UR-5e机器人的正向运动学,并使用牛顿-拉夫森法计算了椭圆轨迹的反向运动学MATLAB中代码.rar
- 实现了一个决策架构和一个自动驾驶汽车的控制律在Carla模拟器中附matlab代码.rar
- 使用Matlab实现卷积深度信念网络(CDBN)Matlab代码.rar
- 使用连续Hopfield网络解决旅行商问题 matlab代码.rar
- 使用STM32和轴编码器创建了闭环直流电机控制系统MATLAB设计和验证PID控制器的稳定性.rar
- 提供了一个MATLAB接口,可用于将MATLAB Production Server的发现服务的专有JSON格式转换为OpenAPI规范.rar
- 数值方法技术在金融中的应用。定量金融与Black-Scholes偏微分方程导论,matlab代码.rar
- 算例说明:上方平板具有z向速度,与静止下表面高度差h=sin(t)+2;其中间牛顿流体用雷诺方程建模,并通过有限差分法求解,包含1D和2D matlab代码.rar
- 湍流MC通道中空气传播特性的CFD方法,matlab代码.rar
- 图像集的视觉搜索 matlab代码.rar
- 通过B样条基函数设计基于知识的潜力用于天然蛋白质检测 matlab代码.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈