OpenNH

日常のひとこま(自分用のメモとかあれこれ)

グレイコードパターンを投影する

はじめに

最近グレーコードパターンを利用したカメラの歪み補正を行うことになり、グレイコードパターンをディスプレイに投影する必要が出てきたので、そのメモを残しておきます。
 

グレイコードとは

グレイコード(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

https://opencv.org/releases.html

<注意点>
・拡張モジュールのバージョンと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をクリックし赤い画面で設定項目がいろいろ出てくると思うので以下の部分を設定します。

>> 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