OpenCV项目实战(2)— 如何用OpenCV实现弹球动画

news2024/11/25 22:32:47

前言:Hello大家好,我是小哥谈。OpenCV能够在画布上绘制静态的图形,例如,线段、矩形、正方形、圆形、多边形、文字等。那么,能不能让这些静态的图形移动起来?如果能,又该如何编写代码呢?本实例将使用OpenCV提供的绘制圆形的方法,先绘制一个实心圆,再让这个实心圆在画布上移动起来,呈现“弹球动画”的视觉效果。🌈 

     目录

🚀1.核心技术

🚀2.实现步骤

🚀3.实现代码

🚀1.核心技术

想要实现这个功能需要解决两个问题如何计算运动轨迹和如何实现动画。下面分别介绍这两个问题的解决思路。👇

🍀(1)通过图像坐标系计算运动轨迹。

小球在运动的过程中可以把移动速度划分为四个方向。左右为横坐标移动速度上下为纵坐标移动速度。小球向右移动时横坐标不断变大,向左移动时横坐标不断变小,由此可以认为:小球向右的移动速度为正数,向左的移动速度为负数。纵坐标同理,因为图像坐标系的原点为背景左上角顶点,越往下延伸纵坐标越大,所以小球向上的移动速度为负数,向下的移动速度为正数。四个方向的速度如下图所示。

假设小球移动一段时间之后,移动的轨迹如下图所示,小球分别达到了四个位置,2号位置和3号位置发生了反弹,也就是移动速度发生了变化,导致了移动方向发生变化。整个过程中,四个位置的速度分别如下:👇

a.右下方向移动,横坐标向右,横坐标速度为+Vx,纵坐标向下,纵坐标速度为+Vy。

b.右上方向移动,横坐标向右,横坐标速度为+Vx,纵坐标向上,纵坐标速度为-Vy。

c.左上方向移动,横坐标向左,横坐标速度为-Vx,纵坐标向上,纵坐标速度为-Vy。

d.左上方移动,没有碰到边界,依然保持着与3号位置相同移动速度。

由此可以得出,小球只需要改变速度的正负号就可以改变的移动方向,所以在程序中可以将小球的横坐标速度和纵坐标速度设定成一个不变的值,每次小球碰到左右边界,就更改横坐标速度的正负号,碰到上下两边界,就更改纵坐标速度的正负号。

🍀(2)通过time模块实现动画效果

Python自带一个time时间模块,该模块提供了一个sleep()方法可以让当前线程休眠一段时间,其语法如下:

time.sleep(seconds)

参数说明:

seconds:休眠的秒数,可以是小数,例如1/10表示十分之一秒。

例如,让当前线程休眠1s,代码如下:

import time

time.sleep(1)  # 休眠1s

说明:♨️♨️♨️

动画实际上是由多幅图像在短时间内交替放映实现的视觉效果。每一幅图像被称为一帧,所谓的“60帧”就是指1s放映了60幅图像。使用time模块每1/60s计算一次小球的移动轨迹,并将移动后的结果绘制到图像上,这样1s有60幅图像交替放映,就可以看到弹球的动画效果了。


🚀2.实现步骤

本实例要先在一个宽、高都为200像素的纯白色画布上,绘制一个半径为20像素的纯蓝色的实心圆,并且把这个实心圆当作弹球;再让弹球在画布上作匀速直线运动,一旦弹球碰触到画布边界,就会发生反弹(反弹不损失动能)。


🚀3.实现代码

具体的实现代码如下所示:

import cv2
import time
import numpy as np

width, height = 200, 200  # 画布的宽和高
r = 20  # 圆半径
x = r + 20  # 圆心横坐标起始坐标
y = r + 100  # 圆形纵坐标起始坐标
x_offer = y_offer = 4  # 每一帧的移动速度

while cv2.waitKey(1) == -1:  # 没有按下键盘上的任何按键
    if x > width - r or x < r:  # 如果圆的横坐标超出边界
        x_offer *= -1  # 横坐标速度取相反值
    if y > height - r or y < r:  # 如果圆的纵坐标超出边界
        y_offer *= -1  # 纵坐标速度取相反值
    x += x_offer  # 圆心按照横坐标速度移动
    y += y_offer  # 圆心按照纵坐标速度移动
    img = np.ones((width, height, 3), np.uint8) * 255  # 绘制白色画布
    cv2.circle(img, (x, y), r, (255, 0, 0), -1)  # 绘制圆形
    cv2.imshow("img", img)  # 显示图像
    time.sleep(1 / 60)  # 休眠1/60s,也就是每秒60帧

cv2.destroyAllWindows()  # 释放所有窗体

运行结果如图所示:

退出的时候,按下【Esc】键即可。


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

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

相关文章

S7-1200PLC硬件上升沿中断(VN积分法计算实时卷径)

VN积分法计算实时卷径的算法原理请参考下面文章链接: VN积分法卷径计算FB(SCL代码)_RXXW_Dor的博客-CSDN博客卷径计算的其他方法请参看专栏的相关文章,链接如下:卷径计算(V/N法)_RXXW_Dor的博客-CSDN博客。https://rxxw-control.blog.csdn.net/article/details/131612206PL…

八月 NFT 行业解读:数据下滑,熊市持续

作者: stellafootprint.network 8 月份&#xff0c;加密货币市场经历了明显的波动&#xff0c;比特币价格波动幅度较大。与此同时&#xff0c;NFT 市场出现大幅下跌&#xff0c;引发了人们对这一新兴行业未来发展趋势的担忧。 我们是否已经到达熊市的底部&#xff1f;行业利好…

JDK8 升级至JDK19

