import cv2
import numpy as np

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

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

# リングバッファの初期化
buffer_size = 30 # 30フレーム分を保持
frame_buffer = []
frame_count = 0

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 len(frame_buffer) < buffer_size:
            frame_buffer.append(clahe_applied)
        else:
            frame_buffer[frame_count % buffer_size] = clahe_applied
        
        # 約1秒ごとにエッジ検出
        if frame_count % buffer_size == 0:
            # バッファ内のフレームの平均を計算
            avg_frame = np.mean(frame_buffer, axis=0).astype(np.uint8)
            
            # Cannyエッジ検出
            edges = cv2.Canny(avg_frame, 100, 200)
            
            # エッジ検出結果の表示
            cv2.imshow('Edges', edges)
        
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
finally:
    cap.release()
    cv2.destroyAllWindows()