在Python中使用 OpenCV 动画图像
在本文中,我们将讨论如何使用 python 的 OpenCV 模块为图像制作动画。
假设我们有一个图像。使用该单个图像,我们将以这样的方式对其进行动画处理,使其显示为同一图像的连续阵列。这对于在某些游戏中为背景设置动画很有用。例如,在一个飞扬的小鸟游戏中,要让小鸟看起来向前移动,背景需要向后移动。为了理解这一点,让我们首先考虑一个线性Python列表。考虑一下下面的代码。
Python3
a = ['-', '-', '-', 1, '-', '-', '-']
n = len(a) # length of the array
for i in range(2*n):
# i is the index of the list a
# i%n will have a value in range(0,n)
# using slicing we can make the digit 1
# appear to move across the list
# this is similar to a cyclic list
print(a[(i % n):]+a[:(i % n)])
Python3
import cv2
import numpy as np
img = cv2.imread('shinchan.jpg')
height, width, c = img.shape
i = 0
while True:
i += 1
# divided the image into left and right part
# like list concatenation we concatenated
# right and left together
l = img[:, :(i % width)]
r = img[:, (i % width):]
img1 = np.hstack((r, l))
# this function will concatenate
# the two matrices
cv2.imshow('animation', img1)
if cv2.waitKey(1) == ord('q'):
# press q to terminate the loop
cv2.destroyAllWindows()
break
输出:
['-', '-', '-', 1, '-', '-', '-']
['-', '-', 1, '-', '-', '-', '-']
['-', 1, '-', '-', '-', '-', '-']
[1, '-', '-', '-', '-', '-', '-']
['-', '-', '-', '-', '-', '-', 1]
['-', '-', '-', '-', '-', 1, '-']
['-', '-', '-', '-', 1, '-', '-']
['-', '-', '-', 1, '-', '-', '-']
['-', '-', 1, '-', '-', '-', '-']
['-', 1, '-', '-', '-', '-', '-']
[1, '-', '-', '-', '-', '-', '-']
['-', '-', '-', '-', '-', '-', 1]
['-', '-', '-', '-', '-', 1, '-']
['-', '-', '-', '-', 1, '-', '-']
从上面的代码中,我们可以看到数字 1 的位置在变化,即索引在变化。这是我们将用于水平动画图像的原理。
我们将使用 NumPy 模块中的 hstack()函数连接两个图像。 hstack函数将包含数组顺序的元组作为参数,用于将输入数组的序列水平(即按列)堆叠以形成单个数组。
语法:
numpy.hstack((array1,array2))
示例:
Python3
import cv2
import numpy as np
img = cv2.imread('shinchan.jpg')
height, width, c = img.shape
i = 0
while True:
i += 1
# divided the image into left and right part
# like list concatenation we concatenated
# right and left together
l = img[:, :(i % width)]
r = img[:, (i % width):]
img1 = np.hstack((r, l))
# this function will concatenate
# the two matrices
cv2.imshow('animation', img1)
if cv2.waitKey(1) == ord('q'):
# press q to terminate the loop
cv2.destroyAllWindows()
break
输出: