Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之十 简单视频浮雕画效果

ops/2024/9/18 23:09:05/ 标签: python, opencv, 图像处理, 浮雕效果, 视频处理

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之十 简单视频浮雕画效果

目录

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之十 简单视频浮雕画效果

一、简单介绍

二、简单视频浮雕画效果实现原理

三、简单视频浮雕画效果案例实现简单步骤

四、注意事项


一、简单介绍

Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。

这里使用 Python  基于 OpenCV 进行视觉图像处理,......

二、简单视频浮雕画效果实现原理

视频浮雕效果是一种图像处理技术,可以将图像中的灰度变化转换为浮雕或凸起的视觉效果。在视频中应用浮雕效果后,图像的边缘部分将产生明显的凸起或凹陷效果,从而使图像看起来更加立体和有质感。这种效果通常用于增强图像的纹理和轮廓,使图像看起来更加生动和逼真。

实现原理:

  • 视频的浮雕效果,通过对视频的每一帧应用浮雕滤镜,增强视频的立体感和轮廓。

实现方法:

  1. 打开视频文件: 使用OpenCV的VideoCapture函数打开输入视频文件。
  2. 设置输出视频参数: 获取输入视频的帧率和尺寸,并定义输出视频的编码器和帧率。
  3. 应用浮雕效果 定义一个apply_emboss_filter函数,该函数接受一帧图像作为输入,并应用浮雕效果浮雕效果的实现基于以下步骤:
    • 将图像转换为灰度图像。
    • 通过对灰度图像应用Sobel算子来计算图像的梯度。
    • 根据Sobel算子计算的梯度,计算浮雕效果
    • 浮雕效果转换回BGR格式。
  4. 处理视频帧: 逐帧读取输入视频,并对每帧应用浮雕效果
  5. 写入输出视频: 将处理后的帧写入输出视频文件。
  6. 释放资源: 释放所有使用的资源,包括输入视频和输出视频。

三、简单视频浮雕画效果案例实现简单步骤

1、编写代码

2、运行效果

3、具体代码

