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()