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

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()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

面试经典150题【131-140】

文章目录 面试经典150题【131-140】123.买卖股票的最佳时机III188.买卖股票的最佳时机IV二分查找的板子&#xff1a;35.搜索插入位置74.搜索二维矩阵162.寻找峰值33.搜索旋转排序数组34.在排序数组中查找元素的第一个和最后一个位置153.寻找旋转排序数组中的最小值4.寻找两个正…

练习 18 Web [RoarCTF 2019]Easy Calc

表达式注入&#xff0c;被屏蔽字符的处理方式 一开始先看一下前端的源码 有一个calc.php&#xff0c;肯定需要打开 这是calc中的代码 <?php error_reporting(0); if(!isset($_GET[num])){show_source(__FILE__); }else{$str $_GET[num];$blacklist [ , \t, \r, \n,\,…

计算机网络-HTTP相关知识-HTTP的发展

HTTP/1.1 特点&#xff1a; 简单&#xff1a;HTTP/1.1的报文格式包括头部和主体&#xff0c;头部信息是键值对的形式&#xff0c;使得其易于理解和使用。灵活和易于扩展&#xff1a;HTTP/1.1的请求方法、URL、状态码、头字段等都可以自定义和扩展&#xff0c;使得其具有很高的…

【Android、 kotlin】kotlin学习笔记

基本语法 fun main(){val a2var b "Hello"println("$ (a - 1} $b Kotlin!")} Variables 只赋值一次用val read-only variables with val 赋值多次用var mutable variables with var Standard output printin() and print() functions String templ…

蓝桥杯第793题——排水系统

题目描述 对于一个城市来说&#xff0c;排水系统是极其重要的一个部分。 有一天&#xff0c;小 C 拿到了某座城市排水系统的设计图。排水系统由 n 个排水结点&#xff08;它们从 1∼n 编号&#xff09;和若干个单向排水管道构成。每一个排水结点有若干个管道用于汇集其他排水…

分布式链路追踪与云原生可观测性

分布式链路追踪系统历史 Dapper, a Large-Scale Distributed Systems Tracing Infrastructure - Google Dapper&#xff0c;大规模分布式系统的跟踪系统大规模分布式系统的跟踪系统&#xff1a;Dapper设计给我们的启示 阿里巴巴鹰眼技术解密 - 周小帆京东云分布式链路追踪在金…

Node.js环境调用百度智能云(百度云)api鉴权认证三步走

方式一 :Postman脚本的方式生成v1版本的认证字符串 Postman脚本下载 下载Postman pre-request Script 设置 Authorization 示例脚本 方式二&#xff1a;在线签名工具生成 (试用于验证编程字符串签名是否有错误) 签名计算工具 https://cloud.baidu.com/signature/index.html …

Acrel-1000DP光伏监控系统在尚雷仕(湖北)健康科技有限公司5.98MW分布式光伏10KV并网系统的应用

摘 要&#xff1a;分布式光伏发电特指在用户场地附近建设&#xff0c;运行方式多为自发自用&#xff0c;余电上网&#xff0c;部分项目采用全额上网模式。分布式光伏全额上网的优点是可以充分利用分布式光伏发电系统的发电量&#xff0c;提高分布式光伏发电系统的利用率。发展分…

C++ //练习 11.3 编写你自己的单词计数程序。

C Primer&#xff08;第5版&#xff09; 练习 11.3 练习 11.3 编写你自己的单词计数程序。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /*************************************************************************> …

拾光坞N3 ARM 虚拟主机 i茅台项目

拾光坞N3 在Dcoker部署i茅台案例 OS&#xff1a;Ubuntu 22.04.1 LTS aarch64 cpu&#xff1a;RK3566 ram&#xff1a;2G 部署流程——》mysql——》java8——》redis——》nginx mysql # 依赖 apt update apt install -y net-tools apt install -y libaio* # 下载mysql wg…

