Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之一 简单视频放大抖动效果

news2024/11/20 15:23:29

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之一 简单视频放大抖动效果

目录

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之一 简单视频放大抖动效果

一、简单介绍

二、简单视频放大抖动效果实现原理

三、简单视频放大抖动效果案例实现简单步骤

四、注意事项

五、其他


一、简单介绍

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

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

二、简单视频放大抖动效果实现原理

简单的视频抖动放大效果是对视频中的每一帧进行处理,使其在特定的条件下进行放大。通常情况下,这种效果会在视频的开始阶段或者特定的时间间隔内对帧进行放大处理,以达到抖动放大的效果。具体来说,这种效果通常包括以下几个步骤:

  1. 读取视频:首先,程序会读取输入的视频文件。

  2. 逐帧处理:接着,程序会对视频中的每一帧进行处理。在简单的视频抖动放大效果中,通常会根据特定的条件来判断是否对当前帧进行放大处理。

  3. 放大处理:当满足放大条件时,对当前帧进行放大处理。一种常见的放大方式是通过裁剪图像中心部分,然后将其放大至原始图像大小。

  4. 写入输出视频:最后,处理后的帧将被写入到输出视频文件中,从而形成一个具有抖动放大效果的视频。

涉及的关键函数包括:

  • cv2.VideoCapture()

    • 这个函数用于从视频文件中读取视频流。
    • video_shake() 函数中使用,用于打开视频文件并创建一个 VideoCapture 对象。
  • cap.get()

    • 这个方法用于获取视频的属性,如帧率、宽度、高度等。
    • video_shake() 函数中使用,用于获取视频的帧率、宽度和高度。
  • cv2.VideoWriter()

    • 这个函数用于创建一个用于保存视频的 VideoWriter 对象。
    • video_shake() 函数中使用,用于创建一个 VideoWriter 对象,用于写入输出视频文件。
  • cap.read()

    • 这个方法用于逐帧读取视频。
    • video_shake() 函数中使用,用于逐帧读取视频并对每一帧进行处理。
  • cv2.VideoWriter.write()

    • 这个方法用于将帧写入到视频文件中。
    • video_shake() 函数中使用,用于将处理后的帧写入到输出视频文件中。

三、简单视频放大抖动效果案例实现简单步骤

1、编写代码

2、运行效果

3、具体代码

"""
简单视频抖动放大效果

    apply_zoom() 函数:
    这个函数接受一个帧图像和放大因子作为参数,然后将图像放大。
    首先,计算了放大区域的左上角和右下角坐标,然后从原图中截取出放大区域,最后将截取的图像进行放大并返回。

    video_shake() 函数:
    这个函数接受视频文件的路径和输出视频文件的路径作为参数。
    首先,打开视频文件并获取视频信息,包括帧率、宽度和高度。
    然后,创建一个 VideoWriter 对象,用于写入输出视频文件。
    在一个循环中,逐帧读取视频,检查帧索引是否为前 5 帧或者 10 的倍数帧,如果是,则应用放大效果。
    最后,将处理后的帧写入输出视频文件,释放资源。
"""

import cv2


def apply_zoom(frame, factor):
    """
    放大指定帧图
    :param frame:
    :param factor: 这个函数接受一个帧图像和放大因子作为参数,然后将图像放大。
    :return:
    """
    height, width, _ = frame.shape
    h1 = int(height * 0.1)
    h2 = int(height * 0.9)
    w1 = int(width * 0.1)
    w2 = int(width * 0.9)
    zoomed_frame = frame[h1:h2, w1:w2]
    return cv2.resize(zoomed_frame, (width, height))


