import cv2
import numpy as np

# カメラのキャプチャを開始
cap = cv2.VideoCapture(0)

# CLAHEオブジェクトの作成
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))

# カメラが30fpsであるため、1秒に1回エッジ検出を行う
fps = 30 # フレームレート
frame_count = 0 # 処理したフレーム数をカウント

try:
    while True:
        # フレームを読み込む
        ret, frame = cap.read()
        
        if not ret:
            break # フレームが読み込めなかった場合は終了
        
        frame_count += 1
        
        # 30フレームごと(約1秒ごと)にエッジ検出を行う
        if frame_count % fps == 0:
            # グレースケールに変換
            gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
            
            # 適応的ヒストグラム均一化(CLAHE)
            clahe_applied = clahe.apply(gray)
            
            # ガウス平滑化
            blurred = cv2.GaussianBlur(clahe_applied, (5, 5), 0)
            
            # Cannyエッジ検出
            edges = cv2.Canny(blurred, 100, 200)
            
            # エッジ検出結果の表示
            cv2.imshow('Edges', edges)
            
            # 結果をリセット
            frame_count = 0
        
        # qキーを押して終了
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
finally:
    cap.release()
    cv2.destroyAllWindows()