图像识别(四)光点的运动轨迹

本文介绍了一个利用Python中的Matplotlib和OpenCV库创建动态轨迹动画的实例。通过从视频文件中读取帧并提取关键点,然后在Matplotlib画布上绘制这些点的轨迹,形成了一个动态更新的动画。特别注意了在动画更新函数中正确返回多个对象以避免错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

遇到一个坑,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()

效果图如下:
在这里插入图片描述

要实现STM32控制光点进行圆周运动的系统,我们可以采取一些方法。 首先,我们需要使用STM32的GPIO功能来控制光源的开关。通过设置特定的引脚为输出模式,并在程序中通过控制该引脚的高低电平来控制光源的开关。 接下来,我们需要使用STM32的定时器功能来生成一定的PWM信号。PWM信号可以用来控制光源的亮度。通过调整PWM信号的占空比,我们可以实现光源的亮度调节。 然后,我们需要使用STM32的ADC功能来读取光电二极管接收到的光信号强度。根据读取到的光信号强度,我们可以判断光点当前位置是否满足圆周运动的条件。 如何实现光点的圆周运动呢?可以采用正弦函数或余弦函数来生成光点的x和y坐标。根据时间的变化,逐渐改变正弦函数或余弦函数的参数,从而实现光点的圆周运动。 最后,我们需要在程序中对光点的位置进行更新,并不断循环执行上述步骤,从而实现连续不断的光点圆周运动。 为了精确控制光点的圆周运动,我们还可以通过外部传感器来辅助。例如,可以使用编码器来检测马达的角度,从而实现精确的光点位置控制。 总结起来,要实现STM32控制光点进行圆周运动的系统,我们需要利用STM32的GPIO、定时器、ADC等功能,结合正弦函数或余弦函数,以及外部传感器来实现光点的圆周运动。这样的系统可以应用于需要展示旋转或循环运动的场景中,例如照明系统或艺术装置等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值