You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
3.9 KiB
87 lines
3.9 KiB
# 実験課題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() |