【OpenCV實現圖像:制作酷炫的動畫效果】

文章目錄

    • 概要
    • 生成背景圖
    • 添加點動畫
    • 添加文本顯示
    • 小結

概要

首先,通過導入必要的庫,包括NumPy用于數學運算和Matplotlib庫用于數據可視化。隨后,創建圖形和軸,初始化點的位置,以及編寫初始化函數和更新函數。

初始化函數負責設置圖形的初始狀態,包括坐標軸的范圍等。更新函數則定義了動畫每一幀的變化,這里以cos函數為例,計算點的新坐標位置。

通過FuncAnimation類,設置動畫的幀數、初始化函數、更新函數等參數,最后調用plt.show()顯示動畫。
在這里插入圖片描述

生成背景圖

在繪制動畫之前,首先需要生成cos函數的背景圖。這個步驟非常簡單,與通常使用Matplotlib進行繪圖的方法相似。

import numpy as np
import matplotlib.pyplot as pltdef 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 animationdef update_points(num):point_ani.set_data(x[num], y[num])return point_ani,def add_animation_points():global point_ani, x, yx = 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 animationdef 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_ptdef 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_ptdef add_animation_points():global point_ani, text_pt, x, yx = 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_intervaltheta += omega * time_interval# 更新繪制的數據x = [0, length * np.sin(theta)]y = [0, -length * np.cos(theta)]line.set_data(x, y)# 更新時間文本t += time_intervaltime_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.pswp.cn/news/164197.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164197.shtml
英文地址,請注明出處:http://en.pswp.cn/news/164197.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言歸并排序

以夢為馬,不負韶華 文章目錄 引入:實現原理問題引出:遞歸實現:迭代實現穩定性分析:總結: 引入: 如何將兩個有序數組(假設為升序)合并為一個有序數組? 雙指針…

yolov5/v7修改標簽和檢測框顯示【最全】

《記錄自己在使用yolov5遇到的一些問題》同時也供大家參考,如果對你們有幫助,希望大家可以給個點贊、收藏鼓勵下,非常感謝! 以自帶的一張圖片作為示例,yolov5(6.1版本)的初始檢測框應該是如下圖所示 修改線條粗細、隱藏標簽、隱…

EI論文故障識別程序:DBN深度置信/信念網絡的故障識別Matlab程序,數據由Excel導入,直接運行!

?適用平臺:Matlab2021b版及以上 本程序參考中文EI期刊《基于變分模態分解和改進灰狼算法優化深度置信網絡的自動轉換開關故障識別》中的深度置信網絡(Deep Belief Network,DBN)部分進行故障識別,程序注釋清晰&#x…

Python之學生信息管理系統

目錄 一、基礎界面實現 1、主函數 2、保持循環,獲取用戶需求 二、函數實現模塊功能 1、添加學生信息 2、刪除學生信息 3、修改學生信息 4、查找全部學生信息 5、退出系統 三、整合代碼 1、 完整代碼 2、完整實現過程 實現 打印功能菜單、添加學生信息、刪…

想自學軟件測試?一般人我還是勸你算了吧。。。

📢專注于分享軟件測試干貨內容,歡迎點贊 👍 收藏 ?留言 📝 如有錯誤敬請指正!📢交流討論:歡迎加入我們一起學習!📢資源分享:耗時200小時精選的「軟件測試」資…

<keep-alive>作用及用法

<keep-alive>是Vue.js的內置組件。它用于緩存具有相同組件樹的組件。當組件使用<keep-alive>包裹時&#xff0c;組件不會被銷毀&#xff0c;而是會緩存到內存中&#xff0c;等到下次再次渲染時&#xff0c;直接使用緩存中的組件實例。 <keep-alive>有以下幾…

【Linux】共享內存

文章目錄 一、共享內存的原理詳談共享內存的實現過程二、共享內存的接口函數1.shmget2. shmatshmdtshmctl 進程間使用共享內存通信三、共享內存的特性 關于代碼 一、共享內存的原理 共享內存是由操作系統維護和管理的一塊內存。 共享內存的本質是內核級的緩沖區。 一個進程向…

C語言精華題目錦集1

第一題 test.c文件中包括如下語句&#xff0c;文件中定義的四個變量中&#xff0c;是指針類型的是&#xff08;&#xff09;【多選】 #define INT_PTR int* typedef int* intptr; INT_PRT a,b; int_ptr c,d;A:a ?B:b ?C:c ?D:d #define是宏定義&#xff0c;此時在程序中IN…

SQLite3 數據庫學習(六):Qt 嵌入式 Web 服務器詳解

參考引用 SQLite 權威指南&#xff08;第二版&#xff09;SQLite3 入門 1. Apache 搭建 cgi 環境 1.1 什么是 Apache Apache 是世界使用排名第一的 Web 服務器軟件 它可以運行在幾乎所有廣泛使用的計算機平臺上&#xff0c;由于其跨平臺和安全性被廣泛使用 1.2 具體搭建流程…

