OpenCVでのHDR動画の読み出しと書き出し
最近は、WindowsのAutoHDRという機能で、ゲームをすると自動的にHDRになり、ゲームキャプチャもHDR画質で録画されているのですが、OpenCVでHDRの動画を読み込み、書き出しをすると、元に比べて白っぽい動画が出力されてしまいます。
OpenCVはこういう変換も得意分野だろう、と思いながら、検索したのですがあまりぴったりの記事は見つかりませんでした。
Windows Copilotに相談してみるも、正しいコードは返答されませんでしたが、トーンマップで調整するんだ、ということだったので、その数値を変更して、私なりに元のHDR動画に近い印象のSDR動画を出力できるようになりました。
参考までにコードを載せておきます。
生成AIによるコードを直したものなので、もうちょっと良い適切なやり方があれば、教えてください。
よろしくお願いします。
opencv.py
import cv2
import numpy as np
def apply_tone_mapping(hdr_image):
# トーンマッピングアルゴリズムを選択(例:Reinhardのアルゴリズム)
tonemap = cv2.createTonemapReinhard(gamma=0.35)
# 32ビット浮動小数点型に変換
hdr_image = hdr_image.astype(np.float32) / 255.0
# トーンマップ
ldr_image = tonemap.process(hdr_image)
# NaNを0に置き換え
ldr_image = np.nan_to_num(ldr_image)
# 0-255の範囲にクリップ
ldr_image = np.clip(ldr_image * 255, 0, 255).astype(np.uint8)
return ldr_image
def main():
# HDR動画の読み込み
input_video_path = "****.mp4"
output_video_path = "****.mp4"
cap = cv2.VideoCapture(input_video_path)
fps = int(cap.get(cv2.CAP_PROP_FPS))
frame_size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
# 動画書き出しの設定
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter(output_video_path, fourcc, fps, frame_size)
while True:
ret, hdr_frame = cap.read()
if not ret:
break
ldr_frame = apply_tone_mapping(hdr_frame)
# 動画書き出し
out.write(ldr_frame)
cap.release()
out.release()
print(f"動画を {output_video_path} に保存しました。")
if __name__ == "__main__":
main()