見出し画像

GoProの歪み補正をしたい

はじめに

目的

  • GoProの動画をpythonを使って適当に歪み補正したい

  • 歪み補正について参考になるサイトをまとめる

対象

  • GoProで撮影した動画を使って物体検知や速度取得などをしたい人

  • その前処理で困ってる人

  • 普段画像処理などしない人

メモ

zennを作ったのでそちらでまとめようとしたが,飲酒しながら記事を書いているためmarkdownを使うのが面倒でnoteで書くことにした.noteは自由度は少ないけど,楽にかけてよいですね.


プログラム

今時ChatGPT3.5を使っている大学院生は自分くらいかもしれませんが,とりあえず要求をまとめてそれなりのコードを作成してもらった.(と言っても自分で結構修正したけど)

pythonのインストール

PCにpythonは入っているものとします.インストールしていない場合は,自分が撮影した動画などを参考にしてみてください.

ライブラリのインポート

ライブラリというのは便利なツールセットのようなものだと思って下さい.
画像処理などではOpenCVが多く使われています.pythonのために用意されたOpenCVを使えるようにしましょう.

コマンドプロンプトやVSCodeのterminalなどで以下を実行してください.

pip install opencv-python
pip install numpy

一応確認のために以下を実行して,リストの中にopencv-pythonが入っていれば成功です.

pip list

実際のプログラム

適当にフォルダを用意してください.その中に歪み補正したい動画と以下のpythonファイルを入れてください.フォルダの場所が変わるとpathの設定をカスタマイズする必要が出てきます.

例として,sampleというフォルダを作ったとします.その中にsample.pyとsample.mp4があるとします.

以下をsample.pyにコピペします.

import cv2
import numpy as np

def undistort_gopro_video(input_path, output_path):
    # GoProの歪み補正パラメータ(多分適当なのでキャリブレーションの必要アリ)
    k1, k2, k3, p1, p2 = -0.3535, 0.1736, 0.0306, 0, 0
    
    # 入力動画ファイルの読み込み
    cap = cv2.VideoCapture(input_path)
    
    # 入力動画のプロパティを取得
    width = int(cap.get(3))
    height = int(cap.get(4))
    
    # カメラ行列を作成
    camera_matrix = np.array([[width, 0, width / 2], [0, height, height / 2], [0, 0, 1]], dtype=np.float32)
    
    # 歪み補正係数を作成
    dist_coeffs = np.array([k1, k2, p1, p2, k3], dtype=np.float32)
    
    # 歪み補正マップを作成
    new_camera_matrix, roi = cv2.getOptimalNewCameraMatrix(camera_matrix, dist_coeffs, (width, height), 1, (width, height))
    mapx, mapy = cv2.initUndistortRectifyMap(camera_matrix, dist_coeffs, None, new_camera_matrix, (width, height), 5)
    
    # 出力動画ファイルの設定
    fourcc = cv2.VideoWriter_fourcc(*'XVID')
    out = cv2.VideoWriter(output_path, fourcc, 30.0, (width, height))
    
    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break
        
        # 歪み補正を適用
        undistorted_frame = cv2.remap(frame, mapx, mapy, cv2.INTER_LINEAR)
        
        # 歪み補正後のフレームを書き込み
        out.write(undistorted_frame)
        
        cv2.imshow('Undistorted Video', undistorted_frame)
        
        # 'q'キーで終了
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    
    # 後処理
    cap.release()
    out.release()
    cv2.destroyAllWindows()

if __name__ == "__main__":
    path = "sample.mp4"
    input_video_path = path
    output_video_path = "mod_"+path
    
    undistort_gopro_video(input_video_path, output_video_path)

そして,実行してください.

python sample.py

sampleファルダの中に,mod_sample.mp4が出来ていれば成功です.


歪み補正について少し勉強

GoProは案外使われているイメージでしたが,あまり記事がない印象でした.

基本的には,OpenCVが出しているカメラ・キャリブレーションの内容を参考にしたらよさそうだった.

主な歪みを放射状歪みと接戦歪みの2つとして,それぞれを補正するために5つのパラメータが必要らしい.

GoPro公式で歪み係数やカメラ行列などを公開してくれていれば嬉しいのがだパッと見つからなかった.

一応色々値を纏めてくださっている方もいた.

しかし,おそらくない機種もあるので,自分でキャリブレーションする必要がある.なので,白黒のチェスボードと言われるものを使ってキャリブレーションする.以下の記事を参考.

カメラ撮影時の状況などには依存しないはずなので,これらでパラメータを推定してその値を使うという感じ?

実験する際は,このチェスボードをどこかに置いておくなどするとよいかも.


物体検出のリンクもメモ

物体検出について

これを明日試してみる.



おわりに

実験用の動画しか今ないので,別途用意してまた追記したいと思います.
以上.


この記事が参加している募集

今日の振り返り

人工衛星を大学で開発しています! いずれは宇宙や衛星,ロケットを題材とした高校生や一般向けの教材を作りたいと考えています!! もしよろしければ応援していただければと思います! 教材をkindleで売る費用や活動費(インタビュなど)で使わせていただきます.