+
85
-

回答

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

800_auto

具体实现代码如下:

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()

网友回复

我知道答案,我要回答