はじめに
本稿では、Visual C++で作成したプログラムで、左右のステレオカメラの焦点距離を計算し表示しました。以下の順で解説します。
- 焦点距離計算と表示の機能について、ひとこと…
- 焦点距離変換のSource Code
- 焦点距離表示のSource Code
先ずはこの機能の説明をしたうえで、ソースコードを開示します。それでは、参りましょう。
焦点距離計算と表示の機能について、ひとこと…。
ここでは左右カメラの焦点距離計算の背景と手法について解説します。
先ず、この機能が必要となった理由は、左右のカメラの焦点を手動で調整する必要が在ったからです。”StereoCalib() function”は左右カメラの焦点距離をOutputファイルに記録しますが、左右の焦点距離が同一と仮定しているため、左右で全く同じ数値になっています。また、3D Display Programでは、そのOutputファイルを使います。それ故に、左右カメラの焦点距離を手動で、限りなく近い数値に合わせる必要がでました。
対策として、左右カメラの焦点距離を片方ずつモニターに表示しながら、手動でカメラのレンズを調整する方法を選びました。このプログラムは2部に分かれています。左カメラの焦点距離を計算して表示した後に、右カメラの焦点距離を計算して表示します。
左カメラ/右カメラともに同じ方法で焦点距離を計算して表示します。計算には2Dのカメラ校正プログラムをそのまま使います。詳細は”How it’s done: One Camera Calibration.“を参照してください。表示には、Outputの焦点距離が OpenCV の Mat-formatで保存されるため、MassageBox()で表示できるfloat-typeに変換する必要が在ります。
焦点距離変換のSource Code
例として、左カメラの焦点距離の表示をここで取り上げます。右カメラの場合は 関数名を変更するだけで出来ます。(LをRとするだけ。)下記の操作で、Mat uchar type から float typeに変換する関数を作成して、それを変換します。
// Conversion from YML file format (string) to usable float numbers cv::Mat c1cL = cameraMatrix; cv::Mat f1cL(c1cL.rows, c1cL.cols, CV_32F); // The CV data type "CV_32F" means 32 bit float matrix. // Convert cameraMatrix data from "uchar" to "float". // The Mat data type "uchar" means unsigned 1 byte integer. c1cL.convertTo(f1cL, CV_32FC1); // The CV data type "CV_32FC1" means a 32 bit float matrix element.
焦点距離表示のSource Code
次の一連の操作にて上記で変換された焦点距離を”MessageBox()”に表示します。
// Assign cameraMatrix(Mat float format) to **buffer(float pointer) float **bufferL = new float*[f1cL.rows]; for (int r = 0; r < f1cL.rows; r++) { bufferL[r] = new float[f1cL.cols]; for (int c = 0; c < f1cL.cols; c++) { bufferL[r][c] = f1cL.at<float>(r, c); } } // Display focal length in a MessageBox() const size_t len = 256; wchar_t buffer0[len] = {}; _snwprintf_s(buffer0, len - 1, L"%f", bufferL[0][0]); MessageBox(NULL, buffer0, L"FX(Left Camera) = ", MB_OK); // Delete buffer for (int r = 0; r < f1cL.rows; r++) { delete[] bufferL[r]; } delete[] bufferL;
是非、参照元の”https://gist.github.com/ctryti/1673806“と OpenCV Documentationをご覧ください。
まとめ
如何でしたか。本稿では、Visual C++で作成したプログラムで、左右ステレオカメラの焦点距離を計算した背景と手法について解説し、Source Codeを開示しています。最後までお読みいただき、ありがとうございました。