【Python高级编程】 综合练习-使用OpenCV 进行视频数据处理

综合练习

读取一个视频文件,对其进行处理后保存为一个新的视频文件。具体的处理步骤包括调整帧大小、转换为灰度图像、垂直翻转画面以及添加高斯噪声。
下面是代码的详细实现:

import cv2
import numpy as np# 定义一个函数,用来给图像添加高斯噪声
def add_gaussian_noise(image):# 获取图像的行和列row, col = image.shapemean = 0  # 高斯噪声的平均值sigma = 15  # 高斯噪声的标准差# 生成高斯噪声gauss = np.random.normal(mean, sigma, (row, col))# 将高斯噪声添加到原图像上noisy = image + gauss# 将结果限制在0到255之间,并转换为无符号8位整型noisy_img = np.clip(noisy, 0, 255)return noisy_img.astype(np.uint8)# 输入和输出视频文件名
input_video = 'resources/outdoor.mp4'
output_video = 'resources/output.mp4'# 打开输入视频
cap = cv2.VideoCapture(input_video)# 获取视频的帧率和帧大小
fps = int(cap.get(cv2.CAP_PROP_FPS))
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))# 计算新的帧大小(540p)
new_height = 540
new_width = int((new_height / frame_height) * frame_width)# 创建视频写入对象
fourcc = cv2.VideoWriter_fourcc(*'mp4v')  # 指定视频编码格式
out = cv2.VideoWriter(output_video, fourcc, fps, (new_width, new_height), isColor=False)while True:ret, frame = cap.read()  # 逐帧读取视频if not ret:break  # 如果没有读取到帧,则退出循环# 调整帧大小frame = cv2.resize(frame, (new_width, new_height))# 转换为灰度图像frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 垂直翻转画面frame = cv2.flip(frame, 1)# 添加高斯噪声frame = add_gaussian_noise(frame)# 写入输出视频out.write(frame)# 释放资源
cap.release()
out.release()
cv2.destroyAllWindows()

代码详细解释

  1. 导入必要的库

    import cv2
    import numpy as np
    
  2. 定义添加高斯噪声的函数

    def add_gaussian_noise(image):row, col = image.shapemean = 0sigma = 15gauss = np.random.normal(mean, sigma, (row, col))noisy = image + gaussnoisy_img = np.clip(noisy, 0, 255)return noisy_img.astype(np.uint8)
    
    • 该函数接收一个灰度图像,并向其添加高斯噪声。噪声的平均值为0,标准差为15。
  3. 设置输入和输出视频文件路径

    input_video = 'resources/outdoor.mp4'
    output_video = 'resources/output.mp4'
    
  4. 打开输入视频

    cap = cv2.VideoCapture(input_video)
    
  5. 获取视频的帧率和帧大小

    fps = int(cap.get(cv2.CAP_PROP_FPS))
    frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    
  6. 计算新的帧大小

    new_height = 540
    new_width = int((new_height / frame_height) * frame_width)
    
    • 将帧的高度调整为540像素,并按比例计算新的宽度。
  7. 创建视频写入对象

    fourcc = cv2.VideoWriter_fourcc(*'mp4v')
    out = cv2.VideoWriter(output_video, fourcc, fps, (new_width, new_height), isColor=False)
    
    • fourcc指定视频编码格式为MP4。
    • out对象用于将处理后的帧写入输出视频文件,isColor=False表示输出视频为灰度图像。
  8. 逐帧读取和处理视频

    while True:ret, frame = cap.read()if not ret:breakframe = cv2.resize(frame, (new_width, new_height))frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)frame = cv2.flip(frame, 1)frame = add_gaussian_noise(frame)out.write(frame)
    
    • 循环读取每一帧,直到视频结束。
    • 将帧调整为新的大小,并转换为灰度图像。
    • 对帧进行垂直翻转。
    • 添加高斯噪声。
    • 将处理后的帧写入输出视频。
  9. 释放资源

    cap.release()
    out.release()
    cv2.destroyAllWindows()
    
    • 释放视频捕捉和写入对象,关闭所有OpenCV窗口。

