可以使用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()
网友回复