JavaBean是什么?

Bean的本意为豌豆、子实&#xff0c;在这里引申为一种实体。JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean&#xff0c;类必须是具体的和公共的&#xff0c;并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性&#xff0…

鸿蒙南向开发实战:【智能窗帘】

样例简介 智能窗帘设备不仅接收数字管家应用下发的指令来控制窗帘开启的时间&#xff0c;而且还可以加入到数字管家的日程管理中。通过日程可以设定窗帘开关的时间段&#xff0c;使其在特定的时间段内&#xff0c;窗帘自动打开或者关闭&#xff1b;通过日程管家还可以实现窗帘…

基础篇3 浅试Python爬虫爬取视频,m3u8标准的切片视频

浅试Python爬取视频 1.页面分析 使用虾米视频在线解析使用方式&#xff1a;https://jx.xmflv.cc/?url目标网站视频链接例如某艺的视频 原视频链接 解析结果: 1.1 F12查看页面结构 我们发现页面内容中什么都没有&#xff0c;video标签中的src路径也不是视频的数据。 1.2 …

VUE运行项目后,只有local地址,没有network地址(添加nerwork地址)

使用前 使用后 解决方案 1.找到build文件夹下的webpack.dev.conf.js文件&#xff0c;更改messages中的内容 devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({compilationSuccessInfo: {messages: [App running: ,Local: http://${devWebpackConfig.devServer.hos…

【前端Vue】社交信息头条项目完整笔记第3篇:三、个人中心,TabBar 处理【附代码文档】

社交媒体-信息头条项目完整开发笔记完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;一、项目初始化使用 Vue CLI 创建项目,加入 Git 版本管理,调整初始目录结构,导入图标素材,引入 Vant 组件库,移动端 REM 适配。二、登录注册准备,实现基本登录功能,登录状…

ObjectiveC-08-OOP面向对象程序设计-类的分离与组合

本节用一简短的文章来说下是ObjectiveC中的类。类其实是OOP中的一个概念&#xff0c;概念上简单来讲类是它是一组关系密切属性的集合&#xff0c;所谓的关系就是对现实事物的抽象。 上面提到的关系包括很多种&#xff0c;比如has a&#xff0c; is a&#xff0c;has some等&…

交互设计师、UI设计师、视觉设计师面试作品集包装模板figma源文件

页面数量&#xff1a;19页 页面尺寸&#xff1a;1920*1080PX 交付格式&#xff1a;figma 赠送文件&#xff1a;24款高质量样机 交付文件&#xff1a;作品集模板源文件、作品集包装psd源文件、作品集所用字体文件 该作品集虽然只有19页&#xff0c;但可根据需求复制作品集里已有…

offsetof宏定义的使用和模拟实现详解

目录 一.offsetof宏定义的使用二.offsetof宏的模拟实现三.总结 一.offsetof宏定义的使用 offsetof的第一个参数是数据类型(结构体或联合体)&#xff0c;第二个参数是偏移量 &#xff08;offsetof用于计算结构体和联合体的偏移量&#xff09; 返回值的类型是size_t&#xff08;无…

Spring Cloud微服务入门(二)

微服务的技术栈 服务治理&#xff1a; 服务注册、发现、调用。 负载均衡&#xff1a; 高可用、集群部署。 容错&#xff1a; 避免雪崩、削峰、服务降级。 消息总线&#xff1a; 消息队列、异步通信&#xff0c;数据一致性。 网关&#xff1a; 校验路径、请求转发、服务集成…

Golang 开发实战day07 - Functions

Golang 教程07 - Functions 1. Functions 1.1 什么是函数&#xff1f; 在 Golang 中&#xff0c;函数就像是代码的超级组合体&#xff0c;可以将一段代码封装成一个独立的单元&#xff0c;以便重复使用。 1.2 函数声明 func funcName(parameter1 type1, parameter2 type2)…