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

发布于:2025-02-11 ⋅ 阅读:(72) ⋅ 点赞:(0)

【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绘制简单弹球动画的技巧。