通过这些步骤,原始视频将被处理并保存为一个新的灰度视频,视频中的每一帧都被调整大小、翻转并添加了高斯噪声。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/31249.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Server-Sent Events (SSE),并获取message里面的内容

什么是Server-Sent Events (SSE)? Server-Sent Events (SSE)是一种服务器推送技术,允许服务器向客户端(浏览器)发送实时消息。与WebSocket不同,SSE是单向通信,只能从服务器到客户端。SSE在HTML5中作为标准实现&#…

windows系统停止更新办法

windows系统停止更新 双击启动下载的文件 然后再回到系统-更新这里,选择日期就行。

C语言之链表以及单链表的实现

一:链表的引入 1:从数组的缺陷说起 (1)数组有两个缺陷。一个是数组中所有元素类型必须一致,第二是数组的元素个数必须事先指定并且一旦指定后不能更改 (2)如何解决数组的两个缺陷:数…

c++ 正则匹配得使用

标头&#xff1a;#include <regex> 相关函数&#xff1a; regex_match regex_replace regex_search 名称描述regex_match测试正则表达式是否与整个目标字符串相完全匹配。regex_replace替换匹配正则表达式。regex_search搜索正则表达式匹配项。 1. regex_search 成功搜…

『FPGA通信接口』LVDS接口(2)硬件设计

文章目录 1.LVDS原理2.xilinx器件对于LVDS的支持3.LVDS信号PCB布线要求4.传送门 1.LVDS原理 如上图所LVDS的工作原理示意图&#xff0c;其Driver驱动器由一个恒流源是LVDS发送端&#xff08;通常为 3.5mA&#xff09;驱动一对差分信号线组成。驱动状态会翻转就产生正负电压的变…

【前端】Git 常用

文章目录 一、git 配置1.1 查看系统配置1.2 查看当前用户配置1.3 查看当前git用户名1.4 查看当前git邮箱1.5 查看当前仓库配置信息1.6 修改git用户名1.7 修改git邮箱 二、git 常用命令2.1 git init2.2 git clone2.3 git status2.4 git add2.5 git commit2.5 git log2.6 git pul…

“Docker入门指南:概念与安装详解“

目录 # 概念 1. Docker常见问题 2. docker概念和安装 2.1 Docker的组成 2.2 Docker 组件及关系表 2.3 docker核心思想 2.4 docker镜像与容器两个核心概念 2.5 容器概念图 2.6 docker核心技术 2.6.1 镜像 (Image) 概述 关系 示例 2.6.2 容器 (Container) 概述 关…

C# 控件-ComboBox

ComboBox 是一个下拉列表控件&#xff0c;它允许用户从预定义的选项中进行选择&#xff0c;或者输入自定义的文本。以下是如何理解和快速掌握 ComboBox 控件的几个关键点&#xff1a; 创建和初始化 ComboBox: ComboBox comboBox new ComboBox();添加项: 直接添加字符串项&a…

android在线阅读代码网站

android在线阅读代码社区&#xff1a; Android 1.6 到 Android 10 的源码&#xff1a; Android OS 在线源代码 - https://www.androidos.net.cn10.0.0_r6 - Android社区 - https://www.androidos.net.cn/ AndroidXRef https://cs.android.com/ https://cs.android.com/android…

抖音小程序中如何预览一组图片

1.使用tt.previewImage api 语法 tt.previewImage(options)具体使用 **需要注意imgUrl必须是http/https的线上路径&#xff0c;不支持本地路径和base64格式的图片**var imgUrl this.data.imgUrltt.previewImage({urls: [imgUrl], //需要预览的图片http链接列表&#xff0c;…

Mongodb UPDATE使用$sort将数组重新排序

