当前位置: 首页 > article >正文

python学opencv|读取图像(二十七)使用time()绘制弹球动画

【1】引言

前序已经学习了python+opencv画线段、圆形、矩形、多边形和文字的相关操作,具体文章链接包括且不限于:

python学opencv|读取图像(十八)使用cv2.line创造线段_cv2. 画线段-CSDN博客

python学opencv|读取图像(二十二)使用cv2.polylines()绘制多边形-CSDN博客

python学opencv|读取图像(二十五)使用cv2.putText()绘制文字进阶-垂直镜像文字-CSDN博客

在此基础上,我们更进一步,尝试绘制会动的弹球。

【2】技术分析

要想绘制弹球,首先要绘制圆形,所以要充分掌握绘制圆形的操作:

python学opencv|读取图像(二十)使用cv2.circle()绘制圆形_cv2.circle()函数-CSDN博客

在此基础上,我们需要通过使用循环函数来创建动态的圆心,比如常见的while()函数。

然后我们还要用time()函数还控制输出帧率,这样才能看到动画。

【3】代码测试

首先我们给出完整代码,然后再详细分析:

import cv2 as cv # 引入CV模块
import time #引入time模块
import numpy as np #引入numpy模块

width,height=500,500 #输入画布大小
r=20 #设定圆心大小
x=r+200 #设定初始X轴坐标
y=r+200 #设定初始Y轴坐标
x_v=y_v=5 #设定初始移动速度

while cv.waitKey(1)==-1:
    if x>0.85*(width) or x<0.15*(width): #在画布宽度(15%-85%)的区间内,弹球可直线运行
        x_v *=-1 #在画布宽度的15%或者85%的位置,弹球将反向直线运行
    if y > 0.85*(height) or y < 0.15*(height) : #在画布高度(15%-85%)的区间内,弹球可直线运行
        y_v *= -1 #在画布高度的15%或者85%的位置,弹球将反向直线运行
    x+=x_v #圆心x随着速度变化
    y+=y_v #圆心y随着速度变化
    canvas=np.ones((width,height,3),np.uint8)*255 #绘制画布
    cv.circle(canvas,(x,y),r,(255,0,0),-1) #绘制圆形
    #cv.imshow('qiuqiu', canvas)  # 在屏幕展示绘制圆形的效果
    time.sleep(1/1500) #每秒1500帧

#cv.waitKey()  # 图像不会自动关闭
cv.destroyAllWindows()  # 释放所有窗口

首先是引入相关模块:

import cv2 as cv # 引入CV模块
import time #引入time模块
import numpy as np #引入numpy模块

然后约定好绘制圆形的初始数据:

width,height=500,500 #输入画布大小
r=20 #设定圆心大小
x=r+200 #设定初始X轴坐标
y=r+200 #设定初始Y轴坐标
x_v=y_v=5 #设定初始移动速度

然后使用while函数创造会反向的弹球:

while cv.waitKey(1)==-1:
    if x>0.85*(width) or x<0.15*(width): #在画布宽度(15%-85%)的区间内,弹球可直线运行
        x_v *=-1 #在画布宽度的15%或者85%的位置,弹球将反向直线运行
    if y > 0.85*(height) or y < 0.15*(height) : #在画布高度(15%-85%)的区间内,弹球可直线运行
        y_v *= -1 #在画布高度的15%或者85%的位置,弹球将反向直线运行
    x+=x_v #圆心x随着速度变化
    y+=y_v #圆心y随着速度变化
    
    canvas=np.ones((width,height,3),np.uint8)*255 #绘制画布
    cv.circle(canvas,(x,y),r,(255,0,0),-1) #绘制圆形
    #cv.imshow('qiuqiu', canvas)  # 在屏幕展示绘制圆形的效果
    time.sleep(1/1500) #每秒1500帧
cv.destroyAllWindows()  # 释放所有窗口

运行代码后获得的弹球动画为:

python+opencv简单弹球

【4】细节说明

在while()函数中,使用x>0.85*(width) or x<0.15*(width)和y > 0.85*(height) or y < 0.15*(height)约定了弹球活动的范围,这样可以在比较清晰的界面中看到球体反弹。

此外我们会发现没有使用cv2.imwrite()函数来保存图像,因为保存后的图像并不容易打开,所以暂时未启用这个函数。

【5】总结

掌握了python+opencv绘制简单弹球动画的技巧。


http://www.kler.cn/a/470828.html

相关文章:

  • 智能工厂的设计软件 应用场景的一个例子: 为AI聊天工具添加一个知识系统 之24 重审 前端实现:主页页面
  • C#—Task异步的常用方法及TaskFactory工厂类详解
  • Functions
  • 解锁编程智慧:23种设计模式案例分享
  • (leetcode算法题)面试题 17.19. 消失的两个数字
  • C# 设计模式(行为型模式):责任链模式
  • 企业二要素如何用C#实现
  • Scala语言的数据库交互
  • STM32-笔记30-串口间的通信
  • python常见绘图及代码
  • 技术文档撰写之道:构建清晰准确的知识传递桥梁
  • 【Java设计模式-1】单例模式,Java世界的“独苗”
  • C++中decltype遇到引用类型时的隐藏陷阱
  • 算法解析-经典150(矩阵、哈希表)
  • Redis - 6 ( 9000 字 Redis 入门级教程 )
  • 【快速入门 LVGL】-- 1、STM32 工程移植 LVGL
  • 深入了解SCPI协议:半导体测试与仪器自动化的核心
  • C语言——字符函数和内存函数
  • pikachu靶场--目录遍历和敏感信息泄露
  • 概率基本概念 --- 离散型随机变量实例
  • NLP 中文拼写检测纠正论文-08-Combining ResNet and Transformer
  • React Router 向路由组件传state参数浏览器回退历史页面显示效果问题
  • Vue.js组件开发-在setup函数中使用provide
  • 41.5 nginx拦截prometheus查询请求使用lua脚本做promql的检查替换
  • 少儿编程|基于SSM+vue的少儿编程管理系统的设计与实现(源码+数据库+文档)
  • 云计算中的可用性SLA