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.
 

63 lines
2.3 KiB

# 実験課題11
# 3.11 トラッキング
import cv2
# Webカメラの初期化
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("カメラを開けませんでした.")
else:
# 最初の1フレームを読み込む
ret, frame = cap.read()
if not ret:
print("フレームを取得できませんでした.")
else:
# 追跡対象の選択
while True:
# ユーザーに追跡対象をマウスで選択させる
bbox = cv2.selectROI("Tracking", frame, fromCenter=False, showCrosshair=True)
# 幅 または が 0 の場合
if bbox[2] == 0 or bbox[3] == 0:
# continueによってループの先頭に戻り、再度selectROIを実行する
continue
else:
# 正しく領域が選択されたらループを抜けてトラッキング処理へ進む
break
# トラッカーの生成
tracker = cv2.TrackerCSRT_create()
# 最初のフレームと選択した領域を渡してトラッカーに学習させる
tracker.init(frame, bbox)
# トラッキングのループ処理
while True:
ret, frame = cap.read()
if not ret:
break
# 新しいフレームをトラッカーに渡し,対象がどこに移動したか推測させる
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()