実行プログラムの準備
OpenCVのカメラキャリブレーションは、サンプルに付属の calibration.cpp をそのまま利用します。
ソースからビルドする場合
ViualStudio(Expressバージョンは無料で利用可能)が必要
- OpenCV 1.0 は下記のリンクから OpenCV1_1.0.exe(セルフ解凍インストーラー)をダウンロードできます。
- c:\OpenCV1.0 としてインストールする
- VisualStudioを起動する
- New プロジェクトで、Windows コンソールプログラムのプロジェクトを設定
- samples/c/calibration.cpp をプロジェクトフォルダーにコピー
- プロパティから includeパスに以下のパスを追加
- c:\OpenCV1.0\cv\include
- c:\OpenCV1.0\cvaux\include
- c:\OpenCV1.0\cxcore\include
- c:\OpenCV1.0\otherlibs\highgui
- プロパティの libパスに以下のパスを追加
- ビルド
- 実行時には、c:\OpenCV1.0\bin が環境変数PATHに追加されている必要がある(もしくは、必要なcv100.dllなどを実行ファイルと同じ場所にコピーする)
プレビルドパッケージをダンロードする場合
- ソースからビルドして必要なDLLを同梱したプログラムを
キャリブレーションパターンの印刷
- OpenCVのカメラキャリブレーションでは、市松模様の平面パターンを使います.下のA4版パターンのダウンロードする
- PDFの印刷は、用紙に合わせて印刷。用紙は、光沢が無いほうが良い。
- 印刷した格子の1辺の長さをものさしで実測(自分の環境では、A4で印刷して、横の最大長さ272mm/14ブロック=19.429mm)
- このパターンでは、横x縦有効点数は13x9 となる
- できるだけ平面の板に、貼り付ける
キャリブレーションをカメラで撮影
- キャリブレーションのパターンが全て収まるように、かつ、画面いっぱいになるように、傾き方が異なる複数の画像を5枚以上準備する
- 複数の画像のファイル名を1行づつ記載した画像ファイルリストのテキストファイルを作成する.以下、リストのファイルを imglist.txt とする。
screen-0001.tif
screen-0002.tif
screen-0003.tif
screen-0004.tif
screen-0005.tif
プログラムの使い方
calibration プログラムの引数
-w <board_width> : 市松模様の内側の交点の数<横>
-h <board_height> : 市松模様の内側の交点の数<縦>
-n <number_of_frames> : フレーム数
-d <delay> : ライブモードでの次のフレームを取るまでの時間
-s <square_size> : 1つのブロックの長さ
-o <out_camera_params> : 出力パラメータのファイル名
-op : 検出点の位置を出力
-oe : ボードの位置姿勢のパラメータを出力
-zt : tangential 歪みを0とする
-a : 画素のアスペクト比 ( fx / fy )
-p :主点位置を固定して推定
-v : 画像を垂直方向にフリップ
input_data : 画像ファイルリストを記述したファイル名
サンプルのキャリブレーションパターンを利用した場合の引数の例
cameracalib.exe -w 13 -h 9 -s 19.429 -o camparam.txt imglist.txt
- 市松模様の内部の交点は 13x9, 一つのブロックの長さは 19.429mm
- 出力をcamparam.txt として指定
- 複数のキャリブレーションパターンを撮影した画像ファイルのリストの名前は imglist.txt
実行してキャリブレーションパターンが検出されたものは、虹色の検出画像が表示される。失敗した場合には、これが表示されない
出力ファイルの内容
指定したファイル(デフォルトではout_camera_data.yml)の内容は次のような例となっている
%YAML:1.0
calibration_time: "08/07/11 14:50:21"
image_count: 7
image_width: 640
image_height: 480
board_width: 13
board_height: 9
square_size: 19.4290008544921880
flags: 0
camera_matrix: !!opencv-matrix
rows: 3
cols: 3
dt: d
data: [ 787.7153004285625000, 0., 355.4804618224245000, 0.,
788.1705331041230200, 246.9255774405008900, 0., 0., 1. ]
distortion_coefficients: !!opencv-matrix
rows: 1
cols: 4
dt: d
data: [ 0.1085696728874809, -0.5085092376095411,
-6.4507058124747213e-003, 3.4192708573512923e-003 ]
avg_reprojection_error: 0.2680457910484156
per_view_reprojection_errors: !!opencv-matrix
rows: 1
cols: 7
dt: d
data: [ 0.2542588975694444, 0.2548741397694645, 0.2239987626034989,
0.2073959937462440, 0.3121782938639323, 0.2910802466237647,
0.3325342031625601 ]
撮像画像のサイズ
- image_width = 640
- image_height = 480
camera_matrixの項に記述されている3x3の行列は次のようになっている
- fx = 787.7153 焦点距離 x
- fy = 788.1705 焦点距離 y
- cx = 355.4805 主点位置 x
- cy = 246.9256 主点位置 y
distortion_coefficientsの 1x4 のパラメータは、(k_1,k_2,p_1,p_2)となっている。
- k1 = 0.1085697 radial distortion 係数 k1
- k2 = -0.5085092 radial distortion 係数 k2
- p1 = -6.4507058e-3 tangential distortion 係数 p1
- p2 = 3.4192708e-3 tangential distortion 英数 p2
avg_reprojection_error は、平均再投影誤差で推定モデルと検出点との画像上の距離の平均となっている。この値が小さいほど、モデルの当てはまり方が正しいこととなる。逆に1より大きい場合には、検出に失敗した場合が考えられる。webcamの場合 ローリングシャッターの影響で、手ぶれにより画像が歪んでしまう場合が多い。
コメント
最終更新:2011年08月07日 15:22