def video_shake(video_path, output_path):
    """
    视频放大抖动
    :param video_path:
    :param output_path:
    :return:
    """
    # 打开视频文件
    cap = cv2.VideoCapture(video_path)

    # 获取视频信息
    fps = 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_path, fourcc, fps, (width, height))

    # 视频索引
    frame_index = 0

    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break

        # 检查帧索引是否为 10 的倍数或前 5 帧
        if frame_index < 5 or frame_index % 10 == 0:
            frame = apply_zoom(frame, factor=2)

        out.write(frame)

        frame_index += 1

    cap.release()
    out.release()
    cv2.destroyAllWindows()


def main():
    video_path = "Videos/CatRun.mp4"
    output_path = "Videos/VideoShake.mp4"

    video_shake(video_path, output_path)


if __name__ == "__main__":
    main()

四、注意事项

  • 视频文件路径

    • 确保 video_path 变量中指定的视频文件路径是正确的,包括文件名和文件格式。如果视频文件不存在或路径错误,程序将无法打开视频文件。
  • 输出视频文件路径

    • 确保 output_path 变量中指定的输出视频文件路径是正确的,并且具有合适的文件名和文件格式。如果输出路径无法访问或已存在同名文件,程序将无法写入输出视频文件。
  • 视频处理参数

    • apply_zoom() 函数中,可以调整放大效果的参数,例如放大区域的比例因子。可以根据实际需求调整这些参数,以获得更好的效果。
  • 帧索引判断

    • video_shake() 函数中,使用了帧索引来判断是否对当前帧应用放大效果。确保你理解了条件判断的逻辑,并且根据需求调整条件判断的条件。
  • 资源释放

    • 在程序执行结束时,确保释放了视频文件对象和 VideoWriter 对象的资源,并关闭了所有的 OpenCV 窗口,以避免资源泄露和内存占用。

五、其他

1、生成一个黑白棋盘图

import cv2
import numpy as np

# 设置棋盘格尺寸和方格数
board_size = (7, 7)
square_size = 100  # 每个棋盘格的边长,单位为像素

# 计算棋盘格图像大小
board_width = board_size[1] * square_size
board_height = board_size[0] * square_size

# 创建棋盘格图像
chessboard_image = np.zeros((board_height, board_width, 4), dtype=np.uint8)

