図3. ブロックマッチングのイメージについて
5-1.計算アルゴリズムについて
また、ステレオカメラの距離計測は、いくつかの計算アルゴリズムに分けて処理が行われているためその計算アルゴリズムについて簡単に下記で紹介します。
1.前処理 :歪み補正(キャリブレーション)や画像の輝度値の正規化など
2.平行化 :マッチングの効率化のための画像変換
3.マッチング :マッチングを行って視差を推定
4.三角測量(Triangulation):カメラの幾何的な配置から、視差マップを距離に変換
上記のようなステップにより視差を計測し距離を算出します。
5-1-1 歪み補正(キャリブレーション)について
画像処理の前処理として、カメラの歪みを補正します。カメラのレンズは歪みを持っているため曲がっているため、数学的にレンズの半径方向の歪みと円周方向の歪みを取り除きます。
図 歪み補正前画像(左)と歪み補正後画像(右)
5-1-2 平行化(rectification)処理について
平行化処理では、カメラ間の確度と距離を調整し、計測した2つの画像の対応する点が同じ行座標をもつようにする方法です。
2つの画像平面が同じ平面上にあり、画像の行が正確にそろっている状態にします。
この処理は、マッチング処理において、同じ画像を探す処理が、2 次元の探索問題から1 次元の問題になるため、ステレオビジョン(ステレオカメラ)の処理の効率化に必須の作業といえます。ステレオイメージの平行化は視差計算やアナグリフ画像作成の前処理手順としてよく使用されています。
図 平行化処理前画像
図 平衡化処理後画像
5-1-3 マッチングについて
2枚の画像の各部についてマッチングを行うことで視差を推定する方法です。ここで視差とは,2枚の画像間で対応する部位の位置の差を表します。
ステレオマッチングを行い画像上の各部位の視差が推定できれば,三角測量の原理に基づいて距離を算出できます。マッチングの中では、ステレオ対応点検索(2つの異なるカメラ画像での同一点の検索)を行っています。対応点の検索においては様々なマッチングアルゴリズムが存在します。
下記に説明するコンピュータビジョンのプログラミングライブラリのOpenCVでは、高速で効果的なブロックマッチングステレオアルゴリズムが実装されており、マッチングのイメージとしては、同じ平面上の画像にウィンドウを設定しその中の差分の和が小さくなる点を対応点(差分絶対値和(SAD:Sum of Absolute Difference))として探すアルゴリズムです。
マッチングアルゴリズムの処理イメージについて説明すると、
上記のブロックマッチングステレオ対応点探索アルゴリズムには3つのステップがあります。
1. 画像の明るさを正規化しテクスチャを強調するために、事前フィルタリングする。
2. SADウィンドウを用いて水平なエピポーラ線に沿って対応点を探索する。
3. 不良な対応点を削除するために事後フィルタリングを行う。
事前フィルタリングの段階では、マッチングを効率的に行うために画像の明るさやテクスチャを強調するために入力画像を正規化します。
次の対応点の検索はSADウィンドウ(基準となるピクセルから視差探索の範囲)をスライドすることで行われます。左カメラ画像内でそれぞれの特徴に対して、右カメラ画像で対応する行から最もよくマッチするものを探します。
平行化すると、各行がエピポーラ線になるので、右カメラの画像内でマッチングする場所は、左カメラ画像内の同じ行(同じy座標)にあると仮定できます。また、ステレオカメラでは平行に取付されているため、視差がゼロであれば同じ点(x0)になり、それより大きな視差なら画像の左側になります。(下図参照)
事後のフィルタリングについては、左右の視差の値を見て視差の値が整合するかをチェックするなど、異常値や不良な対応点を削除する処理を行います。
図 画像探索イメージ
5-1-3-1 エピポーラ線とは
上記に度々出てきましたエピポーラ線について説明しますと、エピポーラ幾何という、2つのカメラで3次元空間を撮影する、ステレオビジョンに関する幾何の点を結んだ線のことになります。
エピポーラ幾何は2つの異なる位置から見た画像から、3次元の奥行き情報を復元したり、画像間の対応を求めたりするのに役立つ幾何です。
図 エポピーラ幾何について
エピポーラ幾何を説明する前提として、
・3次元空間上に存在する点Pが2つのカメラの投影面(Left view, Right view)に、投影(透視投影)されているとする。
・OlとOrは、2つのカメラの投影中心。
・点plとprは、各投影面上における点Pの投影。
として説明を進めます。
■ エピポール
・2つのカメラは異なる位置にあるので、一方のカメラから他方のカメラを見ることができるとすると、それぞれ、elとerに投影されます。これをエピポール(epipole)またはエピポーラ点(epipolar point)と呼びます。
・el、erおよびOl、Orは3次元空間上の同一直線の上に乗る特徴があります。
■ エピポーラ線
エピポーラ線は投影面上に書ける線のことで、投影点から対応するエピポールへの線の事を言います。
直線 Ol-Pは、左のカメラでは1つの点に投影され、その投影面に存在する点pl、右カメラでは直線Or-Pと右カメラの投影面に存在する点をprとしたとき、右のカメラの直線 er – prはエピポーラ線(epipolar line)と呼びます。(左のカメラでは直線el-plがエピポーラ線となります。)
この、エピポーラ線は点Pの3次元空間位置によって一意に定まり、すべてのエピポーラ線はエピポーラ点(図ではel、er)を通る特徴があります。
・また逆に、エピポーラ点を通る直線は、すべてエピポーラ線となる特徴があります。
■ エピポーラ面
・点P, Ol, Orの3点を通る平面はエピポーラ面と呼びます。
・エピポーラ面と、投影面の交線はエピポーラ線と一致します。(エピポーラ線上にはエピポーラ点が存在します。)
■ エピポーラ制約
2つのカメラの互いの位置関係が既知の時に、次のことがいえます。
・点Pの左カメラでの投影plが与えられると、右カメラのエピポーラ線 er - prが定義されます。そして、点Pの右カメラでの投影prは、このエピポーラ線上のどこかにことになります。これをエピポーラ制約(epipolar constraint)と呼びます。
・つまり、2つのカメラで同じ点を捕捉しているとした場合、必ずそれは互いのエピポーラ線上に乗るはずです。
・そのため、一方のカメラで見ている点が、他方のカメラのどこに映っているか、という問題に対しては、エピポーラ線上を調べればよくなり、相当な計算量の節約につながります。
・もし、対応付けが正しくて、plとprの位置がわかっているのであれば、点Pの3次元空間での位置を決定することが可能になります。
5-1-4 三角測量(Triangulation)について
カメラの幾何的な配置がわかっている場合、三角測量の原理で視差マップを距離に変換します。式で記述すると下式で奥行き:Zは表せますが、計算時のイメージとしては下の図を用いて説明します。
図に示すように、歪み補正、平行化処理が正確に行われたステレオカメラがあるという前提とします。その時には、その画像平面が正確に同一平面上にあり、正確に平行な光軸(光軸は投影中心Oから主点cを通る光線で主光線とも呼びます)を持ち、同じ焦点距離fを持つ2つのカメラという構成です。
ここでは、主点CxleftとCxrightがキャリブレーションされ、それぞれ左と右の画像内で同じピクセル座標を持つとします。さらに、これらの画像の行がそろっており、1つのカメラ内にあるすべてのピクセルの行はもう1つのカメラの対応する行と正確にそろっていると仮定した場合に、実世界の点Pが左右の画像ビューの中に存在し、その水平座標として,xlとxrを持つとします。
この時、視差はd=xl-xrで定義され、三角測量の原理で奥行きZを導出することが出来ます。
から
と求められます。
上記の式から、奥行きは視差に反比例するため、視差が0に近い場合(遠方の対象物の場合)には、奥行きが大きく変化し、視差が大きい場合(近傍の対象物の場合)には、視差は少し違っていても奥行きに対する影響が小さくなる特徴があります。そのため、特にカメラに比較的近い対象物に対して、ステレオカメラシステムは高い分解能を発揮します。
5-2. 計算プロセッシングユニットについて
画像処理においては、PC(パソコン)ベースでの処理においては、画像処理コンピュータで有名なNVIDIAのGPU(グラフィック・プロセッシング・ユニット)やIntel Core i7やi5などのCPU(Central Processing Unit)などが活用されます。
GPUは画像処理用に特化し開発されているためCPUよりも処理が効率的に行うことが可能です。また、用途を限定する場合にはFPGA (Field Programmable Gate Array) を用いて画像処理を行うケースもあります。FPGAはインテル(Intel)が買収したアルテラ(altera)という会社が有名です。
そのFPGAとは,回路構成をプログラミングで設計することができる LSI のことであり、プログラミングで回路を構成するため,チップ内部の回路構成を変更することが可能で、特定の用途に合わせてプログラムの作りこみを行うことができ、コスト・開発期間など面で活用されるケースがあります。
5-3. 画像処理プログラミング(Open CV)について
画像処理プログラミングについては、さまざまな種類がありますが、OpenCV(正式名称: Open Source Computer Vision Library)は、オープンソースのコンピューター・ビジョン・ライブラリです。ライブラリーはCとC++で書かれており、コンピューターで画像や動画を処理するために必要な、さまざま機能が実装されており、BSDライセンスで配布されていることから学術用途だけでなく商用目的でも利用できます。
加えて、マルチプラットフォーム対応されているため、幅広い場面で利用されていることが特徴です。
OpenCVの特徴としては、様々な環境で活用が可能で、画像処理・画像解析および機械学習等の機能を持つC/C++、Java、Python、MATLAB用ライブラリ。プラットフォームとしてmacOSやFreeBSD等全てのPOSIXに準拠したUnix系OS、Linux、Windows、Android、iOS等をサポートしている特徴があります。
汎用的な画像処理プログラミング環境を適用することで、ステレオビジョンシステムへの応用やステレオビジョンアルゴリズムの組み込みシステムの開発が容易となり、開発時間の短縮や開発製品の価格抑制に影響を与えます。