可以使用OpenCV的内置跟踪器,效果可能因环境和跟踪对象而异。如果跟踪效果不理想,您可以尝试其他类型的跟踪器,如MOSSE、CSRT等。跟踪可能会在物体快速移动、遮挡或光线变化时失效。

具体实现代码如下:
import cv2
def initialize_tracker(frame):
"""初始化跟踪器并选择ROI"""
tracker = cv2.TrackerKCF_create()
roi = cv2.selectROI('Select ROI', frame, False)
tracker.init(frame, roi)
return tracker, roi
def main():
# 初始化视频捕获
cap = cv2.VideoCapture(0) # 使用默认摄像头,如果有多个摄像头,可以尝试更改这个数字
if not cap.isOpened():
print("无法打开摄像头")
exit()
# 读取一帧图像
ret, frame = cap.read()
if not ret:
print("无法获取图像")
cap.release()
exit()
# 初始化跟踪器并选择ROI
tracker, roi = initialize_tracker(frame)
tracking = True
# 主循环
while True:
ret, frame = cap.read()
if not ret:
print("无法获取图像")
break
if tracking:
# 更新跟踪器
success, box = tracker.update(frame)
if success:
# 绘制边界框
x, y, w, h = [int(v) for v in box]
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
else:
cv2.putText(frame, "Tracking failure detected", (100, 80), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2)
# 显示帧
cv2.imshow('Tracking', frame)
# 等待键盘输入
key = cv2.waitKey(1) & 0xFF
if key == ord('q'): # 按 'q' 退出
break
elif key == ord('r'): # 按 'r' 重新选择ROI
cv2.destroyWindow('Select ROI')
tracker, roi = initialize_tracker(frame)
tracking = True
# 释放资源
cap.release()
cv2.destroyAllWindows()
if __name__ == "__main__":
main() 网友回复


