いきなりだが,なんかですます調の方が書きやすいので変えようと思う.です.
本題に入ります.
市販のプロジェクタはきっちりと設計されたレンズを使用してるので,
レンズの歪みや収差が気になるなんてことはまずありません.
しかし,学生時代の私のようにレンズやらミラーやら色々組み合わせて謎の光学系を作っていると,
レンズ歪みや色収差が無視できないレベルで発生することがしばしばあります.
例えば,市販のプロジェクタの画角を広げるために強めの凹レンズをくっつけたりするとよく起きる問題です.
そんなことやらねーよって?やらないの?
今回は,glutベースのOpenGLアプリケーションに数行追加するだけで
レンズ歪み・色収差を補正できるソフトを作ったので紹介しようと思います.
glutがよくわからんという人は,きっともっとよくわからん記事だと思います.
まずは次の3つのファイルをダウンロードして下さい.
DistortionCorrection.h と DistortionCorrection.cpp が,歪み補正を実行するクラスを定義したファイルです.
Sample.cpp はこのクラスの使用方法を示したサンプルです.
VisualStudioで空のコンソールプロジェクトを作って3つのファイルを追加します.
glutは事前にインストールしておいて下さい.
コンパイルして実行すると,下図のような画面が出てきます.
キーボードで各種パラメータを調整します.
- r, g, b: RGBそれぞれの歪み係数を減らす
- Shift+r, g, b: RGBそれぞれの歪み係数を増やす
- ↑, ↓, ←, →: 歪みの中心を移動
- d: デバッグ表示をON/OFF
適当に調整したらこんな感じになります.
画面を投影しながら,できるだけ歪みや収差がなくなるようにパラメータを調整してください.
サンプルプログラムの使い方は以上です.
次に,DistortionCorrectionクラスの使い方を説明します.
まず,プロジェクトにDistortionCorrection.h と DistortionCorrection.cpp を突っ込んで,
glutのコールバック関数を定義しているファイルでヘッダをインクルードします.
#include "DistortionCorrection.h"
次に,クラスのインスタンスを作ります.
Sample.cppではめんどくさいのでグローバルにしています.
DistortionCorrection g_DC;
使用する関数は次の5つです.
初期化
g_DC.init();
色々初期化します.
glutの初期化が終わってからやった方がいいと思います.
歪み中心の指定
float cx = 400.0f; float cy = 300.0f; g_DC.setCenter(cx, cy);
歪みの中心を指定します.
単位はピクセルで,解像度に応じて設定して下さい.画面の左下が0です.
歪み系数の指定
float kR = 0.0005f; float kG = 0.0006f; float kB = 0.0007f; g_DC.setParams(kR, kG, kB);
RGBそれぞれの歪みパラメータを個別に設定します.
単位は謎です.結構小さくして下さい.
歪み補正実行
g_DC.runDC(); glutSwapBuffers();
歪み補正を実行します.
glutのディスプレイコールバック関数で,スワップバッファの直前で呼び出すと,
それまでに描画した画像を歪ませて描画します.
デバッグモード切り替え
g_DC.switchDebugMode();
デバッグモードをON/OFFします.
デバッグモード時にはRGB各色の格子模様と,各種パラメータが表示されます.
glutのフォント表示が結構重いので注意して下さい.
OFFならパフォーマンスはそれほど落ちないと思われます.
ね,簡単でしょ?
クラスの中身についての解説は要望があったらやるかもしれません.
きっとこのブログ見てる人ならソース読んだらわかるよね?
今は実験環境が無いのでちゃんと補正できてるか確証が無いのですが,多分大丈夫だと思います.
もしこのソフトを使ってうまくいった方がいましたら,ご一報頂けると幸いです.