ython-opencv检测跟踪视频中运动目标,在视频中标定红框并在视频中标注目标的运动速度,给出完整代码
时间: 2024-10-11 16:18:03 浏览: 52
在Python中,我们可以结合OpenCV (Open Source Computer Vision Library) 和其强大的物体识别和跟踪功能来实现在视频中检测并追踪运动目标。同时,通过计算帧间的差分来估计目标的运动速度。下面是一个基本的步骤和代码示例:
```python
import cv2
import numpy as np
# 视频读取
cap = cv2.VideoCapture('video.mp4')
# 创建BackgroundSubtractorMOG2对象
back_sub = cv2.createBackgroundSubtractorMOG2()
while True:
# 读取一帧
ret, frame = cap.read()
if not ret:
break
# 预处理图像,减去背景
fgmask = back_sub.apply(frame)
# 转二值化
_, thresh = cv2.threshold(fgmask, 200, 255, cv2.THRESH_BINARY)
# 寻找轮廓
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 遍历轮廓并追踪每个目标
for contour in contours:
x, y, w, h = cv2.boundingRect(contour)
# 绘制红色矩形
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 0, 255), 2)
# 计算上一帧的位置和当前帧的位置
if 'prev_frame' in locals() and len(contours) > 1: # 假设存在上一帧并且有多于一个目标
prev_x, prev_y = prev_frame[contour].center
curr_x, curr_y = contour.center
# 运动矢量
dx, dy = curr_x - prev_x, curr_y - prev_y
speed = np.sqrt(dx**2 + dy**2) / (1/fps) # 假设fps是视频的帧率
# 显示速度信息
cv2.putText(frame, f"Speed: {speed:.2f} px/s", (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1)
# 更新上一帧的目标位置
prev_frame = contour.copy()
# 显示结果
cv2.imshow('Motion Detection', frame)
# 按'q'键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 清理资源
cap.release()
cv2.destroyAllWindows()
```
注意:这个例子假设你已经有一个视频文件`video.mp4`,并需要计算连续帧之间的平均速度。`fps`变量是视频的帧率,通常可以在`cap.get(cv2.CAP_PROP_FPS)`中获取。此外,实际应用中可能需要对目标进行更复杂的特征匹配来提高跟踪精度。
阅读全文