# 実験課題11 # 3.11 トラッキング(任意) import cv2 # Webカメラの初期化 cap = cv2.VideoCapture(0) if not cap.isOpened(): print("カメラを開けませんでした。") else: print("トラッキングテストを開始します。") # 最初の1フレームを読み込む ret, frame = cap.read() if not ret: print("フレームを取得できませんでした。") else: # --- 追跡対象の選択(ROI) --- print("【操作方法】") print("1. 追跡したい物体をマウスでドラッグして四角く囲んでください。") print("2. 囲んだら Enter または Space キーを押して決定します。") print("3. やり直す場合は 'c' キーを押してください。") # ユーザーに追跡対象をマウスで選択させるウィンドウを表示 # bbox には選択された領域の (x, y, w, h) が格納される while True: # ユーザーに追跡対象をマウスで選択させる bbox = cv2.selectROI("Tracking", frame, fromCenter=False, showCrosshair=True) # 幅(bbox[2]) または 高さ(bbox[3]) が 0 の場合 # ('c'キーが押された、または未選択のままEnterが押された場合) if bbox[2] == 0 or bbox[3] == 0: print("領域がリセットされました。やり直します。") print("もう一度マウスをドラッグして対象を囲み、Enterキーを押してください。") # continueによってループの先頭に戻り、再度selectROIを実行する continue else: # 正しく領域が選択されたらループを抜けてトラッキング処理へ進む print("領域が確定しました。トラッキングを開始します。") break # --- トラッカーの生成と初期化 --- # 拡張モジュールに含まれる高精度なトラッカー「CSRT」を生成 # ※OpenCVのバージョンによっては legacy に分類されるため、try-exceptで安全に呼び出す try: tracker = cv2.TrackerCSRT_create() except AttributeError: tracker = cv2.legacy.TrackerCSRT_create() # 最初のフレームと、選択した領域(bbox)を渡してトラッカーに学習(初期化)させる tracker.init(frame, bbox) print("追跡中... 終了するには 'q' キーを押してください。") # --- トラッキングのループ処理 --- while True: ret, frame = cap.read() if not ret: break # 新しいフレームをトラッカーに渡し、対象がどこに移動したか推測させる # success: 追跡成功(True) / 失敗(False) # bbox: 新しい座標とサイズ (x, y, w, h) success, bbox = tracker.update(frame) if success: # 追跡成功時:新しい座標を整数に変換して青い枠線を描画 p1 = (int(bbox[0]), int(bbox[1])) p2 = (int(bbox[0] + bbox[2]), int(bbox[1] + bbox[3])) cv2.rectangle(frame, p1, p2, (255, 0, 0), 2, 1) cv2.putText(frame, "Tracking", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 0), 2) else: # 追跡失敗時(画面外に出た、何かの裏に完全に隠れた等):赤い警告文を表示 cv2.putText(frame, "Lost", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2) # 結果の表示 cv2.imshow("Tracking", frame) # 'q' キーで終了 if cv2.waitKey(1) & 0xFF == ord('q'): break # 終了処理 cap.release() cv2.destroyAllWindows()