import cv2
import numpy as np

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

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

# アキュムレータ(加重平均のための画像)を初期化
accumulator = None

# カメラが30fpsであるため、1秒に1回エッジ検出を行う
fps = 30
frame_count = 0

alpha = 0.1 # エクスポネンシャル平滑化のための重み

try:
    while True:
        ret, frame = cap.read()
        
        if not ret:
            break
        
        frame_count += 1
        
        # グレースケールに変換
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        
        # 適応的ヒストグラム均一化(CLAHE)
        clahe_applied = clahe.apply(gray)
        
        if accumulator is None:
            # アキュムレータを初期化(最初のフレームの形状に合わせる)
            accumulator = np.float32(clahe_applied)
        
        # エクスポネンシャル平滑化を適用
        cv2.accumulateWeighted(clahe_applied, accumulator, alpha)
        
        # 約1秒ごとにエッジ検出
        if frame_count % fps == 0:
            # アキュムレータをuint8に変換
            result_frame = cv2.convertScaleAbs(accumulator)
            
            # Cannyエッジ検出
            edges = cv2.Canny(result_frame, 100, 200)
            
            # エッジ検出結果の表示
            cv2.imshow('Edges', edges)
            
            frame_count = 0 # フレームカウンタをリセット
        
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
finally:
    cap.release()
    cv2.destroyAllWindows()