# 绘制棋盘格
for i in range(0, board_height, square_size):
    for j in range(0, board_width, square_size):
        color = 255 if (i // square_size + j // square_size) % 2 == 0 else 0
        chessboard_image[i:i+square_size, j:j+square_size] = (color, color, color, 255)

# 保存为 PNG 图片
cv2.imwrite('chessboard.png', chessboard_image)

# 显示图像
cv2.imshow('Chessboard', chessboard_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

2、图片保存视频

import cv2

# 读取棋盘图片
chessboard_image = cv2.imread('Images/chessboard.png')

# 检查图片是否读取成功
if chessboard_image is None:
    print("Error: Unable to read chessboard image.")
    exit()

# 设置视频帧率和尺寸
fps = 30
enlarged_height, enlarged_width = chessboard_image.shape[0] * 2, chessboard_image.shape[1] * 2

# 创建 VideoWriter 对象
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
video_writer = cv2.VideoWriter('calibration_video.mp4', fourcc, fps, (enlarged_width, enlarged_height))

# 计算帧数
frame_count = 5 * fps

# 循环生成放大颜色分离的棋盘格图像,并写入视频
for _ in range(frame_count):
    # 放大棋盘图片
    enlarged_chessboard = cv2.resize(chessboard_image, (enlarged_width, enlarged_height), interpolation=cv2.INTER_LINEAR)

    # 颜色分离
    blue_channel, green_channel, red_channel = cv2.split(enlarged_chessboard)

    # 对每个通道进行错开叠加显示
    merged_frame = cv2.merge((red_channel, green_channel, blue_channel))
    video_writer.write(merged_frame)

# 释放资源
video_writer.release()
cv2.destroyAllWindows()

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

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

相关文章

asf是什么格式的文件?用手机怎么打开?

由于手机操作系统和硬件的限制&#xff0c;大部分手机并不直接支持asf文件的播放。因此&#xff0c;如果你想在手机上打开asf文件&#xff0c;你可能需要先将文件转换为手机支持的格式&#xff0c;如MP4。可以通过使用一些视频转换软件来实现&#xff0c;比如野葱视频转换器。 …

原创【matcap材质在ue4中的实现办法】

matcap材质在ue4中的实现办法 2023-08-29 15:34 https://www.bilibili.com/video/BV1GR4y1b76n/?spm_id_from333.337.search-card.all.click&vd_sourced76b773892c830a157c0ccc97ba78411 评论(0)

2024阿里云老用户服务器优惠价格99元和199元

阿里云服务器租用价格表2024年最新&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;ECS u1服务器2核4G5M固定带宽199元一年&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;2核…

二期 1.1 微服务是什么?微服务与分布式架构的区别是什么?SpringBoot与Spring Cloud的区别是什么?

文章目录 前言一、单体架构二、微服务是什么?三、微服务与分布式的区别四、SpringBoot与Spring Cloud的区别?前言 欢迎大家来到二期Spring Cloud 微服务项目实战,首先我们应了解 单体架构是什么?它有哪些问题? 微服务是什么,与分布式架构的区别,Java中微服务框架Spring…

鸿蒙OS开发实例:【应用事件打点】

简介 传统的日志系统里汇聚了整个设备上所有程序运行的过程流水日志&#xff0c;难以识别其中的关键信息。因此&#xff0c;应用开发者需要一种数据打点机制&#xff0c;用来评估如访问数、日活、用户操作习惯以及影响用户使用的关键因素等关键信息。 HiAppEvent是在系统层面…

WPS二次开发系列:以自动播放模式打开PPT文档

在前面文章中 WPS SDK打开文档并实现保存回传 介绍了如何使用WPS SDK打开文档&#xff0c;那么我们是否能够实现在打开WPS 文档的时候能够传递一些参数来控制打开文档的行为呢&#xff0c;经过研究WPS SDK相关文档和API&#xff0c;最终实现了 以自动播放方式打开PPT文档功能。…

[lesson04]布尔类型和引用

布尔类型和引用 布尔类型 C中的布尔类型 C在C语言的基本类型系统上增加了boolC中的bool可取的值只有true和false理论上bool只占用一个字节 注意&#xff1a; true代表真值&#xff0c;编译器内部用1来表示 false代表非真值&#xff0c;编译器内部用0来表示 bool类型只有true(…

开源模型应用落地-chatglm3-6b模型小试-入门篇(一)

一、前言 刚开始接触AI时&#xff0c;您可能会感到困惑&#xff0c;因为面对众多开源模型的选择&#xff0c;不知道应该选择哪个模型&#xff0c;也不知道如何调用最基本的模型。但是不用担心&#xff0c;我将陪伴您一起逐步入门&#xff0c;解决这些问题。 在信息时代&#xf…

React + 项目(从基础到实战) -- 第三期

react内置hooks useState 如何让页面动起来(实时更新) import React,{FC,useState} from "react";const Demo:FC()>{let count0; //普通js变量无法触发组件更新function add(){count;console.log("count: ",count);}return <div><button onCl…

Transformer模型-用jupyter演示逐步计算attention

学习transformer模型-用jupyter演示如何计算attention&#xff0c;不含multi-head attention&#xff0c;但包括权重矩阵W。 input embedding&#xff1a;文本嵌入 每个字符用长度为5的向量表示&#xff1a; 注意力公式&#xff1a; 1&#xff0c;准备Q K V&#xff1a; 先 生…

云计算的安全需求

目录 一、概述 二、云安全服务基本能力要求 三、信息安全服务&#xff08;云计算安全类&#xff09;资质要求 3.1 概述 3.2 资质要求内容 3.2.1 组织与管理要求 3.2.2 技术能力要求 四、云安全主要合规要求 4.1 安全管理机构部门的建立 4.2 安全管理规范计划的编制 4…

AR/VR技术对制造业劳动力危机的影响

借助 AR/VR 的力量缩小现代制造业的技能差距 数字化转型仍然是企业的首要任务&#xff0c;其许多方面都需要人工干预。然而&#xff0c;推动此类举措所需的技术工人日益短缺。这就造成了我们所说的“制造业劳动力危机”。 制造业应当如何&#xff1a; 制造业用工危机正在影响…

IDEA 中能提高开发效率的插件

目录 前言 插件 Rainbow Brackets AceJump POJO to JSON Json Helper MybatisX Maven Helper PlantUML Integration TONYYI Lingma 前言 IDEA 里又很多好用的插件可以帮助我们提升开发效率&#xff0c;这里罗列下自己开发过程中常用的插件&#xff0c;善于利用插件&…

MySQL-视图:视图概述、创建、查看、更新、修改、删除

第14章 视图 1. 常见的数据库对象2. 视图概述2.1 为什么使用视图&#xff1f;2.2 视图的理解 3. 创建视图3.1 创建单表视图3.2 创建多表联合视图3.3 基于视图创建视图 4. 查看视图5. 更新视图的数据5.1 一般情况5.2 不可更新的视图 6. 修改、删除视图6.1 修改视图6.2 删除视图 …

Prisma ORM 5.12 发布,支持 Cloudflare D1 数据库

昨晚&#xff0c;Prisma ORM 发布了 5.12.0 稳定版本&#xff0c;在此版本中 Prisma ORM 新增了对 Cloudflare D1 的预览支持&#xff0c;现在我们可以选择将本地的 SQLite 数据库逐步迁移到 Cloudflare 上面&#xff0c;从而实现无需额外成本即可构建处理大量用户的应用程序。…

[计算机效率] 格式转换工具:格式工厂

3.14 格式转换工具&#xff1a;格式工厂 格式工厂是一款功能强大的多媒体格式转换软件&#xff0c;可以实现音频、视频、图片等多种格式的转换。它支持几乎所有类型的多媒体格式&#xff0c;包括视频、音频、图片、字幕等&#xff0c;可以轻松实现格式之间的转换&#xff0c;并…

MySQL 索引底层探索:为什么是B+树?

MySQL 索引底层探索&#xff1a;为什么是B树&#xff1f; 1. 由一个例子总结索引的特点2. 基于哈希表实现的哈希索引3. 高效的查找方式&#xff1a;二分查找4. 基于二分查找思想的二叉查找树5. 升级版的BST树&#xff1a;AVL 树6. 更加符合磁盘特征的B树7. 不断优化的B树&#…

类似微信的以文搜图功能实现

通过PaddleOCR识别图片中的文字&#xff0c;将识别结果报存到es中&#xff0c;利用es查询语句返回结果图片。 技术逻辑 PaddleOCR部署、es部署创建mapping将PaddleOCR识别结果保存至es通过查询&#xff0c;返回结果 前期准备 PaddleOCR、es部署请参考https://blog.csdn.net…

安装Qrcode库的方法最终解答!_Python第三方库

安装Python第三方库Qrcode 我的环境&#xff1a;Window10&#xff0c;Python3.7&#xff0c;Anaconda3&#xff0c;Pycharm2023.1.3 Qrcode库 Qrcode库是一个专门生成二维码的库。它能够让你很容易地创建不同大小、颜色和包含不同类型数据的二维码&#xff0c;支持生成 GIF 动…

基于springboot实现影城管理系统项目【项目源码+论文说明】

基于springboot实现影城管理系统演示 摘要 随着现在网络的快速发展&#xff0c;网上管理系统也逐渐快速发展起来&#xff0c;网上管理模式很快融入到了许多生活之中&#xff0c;随之就产生了“小徐影城管理系统”&#xff0c;这样就让小徐影城管理系统更加方便简单。 对于本小…