はじめに
最近グレーコードパターンを利用したカメラの歪み補正を行うことになり、グレイコードパターンをディスプレイに投影する必要が出てきたので、そのメモを残しておきます。
グレイコードとは
グレイコード(Gray Code)とは、隣り合うビット変化が1ビットしかないようにした2進数表現のことです。
具体的にはこのようになります。
10進数 | バイナリコード | グレイコード |
0 | 0000 | 0000 |
1 | 0001 | 0001 |
2 | 0010 | 0011 |
3 | 0011 | 0010 |
4 | 0100 | 0110 |
5 | 0101 | 0111 |
6 | 0110 | 0101 |
7 | 0111 | 0100 |
8 | 1000 | 1100 |
9 | 1001 | 1101 |
10 | 1010 | 1111 |
11 | 1011 | 1110 |
12 | 1100 | 1010 |
13 | 1101 | 1011 |
14 | 1110 | 1001 |
15 | 1111 | 1000 |
なぜカメラの歪み補正にグレイコードを利用するのか
グレイコードでは上述したように、隣接値のハミング距離が1つとなるので、白黒画像の境界上での符号化誤りを最小化できるためです。カメラの歪み補正のためにはディスプレイ座標の縦軸と横軸にそれぞれ平行な2通りのグレイコードパターンを用いることになります。
なお、バイナリコードを用いてパターン光を構成することもできますが、バイナリコードでは隣接値でビットが反転することがあり、1ビットの誤りで値が大きく変わってしまい符号化誤りの影響を大きく受けてしまいます。
例えば、バイナリコードで「0100」の場合を考えてみましょう。
10進数 | ||
バイナリコード | 0100 | 4 |
グレイコード | 0110 | 4 |
となりますが、もし上記の隣接値がビット反転したらどうなるでしょうか?
10進数 | ||
バイナリコード | 0000 | 0 |
グレイコード | 0010 | 3 |
このように、バイナリコードでは10進数において4のずれが生じてしまします。一方で、グレイコードでは1のずれしかなく隣接値のビット反転の影響を受けにくいことが分かります。
OpenCVを用いたグレイコードパターンの投影
拡張モジュールopencv_contibのビルド
ソースのダウンロード
以下のリンクから拡張モジュールとOpenCVのソースをダウンロードできます。
- 拡張モジュールopencv_contibのソース
https://github.com/opencv/opencv_contrib/releases
- OpenCVのソース
<注意点>
・拡張モジュールのバージョンとOpenCVのバージョンは一致させる必要があります。
・拡張モジュールのビルドに本体であるOpenCVのソースが必要となります。
Cmake
CMakeのGUIで下記のテキストボックスに記載した値を入力します。
- Where is the source code
>> c:\”your path”\oopencv-x.x.x を指定
- Where to build the binaries
>> c:\”your path”\oopencv-x.x.x\build を指定
一度Configureをクリックし赤い画面で設定項目がいろいろ出てくると思うので以下の部分を設定します。
- OPENCV_EXTRA_MODULES_PATH
>> c:/”your path”/opencv_contrib-x.x.x/modulesを設定
<注意点>
"\"ではなく”/”でパスを指定することです。
次にもう一度Configureをクリックし、エラーが出なければGenerateをクリックしソリューションファイルを生成します。
"c:\”your path”\oopencv-x.x.x\build”にOpenCV.slnというソリューションファイルが作れらているはずなので、起動しCMakeTargets\INSTALLをスタートアッププロジェクトに指定してビルドします。
もしくはバッチビルドで指定してからビルドします。
そうすれば、bin・lib・includeディレクトリに拡張モジュールのライブラリが追加されているはずです。
サンプルプログラムなどの続きは後々書きます。
参考にしたサイト:
taktak.jp
tecsingularity.com
https://kamino.hatenablog.com/entry/opencv-graycode
https://kamino.hatenablog.com/entry/opencv_contrib_install