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