学习mongodb&#xff0c;体会mongodb的每一个使用细节&#xff0c;欢迎阅读威赞的文章。这是威赞发布的第74篇mongodb技术文章&#xff0c;欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题&#xff0c;欢迎在文章下面点个赞&#xff0c;或者关…

使用构造函数注入实现 Spring 依赖注入

Spring 框架提供了多种方式来实现依赖注入&#xff0c;其中构造函数注入是最推荐的一种方式。通过构造函数注入&#xff0c;可以确保所有必需的依赖在对象创建时就被提供&#xff0c;避免了未初始化的依赖导致的潜在问题。本文将详细介绍如何使用构造函数注入实现 Spring 依赖注…

Linux 软链接

# 语法 ln -s <文件夹or文件的真实路径> <自定义路径别名> # 例子 ln -s /etc/sysconfig/network-scripts/ifcfg-ens33 ~/ens33

如何选择合适的半桥栅极驱动芯片?KP8530X,KP85402,KP85211A满足你对半桥栅极驱动一切需求

半桥栅极驱动系列KP8530X&#xff0c;KP85402&#xff0c;KP85211A在功率电子领域展现出卓越的性能和可靠的品质。具备诸多显著优势。首先&#xff0c;半桥栅极驱动系列KP8530X&#xff0c;KP85402&#xff0c;KP85211A拥有出色的耐压性能&#xff0c;可承受高达数百伏的电压&a…

告别繁琐录入,一键解锁OCR魅力:高效文字识别工具推荐

在日常工作中&#xff0c;我们常常会需要找一些模版&#xff0c;如果直接下载编辑某某文档&#xff0c;都是要花钱的。 比如领导让我找个法律文书&#xff0c;改成我们的内容&#xff0c;网上有很多的参考文档&#xff0c;但是不论哪个&#xff0c;下载都要钱&#xff0c;也不…

如何开展小组讨论以强化员工对TPM的关注度?

TPM是一种旨在提高设备综合效率&#xff0c;通过全员参与的方式&#xff0c;实现设备保养和维护的现代化管理体系。因此&#xff0c;如何开展小组讨论以强化员工对TPM的关注度成为了一个值得探讨的话题。本文&#xff0c;深圳天行健精益管理咨询公司为大家分享具体步骤如下&…

YOLOv10改进 | Conv篇 |YOLOv10引入SPD-Conv卷积

1. SPD-Conv介绍 1.1 摘要:卷积神经网络(CNN)在图像分类和目标检测等许多计算机视觉任务中取得了巨大的成功。 然而,在图像分辨率较低或物体较小的更艰巨的任务中,它们的性能会迅速下降。 在本文中,我们指出,这源于现有 CNN 架构中一个有缺陷但常见的设计,即使用跨步卷…

adb 截屏和录屏命令

adb 录屏命令 screenrecord 简介 screenrecord 是一个 shell 命令 支持 Android 4.4(API level 19)以上 支持视频格式: mp4 一些限制 某些设备可能无法直接录制,原因是分辨率太高,如果遇到此类问题&#xff0c;请试着指定较低的分辨率 不支持录制过程中屏幕旋转,如果录制…

Linux机器通过Docker-Compose安装Jenkins发送Allure报告

目录 一、安装Docker 二、安装Docker Compose 三、准备测试用例 四、配置docker-compose.yml 五、启动Jenkins 六、配置Jenkins和Allure插件 七、创建含pytest的Jenkins任务 八、项目结果通知 1.通过企业微信通知 2.通过邮件通知 九、配置域名DNS解析 最近小编接到一…

Excel中插入的图片在不同电脑上消失的问题及解决方法

在使用Excel时插入图片&#xff0c;然后在不同电脑上打开却发现图片消失并被替换为链接地址&#xff0c;这个问题通常出现于文件中的图片路径没有正确保存或者电脑上缺少相关的图片文件。下面让我们来详细解释这个问题以及可能的解决方法。 ### 问题原因分析1. **相对路径问题…