优质博文IT-BLOG-CN 目前部分项目使用JDK8&#xff0c;部分项目使用JDK19因此&#xff0c;环境变量中还是保持JDK8&#xff0c;只需要下载JDK19免安装版本&#xff0c;通过配置IDEA就可以完成本地开发。 一、IDEA 环境设置 【1】通过快捷键CTRL SHIFT ALT S或者File->P…

Network: use --host to expose

Network: use --host to expose vite 项目启动后 只能通过 localhost 访问 无法使用 IP 地址访问 原因因为 没有将网络服务暴露在网络中 vite 项目启动 出现如下图 提示&#xff1a; 注意这条提示&#xff1a; Network: use --host to expose 没有将网络服务暴露在网络中 所以 …

【数据结构】用3500字学会优先级队列(堆)

文章目录 &#x1f490;1. 优先级队列1.1 概念 &#x1f490;2.堆的概念及存储方式2.1 什么是堆2.2 为什么要用完全二叉树描述堆呢&#xff1f;2.3 为什么说堆是在完全二叉树的基础上进行的调整&#xff1f;2.4 使用数组还原完全二叉树 &#x1f490;3. 堆的常用操作-模拟实现3…

【CMU 15-445】Proj0 C++ Primer

C Primer Task1 Copy-On-Write TrieTask2 Concurrent Key-Value StoreTask3 DebuggingTask4 SQL String Functions CMU-15445汇总 本文对应的project版本为CMU-Spring-2023的project0 默认读者已经学会了字典树Trie Task1 Copy-On-Write Trie Task1要求实现一个可持久化字典树…

邀请加入团队

**将地址发送给同团队的人克隆失败 ** —解决办法 邀请加入团队 在这里插入图片描述

港科夜闻|香港科大2020十大准独角兽开思完成2亿元D2,D3轮融资,推进汽后全产业链数字化转型...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、“香港科大2020十大准独角兽”开思完成2亿元D2,D3轮融资&#xff0c;推进汽后全产业链数字化转型。开思一直致力于为汽车后市场打造数字化基础设施&#xff0c;建设行业服务标准与信用体系&#xff0c;其业务涵盖一站式汽…

Hive内置函数字典

写在前面&#xff1a;HQL同SQL有很多的类似语法&#xff0c;同学熟悉SQL后一般学习起来非常轻松&#xff0c;写一篇文章列举常用函数&#xff0c;方便查找和学习。 1. 执行模式 1.1 Batch Mode 批处理模式 当使用-e或-f选项运行$ HIVE_HOME / bin / hive时&#xff0c;它将以…

【ChatGPT原理与实战】4个维度讲透ChatGPT技术原理,揭开ChatGPT神秘技术黑盒!

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;目前学习C/C、算法、Python、Java等方向&#xff0c;一个正在慢慢前行的普通人。 &#x1f3c0;系列专栏&#xff1a;陈童学的日记 &#x1f4a1;其他专栏&#xff1a;CSTL&…

三个激活函数在同一figure上的实现

######后期会更新 import matplotlib.pyplot as plt from matplotlib.pyplot import MultipleLocator import numpy as np import mathplt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False# sigmoid激活函数用的最少&#xff0c;但为二分类问题…

零基础VB6无壳P-CODE逆向分析(VB Decompiler应用与避坑)

> 前言 最近从朋友那里拿到了一个加密狗授权的软件安装包,秉承着LCG的精神,开启了逆向之路,经过查壳和综合分析确定是VB6编写的程序(这年头使用VB6开发商业程序的还真少见),作为一名C# Winform的业余程序员,靠着C#的知识勉强分析个大概. > 授权简介 软件共分三种授权模…

Flex布局详解

目录 一、Flex 布局是什么&#xff1f; 二、基本概念 三、容器的属性 3.1 flex-direction属性 3.2 flex-wrap属性 3.3 flex-flow 3.4 justify-content属性 3.5 align-items属性 3.6 align-content属性 四、项目的属性 4.1 order属性 4.2 flex-grow属性 4.3 flex-s…

基于Python+Flask实现一个TODO任务管理系统网站

随着科技的进步&#xff0c;数字化的任务清单逐渐成为生活中不可或缺的一部分。它们不仅可以帮助我们跟踪日常任务&#xff0c;还可以提高效率。但是&#xff0c;你是否考虑过自己制作一个任务管理系统呢&#xff1f; 好消息是&#xff0c;使用Python和Flask&#xff0c;我们可…

数据库安全(Mysql,Hadoop,Redis)

MySQL Mysql 身份认证绕过漏洞&#xff08;CVE-2012-2122&#xff09; 当连接MariaDB/MySQL时&#xff0c;输入的密码会与期望的正确密码比较&#xff0c;由于不正确的处理&#xff0c;会导致即便是memcmp()返回一个非零值&#xff0c;也会使MySQL认为两个密码是相同的。也就…

C++:初始化列表,static成员,友元,内部类

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》 文章目录 前言一、初始化列表二、static成员三、友元四、内部类总结 前言 本篇博客作为C&#xff1a;初始化列表&#xff0c;static成员&#xff0c;友元&#xff0c;内部类的知识总结。 一…

js实现websocket服务端和客户端

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

城市社交活动系统+附近交友资源类短视频APP源码

城市社交活动系统附近交友资源类短视频&#xff0c;注意只有安卓端源码&#xff01;

Python中Mock和Patch的区别

前言&#xff1a; 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 在测试并行开发&#xff08;TPD&#xff09;中&#xff0c;代码开发是第一位的。 尽管如此&#xff0c;我们还是要写出开发的测试&#xff0c…