利用python写一个基于卡尔曼滤波的视频单目标跟踪
时间: 2023-06-14 10:04:39 浏览: 105
好的,下面是一个简单的基于卡尔曼滤波的视频单目标跟踪的实现代码:
```python
import cv2
import numpy as np
# 初始化测量坐标和卡尔曼滤波器参数
meas = np.array((2, 1), dtype=np.float32)
pred = np.zeros((2, 1), dtype=np.float32)
frame = None
# 创建卡尔曼滤波器对象
kalman = cv2.KalmanFilter(4, 2)
kalman.measurementMatrix = np.array([[1, 0, 0, 0], [0, 1, 0, 0]], np.float32)
kalman.transitionMatrix = np.array([[1, 0, 1, 0], [0, 1, 0, 1], [0, 0, 1, 0], [0, 0, 0, 1]], np.float32)
kalman.processNoiseCov = np.array([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]], np.float32) * 0.03
# 打开摄像头
cap = cv2.VideoCapture(0)
while True:
# 读取摄像头帧
ret, frame = cap.read()
# 转换帧为灰度图像
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 检测人脸
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
# 如果检测到人脸,则进行跟踪
if len(faces) > 0:
# 获取人脸中心坐标
x, y, w, h = faces[0]
meas[0] = np.float32(x + w / 2)
meas[1] = np.float32(y + h / 2)
# 进行卡尔曼滤波预测
kalman.predict()
kalman.correct(meas)
# 绘制跟踪结果
x, y = int(kalman.statePost[0]), int(kalman.statePost[1])
cv2.rectangle(frame, (x - w // 2, y - h // 2), (x + w // 2, y + h // 2), (0, 255, 0), 2)
cv2.circle(frame, (x, y), 2, (0, 255, 0), -1)
# 显示跟踪结果
cv2.imshow('Kalman Tracking', frame)
if cv2.waitKey(30) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
```
在该代码中,我们使用OpenCV的KalmanFilter类创建了一个卡尔曼滤波器对象,然后在每帧中使用Haar级联检测器检测人脸,获取人脸中心坐标,并将其作为测量坐标传递给卡尔曼滤波器。然后,我们使用kalman.predict()函数进行预测,并使用kalman.correct()函数将测量坐标与预测坐标进行卡尔曼滤波纠正。最后,我们在帧上绘制跟踪结果并显示结果。
阅读全文