python">"""
简单视频浮雕画效果1、打开视频文件:使用OpenCV的VideoCapture函数打开输入视频文件。2、设置输出视频参数:获取输入视频的帧率和尺寸,并定义输出视频的编码器和帧率。3、应用浮雕效果:定义一个apply_emboss_filter函数,该函数接受一帧图像作为输入,并应用浮雕效果浮雕效果的实现基于以下步骤:4、写入输出视频:将处理后的帧写入输出视频文件。5、释放资源:释放所有使用的资源,包括输入视频和输出视频。
"""import cv2def apply_emboss_filter(frame, scale_factor=0.5, offset=128):"""应用浮雕滤波器:param frame::param scale_factor::param offset::return:"""# 将图像转换为灰度图像gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 通过对灰度图像应用 Sobel 算子来计算图像的梯度sobel_x = cv2.Sobel(gray, cv2.CV_8U, 1, 0, ksize=3)sobel_y = cv2.Sobel(gray, cv2.CV_8U, 0, 1, ksize=3)# 计算浮雕效果emboss = cv2.addWeighted(sobel_x, scale_factor, sobel_y, scale_factor, offset)# 将浮雕效果转换回 BGR 格式emboss_bgr = cv2.cvtColor(emboss, cv2.COLOR_GRAY2BGR)return emboss_bgrdef apply_emboss_effect(input_video_path, output_video_path, scale_factor=0.5, offset=128):"""应用浮雕效果到整个视频:param input_video_path::param output_video_path::param scale_factor::param offset::return:"""# 打开视频文件cap = cv2.VideoCapture(input_video_path)# 检查视频是否成功打开if not cap.isOpened():print("Error: Failed to open video.")return# 获取视频的帧率和尺寸fps = int(cap.get(cv2.CAP_PROP_FPS))width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))# 定义视频编码器fourcc = cv2.VideoWriter_fourcc(*'mp4v')# 创建 VideoWriter 对象out = cv2.VideoWriter(output_video_path, fourcc, fps, (width, height))while cap.isOpened():# 读取视频的一帧ret, frame = cap.read()if not ret:break# 对当前帧应用浮雕滤波器embossed_frame = apply_emboss_filter(frame, scale_factor, offset)# 将处理后的帧写入输出视频文件out.write(embossed_frame)# 释放资源cap.release()out.release()cv2.destroyAllWindows()def main():# 调用函数并指定输入和输出视频文件路径input_video_path = "Videos/TwoPeopleRunning.mp4"output_video_path = "Videos/VideoEmbossEffect.mp4"apply_emboss_effect(input_video_path, output_video_path, scale_factor=0.5, offset=128)if __name__ == "__main__":main()

四、注意事项

  1. 确保输入视频文件存在且能够正常打开。
  2. 确保输入视频的帧率和尺寸与输出视频一致。
  3. 注意图像处理过程中可能产生的数据类型问题,如确保灰度图像的数据类型为CV_8U类型。
  4. 在处理视频时,要确保处理速度足够快,以避免处理过程变得过慢。

http://www.ppmy.cn/ops/2035.html

相关文章

OSPF动态路由实验(华为)

思科设备参考:OSPF动态路由实验(思科) 一,技术简介 OSPF(Open Shortest Path First)是一种内部网关协议,主要用于在单一自治系统内决策路由。它是一种基于链路状态的路由协议,通过…

typescript 问号使用(??)(?.)

问号点(?.) 对象不为空才调用对象的属性。如果对象为空则返回undefined。 res.data.mstrmod?.CreateTime 如果mstrmod为空,createTime得到一个undefine 以下的如果createTime得到undefine再调用replace是会报错 ,?.只能用来取值…

Mac上的PD虚拟机安装parallels tools问题

本文主要记录mac上的虚拟机软件安装好centos7.9的时候安装parallels tools的错误的解决办法: Centos 7.9虚拟机安装parallels tools 前言 在centos高版本上安装parallells tools时会报错,具体错误信息可以在/var/log/parallels.log文件中查看。 本文…

新零售门店、商品、会员管理指标体系总览

新零售,旨在打破传统零售业的边界,引入先进科技和数字化手段,通过整合线上线下渠道,全面提升用户体验,并实现更智能、高效、个性化的零售运营模式。这一模式不仅仅关注销售产品,更注重构建全方位的购物生态…

【Linux】引导过程与服务控制

目录 一、Linux操作系统引导过程 1.linux开机引导过程 2.系统初始化进程 1.init进程 2.进程启动方式 二、运行级别和Systemd单元类型 1.运行级别 2.Systemd 三、启动类故障恢复 1.修复MBR扇区故障 2.修复GRUB引导故障 3.root密码忘记的修改方式 四、系统服务控制 …

MySQL二阶段和三阶段提交

在分布式系统中,事务管理是一个至关重要的方面。MySQL作为一种常用的关系型数据库管理系统,提供了二阶段提交(Two-Phase Commit,2PC)和三阶段提交(Three-Phase Commit,3PC)等协议来支…

MacOs 安装thrift-0.5.0

下载thrift-0.5.0.tar.gz https://archive.apache.org/dist/incubator/thrift/0.5.0-incubating/ 安装thrift 解压:tar -zvxf thrift-0.5.0.tar.gz 进入解压目录:cd thrift-0.5.0 编译命令:./configure --prefix/usr/local/ --with-boo…

第九、十章 异常、模块、包以及数据可视化

第九章 异常、模块、包 异常 捕获异常 捕获常规异常 # 捕获常规异常 try:f open("D:/abc.txt", "r", encoding "UTF-8") except:print("出现异常了,因为文件不存在,我将open的模式,改为w模式去打开&qu…

基于双向长短期神经网络LSTM的飞行轨迹预测,基于GRU神经网络的飞行轨迹预测

目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 BILSTM神经网络 基于双向长短期神经网络LSTM的飞行轨迹预测,基于GRU神经网络的飞行轨迹预测 完整代码: 基于双向长短期神经网络LSTM的飞行轨迹预测,基于GRU神经网络的飞行轨迹预测资源-CSDN文库 https://download.csdn.net/do…

Matlab之绘制地球

绘制地球的抽象三维模型,后续可以在地球模型上标点之类的 一、版本说明 MatlabR2016B PS:从下面的代码可以看出,导入了海岸线数据(Matlab自带),因此可能依赖版本,或者需要下载对应的工具箱 二…

解决VirtualBox虚拟机启动失败的问题

一.出现的问题(未能启动虚拟电脑,由于物理网卡未找到) 一、错误信息分析 “未能启动虚拟电脑,由于物理网卡未找到”:这个错误通常是由于VirtualBox无法识别或连接到物理网卡造成的。可能是由于驱动程序问题、网络设置错…

js BOM模型常用方法梳理

1、Bom定义 BOM是操作浏览器的模型,主要是对浏览器的一些操作。 2、获取浏览器窗口的尺寸 window.innerHeight:获取窗口的高度。 window.innerWidth:湖区窗口的宽度,只在window浏览器下使用。 3、弹出层 alert:弹出框。 confirm:确认框。返回值有true …

Android开发——ListView

activity_main.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_height"match_parent"android:layout_width"match_parent"…

使用Python操作SQLite

1、连接数据库 import sqlite3 conn sqlite3.connect(example.db)其中 example.db 是数据库文件名&#xff0c;如果不存在则会自动创建。connect() 方法还可以接收多个参数&#xff0c;用于设置连接属性&#xff0c;如 conn sqlite3.connect(example.db, isolation_levelNo…

多模态之ALBEF—先对齐后融合,利用动量蒸馏学习视觉语言模型表征,学习细节理解与论文详细阅读:Align before Fuse

Align before Fuse: Vision and Language Representation Learning with Momentum Distillation &#xff08;ALBEF&#xff09;在融合之前对齐&#xff1a;利用动量蒸馏进行视觉与语言表示学习 Paper: arxiv.org/pdf/2107.07651.pdf Github: https://github.com/salesforce/…

PyTorch环境配置问题

为什么深度学习都是用英伟达的显卡&#xff1f; 首先我们需要了解什么是CUDA&#xff1f; CUDA&#xff08;Compute Unified Device Architecture&#xff09;&#xff0c;是显卡厂商 NVIDIA 推出的运算平台。 CUDA就类似于编程语言&#xff0c;开发者和显卡通过CUDA进行交流…

前端面试常见问题

CSS 盒模型和box-sizing ​ 内容(content)&#xff0c;内边距(padding)&#xff0c;边框(border)&#xff0c;外边距(margin) ​ 标准&#xff1a;box-sizing: content-box; widtdcontent ​ 怪异&#xff1a;box-sizing: border-box; width contentpadding border&#xf…

js 使用Object.toString.call()判断数据类型

使用Object.toString.call()判断数据类型 使用Object.toString.call()可以用来判断: 判断基本数据类型 判断复杂数据类型 判断null和undefined 需要注意的是&#xff0c;Object.prototype.toString 方法返回的字符串格式为 “[object 数据类型]”&#xff0c;其中数据类型和 J…

分布式快照算法 Chandy-Lamport

0. 引言 上一篇文章最后说到 Spark 的 Structured Streaming 的 Continuous Processing Mode 的容错处理使用了分布式快照&#xff08;Distributed Snapshot&#xff09;算法 Chandy-Lamport 算法&#xff0c;那么分布式快照算法可以用来解决什么问题呢&#xff1f; A snapsho…

黄金投资对于普通人来说难吗?

黄金&#xff0c;自古以来就被视作财富的象征。在投资市场上&#xff0c;黄金投资更是备受关注的话题。然而&#xff0c;对于普通人来说&#xff0c;黄金投资是否真的难呢&#xff1f;实际上&#xff0c;只要掌握了正确的方法和策略&#xff0c;普通人完全有可能在黄金投资中取…