import cv2, 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)
cv2.destroyAllWindows()
使用 OpenCV 库创建了一个简单的动画,显示了一个红色的球(或圆圈)在白色背景上以弹跳的方式移动。下面是代码的逐行解释:
import cv2, time
:
导入 OpenCV 库和time
模块。OpenCV 用于图像处理和视频捕获,time
用于控制动画的帧率。import numpy as np
:
导入 NumPy 库,它在图像处理中广泛用于数组操作。width, height = 200, 200
:
设置图像的宽度和高度,都为 200 像素。r = 20
:
设置圆的半径为 20 像素。x = r + 20
:
设置圆心的初始 x 坐标为半径加上 20 像素,以确保圆完全显示在图像内。y = r + 100
:
设置圆心的初始 y 坐标为半径加上 100 像素。x_offer = y_offer = 4
:
设置 x 和 y 方向上的初始速度(步长),这里都为 4 像素/帧。while cv2.waitKey(1) == -1
:
开始一个无限循环,循环的条件是用户没有按下任何键(cv2.waitKey(1)
返回-1
表示没有按键输入)。
9-10. if x > width - r or x < r: x_offer *= -1
:
如果 x 坐标超出了图像的宽度减去半径的范围,或者小于半径,就反转 x 方向上的速度。
11-12. if y > height - r or y < r: y_offer *= -1
:
如果 y 坐标超出了图像的高度减去半径的范围,或者小于半径,就反转 y 方向上的速度。
x += x_offer
:
根据 x 方向上的速度更新 x 坐标。y += y_offer
:
根据 y 方向上的速度更新 y 坐标。img = np.ones((width, height, 3), np.uint8) * 255
:
创建一个新的白色背景图像,图像大小为width
xheight
,颜色通道为 3(RGB),所有像素点的值都初始化为 255(白色)。cv2.circle(img, (x, y), r, (255, 0, 0), -1)
:
在白色背景图像上绘制一个半径为r
的红色圆,圆心坐标为(x, y)
,颜色为红色(255, 0, 0)
,-1
表示填充整个圆。cv2.imshow("img", img)
:
显示图像img
,窗口标题为 "img"。time.sleep(1 / 60)
:
暂停当前线程 1/60 秒,以控制动画的帧率为 60 FPS(每秒 60 帧)。cv2.destroyAllWindows()
:
当用户按下按键时,结束显示所有 OpenCV 创建的窗口。