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

Python 基于 OpenCV 视觉图像处理实战 之 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 cv2


def 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_bgr


def 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. 在处理视频时,要确保处理速度足够快,以避免处理过程变得过慢。
相关推荐
Nontee14 小时前
数据类型与包装类 — 一个新手学Java的数据类型笔记
java·笔记·python
千天夜14 小时前
深入剖析 `Path(path).parent.mkdir(parents=True, exist_ok=True)` —— 优雅处理目录创建的终极方案
python
简~76814 小时前
python for in循环不能遍历整数怎么解决
python·大学生
aiqianji15 小时前
垂直专业的AI短篇小说写作软件有哪些特点?
人工智能·python
aqi0015 小时前
15天学会AI应用开发(十三)上下文与RAG的阶段性总结
人工智能·python·大模型·ai编程·ai应用
程序员杰哥15 小时前
接口测试知识总结
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试
大海变好AI15 小时前
专业的智能体算力架构高性价比品牌公司
python
江华森15 小时前
深入理解 Flask 实现原理
后端·python·flask
FriendshipT16 小时前
Ultralytics:解读SPPF模块
人工智能·pytorch·python·深度学习·目标检测