卡尔曼滤波追踪移动目标的python opencv代码
时间: 2023-10-08 12:08:54 浏览: 126
以下是一个简单的卡尔曼滤波器追踪移动目标的 Python OpenCV 代码示例。在此示例中,我们将使用卡尔曼滤波器来跟踪在视频中移动的目标。
```python
import cv2
import numpy as np
# 初始化卡尔曼滤波器
kf = cv2.KalmanFilter(4, 2)
kf.measurementMatrix = np.array([[1, 0, 0, 0], [0, 1, 0, 0]], dtype=np.float32)
kf.transitionMatrix = np.array([[1, 0, 1, 0], [0, 1, 0, 1], [0, 0, 1, 0], [0, 0, 0, 1]], dtype=np.float32)
kf.processNoiseCov = np.array([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]], dtype=np.float32) * 0.03
# 打开视频
cap = cv2.VideoCapture('test.mp4')
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# 在第一帧上选择 ROI
if cv2.waitKey(1) & 0xFF == ord('s'):
x, y, w, h = cv2.selectROI('frame', frame, False)
kf.statePost = np.array([[x], [y], [0], [0]], dtype=np.float32)
# 对当前帧进行预测
kf.predict()
# 从当前帧中获取测量值
measurement = np.array([[np.float32(x + w / 2)], [np.float32(y + h / 2)]], dtype=np.float32)
# 进行校正
kf.correct(measurement)
# 获取预测值并绘制边界框
prediction = kf.predict()
cv2.rectangle(frame, (int(prediction[0]), int(prediction[1])), (int(prediction[0] + w), int(prediction[1] + h)), (255, 0, 0), 2)
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
```
在此代码示例中,我们首先初始化了一个 4 维、2 个测量值的 KalmanFilter 对象。然后,我们设置了卡尔曼滤波器的状态转移矩阵、测量矩阵和过程噪声协方差矩阵。在每个视频帧中,我们首先调用 `predict()` 函数来预测目标的位置,然后从帧中获取测量值并调用 `correct()` 函数对预测值进行校正。最后,我们使用预测值绘制目标的边界框。
请注意,此示例仅用于演示卡尔曼滤波器的基本用法,并且可能需要进行一些调整才能适用于您的特定应用程序。
阅读全文