# -*- coding: utf-8 -*-
"""
OpenCVカメラキャプチャプログラム
=====================================

概要:
    OpenCVライブラリを使用してWebカメラからリアルタイム映像を取得・表示する
    基本的なコンピュータビジョンプログラム。

機能:
    - Webカメラのリアルタイム映像表示
    - ESCキーによる終了機能
    - エラーハンドリング
    - メモリリソースの適切な解放

使用方法:
    python camera.py

操作方法:
    - ESCキー: プログラム終了
    - ウィンドウのXボタン: プログラム終了

必要なライブラリ:
    - opencv-python (cv2)

インストール方法:
    pip install opencv-python

注意事項:
    - Webカメラが接続されている必要があります
    - カメラアクセス許可が必要な場合があります
    - 複数のカメラがある場合、デバイスIDを変更してください

技術仕様:
    - デフォルトカメラデバイス: ID 0
    - フレームレート: カメラ依存
    - 解像度: カメラデフォルト設定

作成者: 中田康史 (Yasufumi Nakata)
最終更新: 2025年
"""

import cv2
import sys

def main():
    """
    メイン処理関数
    カメラの初期化、映像表示ループ、リソース解放を実行
    """
    print("🎥 OpenCVカメラキャプチャプログラムを開始します...")
    print("=" * 50)
    print("操作方法:")
    print("  - ESCキー: プログラム終了")
    print("  - ウィンドウのXボタン: プログラム終了")
    print("=" * 50)

    # カメラの初期化（デバイスID: 0 = デフォルトカメラ）
    print("📹 カメラを初期化中...")
    cap = cv2.VideoCapture(0)

    # カメラの接続確認
    if not cap.isOpened():
        print("❌ エラー: カメラに接続できませんでした。")
        print("   以下の点を確認してください:")
        print("   - Webカメラが正しく接続されているか")
        print("   - 他のアプリケーションがカメラを使用していないか")
        print("   - カメラのアクセス許可が有効になっているか")
        return 1

    # カメラ情報の表示
    width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    fps = cap.get(cv2.CAP_PROP_FPS)

    print(f"✅ カメラが正常に初期化されました。")
    print(f"   解像度: {width} x {height}")
    print(f"   FPS: {fps:.1f}")
    print("   ESCキーを押すと終了します。")

    try:
        frame_count = 0

        # メインループ: カメラ映像の連続取得・表示
        while True:
            # フレームの取得
            ret, frame = cap.read()

            # フレーム取得の確認
            if not ret:
                print("⚠️  警告: フレームの取得に失敗しました。")
                break

            frame_count += 1

            # フレーム情報をオーバーレイ表示
            info_text = f"Frame: {frame_count} | Press ESC to exit"
            cv2.putText(frame, info_text, (10, 30),
                       cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)

            # 映像をウィンドウに表示
            cv2.imshow('Camera Feed - Yasufumi Nakata', frame)

            # キー入力の監視（10ms間隔）
            key = cv2.waitKey(10) & 0xFF

            # ESCキー（ASCII: 27）で終了
            if key == 27:
                print("🛑 ESCキーが押されました。プログラムを終了します。")
                break

            # ウィンドウが閉じられた場合の処理
            if cv2.getWindowProperty('Camera Feed - Yasufumi Nakata',
                                   cv2.WND_PROP_VISIBLE) < 1:
                print("🛑 ウィンドウが閉じられました。プログラムを終了します。")
                break

    except KeyboardInterrupt:
        print("\n🛑 Ctrl+Cが押されました。プログラムを終了します。")

    except Exception as e:
        print(f"❌ 予期しないエラーが発生しました: {e}")
        return 1

    finally:
        # リソースの適切な解放
        print("🧹 リソースを解放中...")
        cap.release()
        cv2.destroyAllWindows()
        print(f"✅ プログラムが正常に終了しました。（処理フレーム数: {frame_count}）")

    return 0

if __name__ == "__main__":
    """
    スクリプトが直接実行された場合のエントリーポイント
    """
    exit_code = main()
    sys.exit(exit_code)
