【OpenCV实现图像:制作酷炫的动画效果】

news2024/11/15 17:48:24

文章目录

    • 概要
    • 生成背景图
    • 添加点动画
    • 添加文本显示
    • 小结

概要

首先,通过导入必要的库,包括NumPy用于数学运算和Matplotlib库用于数据可视化。随后,创建图形和轴,初始化点的位置,以及编写初始化函数和更新函数。

初始化函数负责设置图形的初始状态,包括坐标轴的范围等。更新函数则定义了动画每一帧的变化,这里以cos函数为例,计算点的新坐标位置。

通过FuncAnimation类,设置动画的帧数、初始化函数、更新函数等参数,最后调用plt.show()显示动画。
在这里插入图片描述

生成背景图

在绘制动画之前,首先需要生成cos函数的背景图。这个步骤非常简单,与通常使用Matplotlib进行绘图的方法相似。

import numpy as np
import matplotlib.pyplot as plt


def generate_background():
    x = np.linspace(0, 2 * np.pi, 100)
    y = np.cos(x)

    # 创建图形并绘制cos函数
    fig = plt.figure()
    plt.plot(x, y)

    # 添加网格线
    plt.grid(ls='--')

    # 保存生成的背景图
    plt.savefig("cos_background.png")

    # 显示图形(可选)
    plt.show()


# 调用函数生成背景图
generate_background()

在这里插入图片描述

添加点动画

这一步使用animation库,往代码里添加动画点。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation


def update_points(num):
    point_ani.set_data(x[num], y[num])
    return point_ani,


def add_animation_points():
    global point_ani, x, y
    x = np.linspace(0, 2 * np.pi, 100)
    y = np.cos(x)

    # 创建图形并绘制cos函数
    fig = plt.figure()
    plt.plot(x, y)

    # 初始化动画点
    point_ani, = plt.plot(x[0], y[0], "ro")

    # 添加网格线
    plt.grid(ls="--")

    # 创建动画
    ani = animation.FuncAnimation(fig, update_points, np.arange(0, 100), interval=100, blit=True)

    # 保存动画为gif文件
    ani.save('cos_animation.gif', writer='imagemagick', fps=10)

    # 显示动画(可选)
    plt.show()


# 调用函数添加动画点
add_animation_points()

在这里插入图片描述
解释:

在以上代码中,首先定义了一个名为 update_points 的函数,该函数用于更新绘制图像中的数据点。函数的输入参数 num 代表当前动画的第几帧,函数的返回值即为我们需要更新的对象。

接下来,将该函数传入 FuncAnimation 函数中,其主要参数介绍如下:

fig: 当前绘图对象
update_points: 更新动画的函数
np.arange(0, 100): 动画帧数,这里需要是一个可以迭代的对象
interval: 动画的时间间隔
blit: 是否开启动画渲染

最后,保存动画为 GIF 文件,并可以选择显示动画效果。

添加文本显示

上述代码已经实现了简单的点动画效果。`

可以对上述代码进行少量修改,以支持文本的显示,并在不同条件下展示不同的点样式。

在 update_points 函数中添加一些额外的代码逻辑即可实现上述效果。


def update_points_v3(num):
    point_ani.set_data(x[num], y[num])
    if num % 5 == 0:
        point_ani.set_marker("*")
        point_ani.set_markersize(12)
    else:
        point_ani.set_marker("o")
        point_ani.set_markersize(8)
    text_pt.set_position((x[num], y[num]))
    text_pt.set_text("x=%.2f, y=%.2f" % (x[num], y[num]))
    return point_ani, text_pt,

完整代码:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

def update_points(num):
    point_ani.set_data(x[num], y[num])
    text_pt.set_position((x[num], y[num]))
    text_pt.set_text("x=%.2f, y=%.2f" % (x[num], y[num]))
    return point_ani, text_pt

def update_points_v2(num):
    # 每隔5帧改变点的样式
    if num % 5 == 0:
        point_ani.set_marker("*")
        point_ani.set_markersize(12)
    else:
        point_ani.set_marker("o")
        point_ani.set_markersize(8)

    # 更新动画点和文本显示
    point_ani.set_data(x[num], y[num])
    text_pt.set_position((x[num], y[num]))
    text_pt.set_text("x=%.2f, y=%.2f" % (x[num], y[num]))

    return point_ani, text_pt

def add_animation_points():
    global point_ani, text_pt, x, y
    x = np.linspace(0, 2 * np.pi, 100)
    y = np.cos(x)

    # 创建图形并绘制cos函数
    fig = plt.figure()
    plt.plot(x, y)

    # 初始化动画点和文本
    point_ani, = plt.plot(x[0], y[0], "ro")
    text_pt = plt.text(x[0], y[0], "x=%.2f, y=%.2f" % (x[0], y[0]), ha='right', va='bottom')

    # 添加网格线
    plt.grid(ls="--")

    # 创建动画
    ani = animation.FuncAnimation(fig, update_points_v2, np.arange(0, 100), interval=100, blit=True)

    # 保存动画为gif文件
    ani.save('cos_animation.gif', writer='imagemagick', fps=10)

    # 显示动画(可选)
    plt.show()

# 调用函数添加动画点
add_animation_points()

结果
在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

# 定义常量
g = 9.8  # 重力加速度
length = 1.0  # 钟摆长度
theta0 = np.pi / 4.0  # 初始摆角
time_interval = 0.05  # 时间间隔

# 计算角速度
omega0 = 0.0
omega = omega0

# 初始化时间和角度
t = 0.0
theta = theta0

# 创建画布和子图
fig, ax = plt.subplots()
ax.set_xlim(-1.5, 1.5)
ax.set_ylim(-1.5, 1.5)

# 初始化绘制的对象
line, = ax.plot([], [], 'o-', lw=2)
time_template = 'time = %.1fs'
time_text = ax.text(0.05, 0.9, '', transform=ax.transAxes)

# 更新函数,用于每一帧的绘制
def update(frame):
    global theta, omega, t

    # 计算新的角度和角速度
    alpha = -g / length * np.sin(theta)
    omega += alpha * time_interval
    theta += omega * time_interval

    # 更新绘制的数据
    x = [0, length * np.sin(theta)]
    y = [0, -length * np.cos(theta)]
    line.set_data(x, y)

    # 更新时间文本
    t += time_interval
    time_text.set_text(time_template % t)

    return line, time_text

# 创建动画
ani = animation.FuncAnimation(fig, update, frames=range(0, 100), interval=time_interval * 1000, blit=True)

# 显示动画
plt.show()

在这里插入图片描述

小结

cos函数为例进行讲解,一步一步地实现了点随cos曲线运动的动画效果
物理模型: 使用了简单的物理模型描述了两根相互连接的钟摆系统。每根钟摆都受到重力的作用,同时第一根钟摆的运动会传递给第二根钟摆。

数学建模: 应用了简单的物理方程,包括角速度、角度和牛顿的运动方程,来模拟钟摆的运动。

Matplotlib的Animation类: 利用Matplotlib的Animation类,实现了每一帧钟摆位置的更新和绘制。通过定时更新,我们得到了一个生动的钟摆摆动的动画效果。

交互式展示: 使用Matplotlib的plt.show()函数,动画可以在图形界面中实时展示,方便用户观察钟摆的运动。

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

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

相关文章

轻松搞定HTTP接口测试,JMeter让你事半功倍!

jmeter-http接口测试脚本 jmeter进行http接口测试的主要步骤(1.添加线程组 2.添加http请求 3.在http请求中写入接口的URL,路径,请求方式,参数 4.添加查看结果树 5.调用接口,查看返回值) 针对接口添加heade…

2024东北师范大学计算机考研分析

24计算机考研|上岸指南 东北师范大学 信息科学与技术学院位于长春净月国家高新技术产业开发区,毗邻风光秀美的净月潭国家森林公园。 信息科学与技术学院由原“计算机科学与信息技术学院”和“信息与软件工程学院”于2017年根据学校事业发展需要整合形成。学院设有…

python解决登录图形验证码

摘要:测试过程中经常遇到图片验证码,以下主要是调用百度OCR图片识别获取验证码,实现登录 1、百度云申请创建应用 2、调用接口提取图片验证码 # -*- coding:utf-8 -*- import requests,json from comm import api_demourl "https:// &q…

关键字const的修饰(指针)

A.const修饰变量 变量是可以修改的&#xff0c;如果把变量的地址交给⼀个指针变量&#xff0c;通过指针变量的也可以修改这个变量。 但是如果我们希望⼀个变量加上⼀些限制&#xff0c;不能被修改&#xff0c;怎么做呢&#xff1f;这就是const的作⽤。 #include <stdio.h&…

YAML 深入解析:从语法到最佳实践

什么是YAML YAML&#xff08;YAML Ain’t Markup Language&#xff09;是一种人类可读的数据序列化语言。它的设计目标是使数据在不同编程语言之间交换和共享变得简单。YAML采用了一种简洁、直观的语法&#xff0c;以易于阅读和编写的方式表示数据结构。 YAML广泛应用于配置文…

Flink之状态TTL机制内容详解

1 状态TTL机制 状态的 TTL机制就是Flink提供的自动化删除状态中的过期数据,配置 TTL的 API可以做到对状态中的数据进行冷热数据分离,将热数据一直保存在状态存储器中,将冷数据进行定期删除. 1.1 API简介 TTL常用API如下: API注解setTtl(Time.seconds(…))配置过期时长,当状态…

如何使用Fiddler进行弱网测试

测试APP、web经常需要用到弱网测试&#xff0c;也就是在信号差、网络慢的情况下进行测试。我们自己平常在使用手机APP时&#xff0c;在地铁、电梯、车库等场景经常会遇到会话中断、超时等情况&#xff0c;这种就属于弱网。 普通的弱网测试可以选择第三方工具对带宽、丢包、延时…

量子计算概述

目录 1.量子计算介绍 2.量子计算应用 3.量子计算研究机构 1.量子计算介绍 量子计算是一种遵循量子力学规律调控量子信息单元进行计算的新型计算模式。经典计算使用2进制进行运算&#xff0c;但2进制只有0和1两种状态&#xff0c;而量子计算除了包含0和1两种状…

经典滑动窗口试题(一)

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、将x减到0的最小操作数1、题目讲解2、讲解算法原理3、代码实现 二、无重复的最长子串1、题…

Python入门02 算术运算符及优先级

目录 1 REPL2 启动3 算术运算符4 算术运算符的优先级5 清除屏幕总结 上一节我们安装了Python的开发环境&#xff0c;本节我们介绍一下REPL的概念 1 REPL 首先解释一下python执行代码的一个交互环境的定义&#xff1a; Python REPL&#xff08;Read-Eval-Print Loop&#xff0c…

Android组件化搭建学习

什么是组件化&#xff1f; 为什么要用组件化&#xff1f;在项目的开发过程中&#xff0c;随着开发人员的增多及功能的增加&#xff0c;如果提前没有使用合理的开发架构&#xff0c;那么代码会越来臃肿&#xff0c;功能间代码耦合也会越来越严重&#xff0c;这时候为了保证项目…

Linux加强篇001-部署Linux系统

目录 一、前言 1.1准备工具 1.2安装配置VM虚拟机 1.3安装软件 1.4系统初始化进程 1.5重置root密码 二、巩固练习 1&#xff0e;为什么建议读者在下载系统文件后先进行校验而不是直接安装呢&#xff1f; 2&#xff0e;使用虚拟机安装Linux系统时&#xff0c;为什么要先…

【攻防世界-misc】can_has_stdio?

1.用记事本打开文件是这样子的&#xff0c; 这是一段BF&#xff08;Brainfuck&#xff09;编程语言代码&#xff0c;属于一种极简化的编程语言&#xff0c;用于演示计算机程序设计概念。这段代码包含了一些操作符&#xff0c;如">"表示指针向右移动&#xff0c;&q…

APP测试要点有哪些?本文已经给你梳理好了!

我们日常购物、旅游、支付等活动都离不开手机&#xff0c;由此衍生了很多APP。 比如每天使用频率非常高的微信、支付宝、微博、抖音、王者荣耀等等。 APP测试主要进行功能测试、性能测试、自动化测试、安全性测试、兼容性测试、专项测试。 01 APP测试流程 APP测试流程与web…

GEE:梯度提升树(Gradient Boosting Tree)分类教程(样本制作、特征添加、训练、精度、参数优化、贡献度、统计面积)

作者:CSDN @ _养乐多_ 本文将介绍在Google Earth Engine (GEE)平台上进行梯度提升树(Gradient Boosting Tree)分类的方法和代码,其中包括制作样本点教程(本地、在线和本地在线混合制作样本点,合并样本点等),加入特征变量(各种指数、纹理特征、时间序列特征、物候特征…

【数据结构/C++】栈和队列_顺序栈

#include<iostream> using namespace std; #define MaxSize 10 // 1. 顺序栈 typedef int ElemType; struct Stack {ElemType data[MaxSize];int top; } SqStack; // 初始化栈 void init(Stack &s) {// 初始化栈顶指针s.top -1; } // 入栈 bool push(Stack &s, …

LabVIEW中如何达到NI SMU最大采样率

LabVIEW中如何达到NI SMU最大采样率 NISMU的数字化仪功能对于捕获SMU详细的瞬态响应特性或表征待测设备&#xff08;DUT&#xff09;响应&#xff08;例如线性调整率和负载调整率&#xff09;至关重要。没有此功能&#xff0c;将需要一个外部示波器。 例如&#xff0c;假设在…

【Java】定时器的简单应用

在写代码的过程中&#xff0c;如果我们遇到了隔一段时间就要进行一项任务时&#xff0c;采用定时器会提高我们的效率。下面对定时器的使用进行简单说明 1、应用说明 首先我们要创建一个Timer类 Timer timer new Timer(); 然后在timer中调用schedule()方法添加任务 timer.…

Excel中出现“#NAME?”怎么办?(文本原因)

excel 单元格出现 #NAME? 错误的原因有二&#xff1a; 函数公式输入不对导致 #NAME? 错误。 在单元格中字符串的前面加了号&#xff0c;如下图中的--GoJG7sEe6RqgTnlUcitA&#xff0c;本身我们想要的是--GoJG7sEe6RqgTnlUcitA&#xff0c;但因为某些不当的操作在前面加了号&…

完美解决RuntimeError: implement_array_function method already has a docstring

文章目录 一、报错原因--numpy版本太低二、更新numpy总结 一、报错原因–numpy版本太低 当收到 "RuntimeError: implement_array_function method already has a docstring" 错误时&#xff0c;这可能是由于在numpy的某个版本中&#xff0c;该方法的文档字符串&…