一、用戶管理

一、后端數據庫初始化 1.1 因為版本問題&#xff0c;始終報錯&#xff0c;按照報錯信息去查詢解決方案&#xff0c;無法解決 靈機一動&#xff1a; 網址&#xff1a; Spring Boot 3.0 升級 實戰踩坑記錄 - 掘金 (juejin.cn) &#xff11;.&#xff12; 個人配置【運行成功…

c++的三目運算符

C三目運算符增強 C中的三目運算符表達式返回的可以是一個變量&#xff0c;但是C語言中返回的是一個常量。 C語言中&#xff1a; void test05() { int a 10; int b 20; printf("%d\n", a < b ? a : b); //在C語言中三目運算符返回的是表達式的值&am…

Javascript每天一道算法題(十三)——最大子數組和_中等

文章目錄 動態規劃題三個重要步驟&#xff08;了解思路&#xff09;1、問題2、示例3、解決方法&#xff08;1&#xff09;方法1——動態規劃 總結 動態規劃題三個重要步驟&#xff08;了解思路&#xff09; &#xff08;1&#xff09;定義數組元素的含義 用一個數組來保存歷史數…

2020年06月 Scratch(三級)真題解析#中國電子學會#全國青少年軟件編程等級考試

Scratch等級考試(1~4級)全部真題?點這里 一、單選題(共25題,每題2分,共50分) 第1題 執行以下腳本后舞臺上的角色將 ? A:先克隆自身,克隆體出現后被刪除。 B:先克隆自身,克隆體出現后刪除本體。 C:克隆出自身后本體與克隆體同時被刪除。 D:克隆出自身后本體與克…

docker常用命令, 鏡像版本的導入、導出并加載,打包鏡像的命令

文章目錄 docker常用命令&#xff1a;打鏡像包&#xff1a;鏡像版本的導入、導出并加載 docker常用命令&#xff1a; 打鏡像包&#xff1a; ? docker build -t calc:20230630 /home/apps/calc/docker/ 刪除某個鏡像的版本&#xff0c;allen_mysql的5.7版本 docker rmi all…

Redis深入理解-內核請求處理流程、數據傳輸協議

Redis 內核級請求處理流程 Redis Server 其實就是 Linux 服務器中的一個進程 主要還是下圖的流程 應用先和 server 端建立 TCP 連接建立連接之后&#xff0c;server 端就會有一個與該客戶端通信的 socket&#xff0c;客戶端的讀寫請求發送到服務端的 socket那么通過 IO 多路…

分組背包問題學習筆記 AcWing 9. 分組背包問題

原題 有 N&#xfffd; 組物品和一個容量是 V&#xfffd; 的背包。 每組物品有若干個&#xff0c;同一組內的物品最多只能選一個。 每件物品的體積是 vij&#xfffd;&#xfffd;&#xfffd;&#xff0c;價值是 wij&#xfffd;&#xfffd;&#xfffd;&#xff0c;其中 …

PC8233(CC/CV控制)高耐壓輸入5V/3.4A同步降壓電路內建補償帶恒流恒壓輸出

概述 PC8233&#xff08;替代CX8853&#xff09;是一款同步降壓調節器,輸出電流高達3.4A,操作范圍從8V到32V的寬電源電壓。內部補償要求最低數量現成的標準外部組件。PC8233在CC&#xff08;恒定輸出電流&#xff09;模式或CV&#xff08;恒定輸出電壓&#xff09;模式&#x…

【前端】前端監控?埋點

文章目錄 前端監控分為三個方面前端監控流程異常監控常見的錯誤捕獲方法主要是 try / catch 、window.onerror 和window.addEventListener 等。Promise 錯誤Vue 錯誤React 錯誤 性能監控用戶行為監控常見的埋點方案來源 前端監控分為三個方面 異常監控&#xff08;監控前端頁面…

基于element-ui后臺模板,日常嘮嗑

后面會補充github地址 文章目錄 目錄 文章目錄 案例說明 1.引入庫 2.創建布局組件 3.創建布局組件 4.菜單效果展示 5.創建頂部組件 5.創建頂部面包屑組件 6.創建內容區域組件 7.效果總覽 7.布丁&#xff08;實現一些小細節&#xff09; 前言一、pandas是什么&#xff1f;二、使…

CentOS7中升級OpenSSL詳細教程

文章目錄 一. 引言二. 升級前的準備1.備份現有配置2. 檢查系統版本3. 安裝依賴 三. OpenSSL安裝四. 驗證 一. 引言 OpenSSL: 是用于保護數據安全的重要工具。它能提供加密&#xff0c;解密等多項功能。 然而&#xff0c;隨著技術的發展和新的安全漏洞的出現&#xff0c;使用最…