遇到一个坑,plot动画update init返回值需要逗号,不然报错
代码如下:
import cv2
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
path = r'./t3.mp4'
cap = cv2.VideoCapture(path)
def get_threshold(image):
_,image = cv2.threshold(image,220,255,cv2.THRESH_BINARY)
return image
def show_image(image,num=0):
name = 'num is '+str(num)
#h,w = image.shape
# h,w = int(h*0.5),int(w*0.5)
cv2.namedWindow(name,0)
#cv2.resizeWindow(name,w,h)
cv2.imshow(name,image)
cv2.waitKey(1000)
cv2.destroyAllWindows()
def get_box(image):
image_map = np.zeros(image.shape)
_,contours,h = cv2.findContours(image,0,1)
for contour in contours:
eps = 1e-3 * cv2.arcLength(contour,True)
#拟合多边形
approx = cv2.approxPolyDP(contour,eps,True)
#提取矩形
rect = cv2.minAreaRect(approx)
#提取矩形坐标
box = cv2.boxPoints(rect)
box = np.int0(box)
center_x = (box[0][0]+box[2][0])/2
center_y = (box[0][1]+box[2][1])/2
return center_x,center_y
x_list = []
y_list = []
xdata = []
ydata = []
#配置画布尺寸
fig = plt.figure()
ax = plt.axes(xlim=(0,2000),ylim=(0,1000))
scatters = plt.scatter(xdata, ydata, marker = 'o', color = 'green',s=120)
def init():
return scatters,
def update(frame):
print(frame)
xdata.append(frame[0])
ydata.append(frame[1])
#scatters.set_data(xdata,ydata)
scatters = plt.scatter(xdata, ydata, marker = 'o', color = 'green',s=10)
return scatters,
def get_data_list(x_list,y_list):
num = len(x_list)
data_list = []
for i in range(num):
data_list.append([x_list[i],y_list[i]])
return data_list
try:
while (cap.isOpened()):
ret,frame = cap.read()
image = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
image = get_threshold(image)
center_x,center_y = get_box(image)
x_list.append(center_x)
y_list.append(center_y)
#show_image(image)
except Exception as e:
print(e)
finally:
#data_list = np.stack([x_list,y_list],axis=1)
data_list = get_data_list(x_list,y_list)
ani = FuncAnimation(
fig = fig,
func = update,
frames = data_list,
interval=10,
init_func=init,
blit = True
)
ani.save('points.gif',writer = 'imagemagick')
plt.show()
效果图如下: