ステレオカメラの概要
ステレオカメラは測距センサーの一種です。対象物の距離の2次元データ(距離画像)を取得するための有効な手段として昔から広く使われてきました。2000年頃からは、自動車の安全走行支援機能やロボットの自律走行機能を実現するための障害物の検知に活用されています。自動車向けでは SUBARU 社のアイサイトが有名です。
ステレオカメラは「ステレオ」という言葉の通り、2つのカメラを組み合わせて作ります。カメラが検出する光は、可視光や赤外線の波長帯が一般的です。2つのカメラを距離を離して設置すると、それぞれで対象物の見え方が変わり、撮影される画像が若干異なります。これを「視差」と呼びます。この視差の量を測定することで対象物までの距離を推定するという仕組みです(詳細は後述)。
距離の計算は、2つのカメラで取得した画像を画像処理のプログラム(アルゴリズム)に入力して行います。このアルゴリズムのことを「ステレオマッチング」と呼びます。ステレオマッチングに対しては、何十年も前から研究が行われてきました。2000年頃になって、それまで進化を続けてきた半導体の処理性能がステレオマッチングに必要なレベルに達し、アイサイトに代表されるようなアプリケーションが一般ユーザーに見えるような形で販売されるようになってきました。
ステレオカメラの基本的な構成
ステレオカメラの基本的な構成を下図に示します。
2つのカメラで同時刻に撮影した画像データを何らかのデジタル回路に伝送し、デジタル回路でステレオマッチングの画像処理アルゴリズムを実行します。デジタル回路は、マイコン(CPU)、FPGA、ASIC(専用の LSI)などが相当します。
ミリ波レーダーや LiDAR などの他の測距センサーとは違い、基本的にはセンサー側から電磁波を照射したりはしません。太陽光や照明が対象物に当たって反射する光を使います。ステレオカメラは2つのカメラの画像の違いから距離を推定しますので、画像に何も写らない夜間や暗室では機能しません。そういった場合には、ステレオカメラを搭載するロボットからライトを照射したりします。なお、ステレオマッチングは、後述のように、模様がない無地の物体の距離を測定できないという特徴がありますので、模様を対象物に描くための光を照射するプロジェクターを搭載したステレオカメラも存在します。ここでは、そういったステレオカメラ側から光を照射するようなケースは例外とし、扱わないこととします。
また、ステレオマッチングの原理を理解するために、カメラのレンズの特性についても触れておきます。カメラは、下図のようにレンズとイメージセンサーによって構成されます。
レンズには、屈折率によって光を集光する特性があり、レンズの位置を調整することで対象物からの光をイメージセンサーの1点、つまり「焦点」に集めることができます。焦点は、対象物とレンズの中心を結んだ直線上にきます。レンズとイメージセンサーの距離を焦点距離と呼びます。
上図の赤色の線と緑色の線がいずれも1点に収束しているように、対象物までの距離が変わらなければ対象物の位置を変えても成り立ちます。また、ここではカメラを上から見た断面図を示しているつもりですが、レンズは点対称の構造をしていることから、横から見た断面図と考えることもできます。つまり、上図のイメージセンサーの部分が画像の X 軸方向と考えることも、Y 軸方向と考えることもできます。ただし、対象物とイメージセンサー上の点の位置関係がひっくり返ることから、イメージセンサーで取得した生の画像データは見た目とは上下左右に反転した形になってしまいます。最終的に人間が目にする画像データにするために、X 軸と Y 軸を反転するように処理する必要があります。
また、レンズの必要性についても少し補足をしておきます。イメージセンサーには、太陽光などの環境光が対象物にあたって乱反射された光が届くのですが、乱反射であることから、対象物の1点から反射される光は様々な方向に向かいます。その結果、対象物の1点から出た光は、レンズが無い状態ではイメージセンサーのほぼピクセルに入ってきて、対象物の色々な場所からの光が混じってしまいます。これでは撮像ができません。光の到来方向を限定するために、イメージセンサーの前に光を遮断する板を設置して、その中央部分に小さな穴を開けておくという方法が知られています。これはピンホール効果と呼ばれます。しかしこれでは、イメージセンサーの各ピクセル(各フォトダイオード)に十分な光量を集められずに S/N(信号対雑音比)が確保できず、綺麗な画像にならないという欠点があります。小さな穴の代わりにレンズを設置することで、光の到来方向を限定しつつ、レンズの屈折率による光の集光能力によって S/N を向上させることができます。
色々と説明してきましたが、次項のステレオマッチングを理解するために「イメージセンサー上の焦点は、対象物とレンズの中心を結んだ直線の上にある」ということのみを覚えていただければと思います。
ステレオマッチング(ステレオカメラの原理)
基本原理
ステレオマッチングは、離れた位置に設置したカメラに写る画像が異なることを利用して、対象物までの距離を推定するアルゴリズムです。画像の差異を定量化したパラメータを「視差」と呼びます。具体的な数式は後述しますが、対象物までの距離が大きいほど視差が大きくなるという関係を利用して視差から距離を算出します。2つのカメラは高さをそろえて水平方向に左右に配置するのが一般的です。まずは、左右のカメラの画像がどのように異なるのか、下図で感覚を掴みましょう。
図の左側では対象物とカメラの位置関係を示しています。対象物の形は1辺が 2m の立方体です。ここでは、ステレオカメラを対象物から 10m 離れた所に設置しています。ステレオカメラの高さは地上から 1m です。この条件で撮影したカメラの画像が図の右側です。上が左のカメラで撮影した画像で、下が右のカメラのものです。比較をしやすいように、画像の横方向(X軸)の中央に直線を引いています。また、カメラ(左)に写っている対象物の輪郭の部分に目印の直線を引いています。これらの直線を頼りに比較すると、左右のカメラの画像に写っている物体の位置がずれていることが分かると思います。このずれを定量化したものが視差です。
次に、視差と対象物までの距離の関係式を導きます。簡単のために対象物の形を「点」と仮定すると、次のような位置関係の図を描くことができます。見やすさを優先して、対象物が左右のカメラの中央の位置にあるケースを想定します。
ステレオカメラの原理上、左右のカメラの撮像面は水平の状態(2つの撮像面が1つの平面上にのる状態)となります。(あえて水平にしないケースもあり、これについては後述します。)左右のイメージセンサーの距離を \(B\) とおきます。(Bは Base Line の略です。)また、図では省略していますが、イメージセンサーの直上にレンズがあり、このレンズの中心が焦点となります。レンズとイメージセンサーの距離が焦点距離 \(F\) です。対象物からの光は、焦点を通ってイメージセンサーと交差するところに集光されます。左右のカメラで対象物の見え方が異なることから、画像のピクセルの位置も異なります。この画像の X 座標方向でのずれが視差 \(D\) です。対象物までの距離 \(Z\) は、左右のレンズの中間点と対象物の間の長さと定義します。
上図の中に三角形Aと三角形Bを定義すると、これらは相似の関係になります。まず、三角形の右側の辺と底辺が平行(同じ角度)の関係にあることは自明と言っていいでしょう。そして、三角形Bの左の辺も、左のカメラに届く対象物からの光の線との平行線を、右のカメラの焦点を通るように描くことで決まります。左のカメラで対象物が写る画像上の位置を右のカメラの座標に印を付けた形になります。こうすることで、視差 \(D\) が定義できるわけです。相似であることから、2つの三角形の高さと底辺の関係は次のようになります。
$$\frac{Z}{B} = \frac{F}{D}$$
これを変形すると視差 \(D\) から距離 \(Z\) を求めるための式ができます。
$$Z = \frac{B \times F}{D}$$
これが、視差を測定すれば対象物までの距離を推定することができるという、ステレオカメラの基本原理です。
画像データへの適用
対象物が1つの点の場合に距離を測定する原理はこれで分かりましたが、実際の画像データには点が1つしか写っていない、ということはありえません。そこで、ステレオマッチングでは、左右のカメラで同じ「模様」が写っていたらそこは同じ対象物の点とみなす、という処理を行います。この点のことを「特徴点」と呼びます。左右のカメラは少しだけずれた位置に設置されますので、視差のずれがあるとはいえ、ほとんど同じような画像になります。容易に同じ模様を見つけることができるでしょう。
模様を見つけるために、一般的なステレオマッチングでは RGB の色付きの画像データを灰色のグレースケール画像に変換します。RGB のままでは各ピクセルに Red、Green、Blue の3つの値が入ってきて比較がしづらいからです。そして、例えば画像データの中の 3 x 3 の計 9 ピクセルを1セットとして、左右の画像で 9 ピクセルとも同じ値が入っている場所、つまり同じ模様の場所を探す、ということをします。下図がそのイメージ図です。
左右のカメラは、水平方向に離れた位置にありますので、視差が発生するのは水平方向のみです。そのため、同じ高さ(同じ Y 座標)の中で同じ模様を探します。ここでは、説明を簡単にするために 9 ピクセルとも全く同じ値(色)の時に同じ模様と判定することにします。図では、適当に同じ模様のセットを抜き出し、左右で同じ色の枠で印をつけました。これが特徴点となります。そして、同じ特徴点同士で左右の X 座標の差、つまり視差を算出します。視差は、左右のいずれかの画像の上に重ねる形で記録するのが一般的です。下図のようなイメージです。
3 x 3 ピクセルで比較してその中心のピクセルに視差情報を記録しますので、端のピクセルを中心とした 3 x 3 のピクセルを作ることができません。そこで、上図では、情報がないという意味をこめて「null」と表現しています。(この例では右側と下側にもピクセルが続いていると仮定していますので、図示されている「端」は側左と上側のみです。)実際には端のピクセルにも補間処理によって視差の数値を埋めることがあります。また、距離が異なる対象物が複数写っている場合にはそれぞれの特徴点の視差も異なり、その位置関係によっては 3 x 3 ピクセルが完全一致する模様が存在しないこともあります。上図では、そういった場所も null としました。反対に、同じ模様の候補が複数存在する場合も null にしています。この例では、白いピクセルが背景のようになっていて、3 x 3 の全てのピクセルが白色になっている場所が多数存在します。
説明しやすくするために、単純化した画像データを例に挙げてきましたが、実際の画像データには「ノイズ」「ムラ」「角度による反射光の違い」などがあり、左右の画像で全く同じ模様の部分が存在することはほとんどありません。実際の画像データのイメージは下図の通りです。
そこで、ステレオマッチングの実際のアルゴリズムでは、全く同じ模様ではなく「似た模様」を探すということをします。似ているかどうかの判定には、次の数式を使います。この数式は、左の画像の 3×3 ピクセルのブロックと右の画像の 3×3 ピクセルのブロックの1つのペアごとに計算されます。
$$\sum_{x,y\in B}^{} | I_L(x,y) – I_R(x,y) |$$
\(I_L(x,y)\) は左の画像のピクセルの値、\(I_R(x,y)\) は右の画像のピクセルの値を表しています。\((x,y)\)は 3×3 ピクセルのブロックの中での座標です。\(x,y \in B\) は 3×3 ピクセルのブロック全体(計9ピクセル)の中の各 \((x,y)\) 座標という意味です。\(\Sigma\) と合わせて使うことで、9回分足すという処理になります。左の画像の1ブロックに対して、右の画像の中で下図のように高さの同じ全ブロックに対して前述の数式を計算します。
この数式の値が最も低くなるブロックを同一の特徴点とみなし、そのブロック同士で視差を求めます。ただし、同じくらい低くなるブロックが複数存在する場合には計算不能とみなし、視差を null もしくはゼロとします。具体的なしきい値は設計者が指定します。機械学習を使わない場合には、多くのテスト画像を入力しながら手でチューニングすることになります。
ステレオマッチングの例
ステレオマッチングのアルゴリズムの出力結果の例を見ていきたいと思います。下図は、前述の立方体の画像を入力した場合の結果です。視差の大きさを色の違いで表現しており、赤いほど視差が大きく、特徴点までの距離が遠くなります。
立方体の縁の部分を特徴点としてとらえ、視差が計算されています。反対に、特徴点がない部分は視差(距離)が計算できません。ここでは計算できない部分をゼロ(青色)としています。計算には OpenCV というオープンソースライブラリの「StereoBM_create」という関数を利用しました。ここでの入力画像のサイズは 1920 x 1080 で、ステレオマッチングのブロックサイズは 15 x 15 と設定しました。
ステレオマッチングは、画像の中の模様によって対象物までの距離を推定するアルゴリズムですので、対象物の模様が異なれば結果も異なります。下図は、前の例と同じサイズの立方体にモザイク模様を付けた対象物を測定した例です。モザイク模様のピッチに沿って視差が算出されている様子が見えます。このように、模様によって測定結果が変わるのがステレオマッチングの特徴です。例えば SUBARU の「アイサイト」のような実際のステレオカメラ製品では、模様の違いによる影響を抑えるように、もっと複雑なアルゴリズムを採用していると予想されます。
ステレオカメラの視野
測距センサーにとって重要なパラメータの1つである「視野(測定範囲)」について考えてみます。まずは、1つのカメラ単体の視野がどのように決まるかを整理します。イメージ図を下図に示します。
レンズが十分に大きいと前提すると、視野はイメージセンサーのサイズ(縦と横の長さ)と焦点距離によって決まります。イメージセンサーのサイズが大きいほど視野が広くなります。イメージセンサーは半導体プロセスによって製造され、サイズが大きいと良品率(歩留まり)が低くなってしまいます。数 cm 角程度が限度です。また、焦点距離を短くすると視野が広くなるという関係があります。対象物までの距離が一定の場合、焦点距離はレンズの屈折率によって決まります。屈折率のコントロールにも限界がありますので、焦点距離を無限に小さくすることはできません。
次に、ステレオカメラの視野を考えます。同じ視野のカメラを2つ水平に並べると下図のようになります。
ステレオマッチングを実行するためには、物体の同じ部分が両方のカメラに写っている必要がありますので、2つのカメラのそれぞれの視野が重なる部分がステレオカメラの視野になります。図は、物体まで距離を一定にした場合にその距離で測定可能な範囲を緑の矢印で表現しています。これが、ステレオカメラの視野です。物体までの距離とカメラ単体の視野にもよって変わりますが、ステレオカメラでの視野はだいぶ狭くなってしまうのが分かると思います。
実際の製品では視野の低下を抑えるために、下図のように左右のカメラの角度を変えて設置します。同じ距離の部分に対して、明らかに測定範囲(視野)が広がっている様子が見えます。このように工夫をすることで、実際の製品のステレオカメラの視野は最大で150度程度となります。
カメラの角度を変えると、前述の視差の計算が成り立たなくなります。ただし、イメージセンサーの面を水平の面に射影し、射影後の面をイメージセンサーの面として計算することで視差を計算することができます。射影のイメージは下図を参考にしてください。
ステレオカメラの角度分解能
ステレオカメラの角度分解能は、視野とイメージセンサーの画素数で決まります。角度分解能を\(\Delta \theta\)、視野を\(FOV\)(Field of View)、画素数を \(N\) と置くと、下記の計算式が成り立ちます。
$$\Delta \theta = \frac{FOV}{N}$$
例えば、水平方向の視野を 90°、垂直方向の視野を 45°、イメージセンサーの画素数を 4000 ピクセル x 2000 ピクセルと仮定すると、水平方向の角度分解能は下記になります。
$$\Delta \theta = \frac{90^\circ}{4000} \simeq 0.02^\circ$$
垂直方向の角度分解能は下記の計算です。
$$\Delta \theta = \frac{45^\circ}{2000} \simeq 0.02^\circ$$
これは、ステレオマッチングの処理で視差を 1 ピクセル単位で区別(分解)できる場合を仮定した計算です。実際には、左右のカメラの中の同じ模様を 1 ピクセル単位の位置精度で検出することは簡単ではありません。上記の式はあくまで理論限界となります。ここから、ステレオマッチングのアルゴリズム、カメラのピクセルの S/N(信号雑音比)等の状況によって悪化していくことになります。一般的には、実際の角度分解能はこの限界値から数倍~十倍くらいになるようです。実際の製品では、高いもので(良いもので)0.1° 程度の角度分解能になります。自動運転自動車など、通常の自律走行ロボット向けとしては十分な精度と考えられます。なお、数万円程度の比較的安価な製品では 1° 程度にとどまることもあります。用途によっては不十分でしょう。
ステレオカメラの距離分解能
ステレオカメラの距離分解能は、視差と距離の関係式から求まります。再出となりますが、改めて示します。対象物までの距離を \(Z\)、焦点距離を \(F\)、左右のカメラの距離を \(B\)、視差を \(D\) とすると下記の通りです。
$$Z = \frac{B \times F}{D}$$
\(B\) と \(F\) は定数であり、距離 \(Z\) は視差 \(D\) によって求まります。視差はイメージセンサーのピクセルサイズが最小単位となり、これより細かい値を表現できません。これが量子化誤差となり、距離の分解能となります。量子化誤差などの誤差が関係式を通して他の変数にどのように影響するかは、誤差伝播の公式を使って求めることができます。変数 \(Y\) が複数の変数 \(X_0\) … \(X_{n-1}\) によって決まると仮定します。この関係は次のように数式で一般化できます。
$$Y = Y(X_0, …, X_{n-1})$$
この時、\(Y\) の誤差を \(\Delta Y\)、\(X_0\) … \(X_{n-1}\) の誤差を \(\Delta X_0\) … \(\Delta X_{n-1}\) とおくと次の関係式が成り立ちます。これが誤差伝播の公式です。
$$\Delta Y = \sqrt{ \sum_{i=0}^{n-1} \left( \frac{\partial Y}{\partial X_i} \right)^2 (\Delta X_i)^2}$$
これを距離 \(Z\) の式に適用してみます。\(B\) と \(F\) は定数であり変数ではありませんので、変数は視差 \(D\) のみです。数学的には
$$Z = Z(D) = \left(=\frac{B \times F}{D} \right)$$
という式で表現できる関係です。ここで距離分解能を \(\Delta Z\) とおきます。そしてイメージセンサーのピクセルサイズ、つまり視差の量子化誤差を \(\Delta D\)とおきます。すると、誤差伝播の式は次の通りです。
$$\Delta Z = \sqrt{ \left( \frac{\partial Z}{\partial D} \right)^2 (\Delta D)^2} = \left| – \frac{B \times F}{D^2} \times \Delta D \right| =\frac{B \times F}{D^2} \times \Delta D $$
視差というパラメータは馴染みがありませんので、距離 \(Z\) の数式に変形しておきます。
$$D = \frac{B \times F}{Z}$$
この式を\(\Delta Z\) の式に代入します。
$$\Delta Z = \frac{B \times F}{D^2} \times \Delta D = B \times F \times \left(\frac{Z}{B \times F} \right)^2 \times \Delta D = \frac{Z}{B \times F} \times \Delta D$$
これが、距離分解能を示す式です。例えば、\(Z = 10[m]\)、\(B = 20[cm] ~(0.2[m])\)、\(F = 5[cm] ~(0.05[m])\)、\(\Delta D = 1 [\mu m]\) と仮定すると、距離分解能は次の通りです。
$$\Delta Z = \frac{10}{0.2 \times 0.05 } \times 1 \times 10^{-6} = 1[mm] $$
角度分解能と同様に、こちらも理論限界の値であり、実際にはここから数倍~十倍程度悪化します。実際の製品では、測定距離の短い室内向けのステレオカメラで距離分解能は数 mm 程度、自動車向けのなどの測定距離の長いものでは数 cm ~ 数十 cm 程度になるようです。関係式で示されているように\(\Delta Z\)と\(Z\)は比例関係にありますので、距離が大きいとその分だけ距離分解能は悪化します。
ステレオカメラの測定可能距離(最大距離)
ステレオカメラで測定可能は最大距離は、ゼロよりも大きい視差が観測できるかどうかで決まります。同じサイズの対象物に対しては距離が遠くなるほど(距離に反比例して)視差が小さくなります。ゼロよりも大きい最小の視差はイメージセンサーのピクセルサイズです。このことから、最大距離の理論限界を計算してみます。前項の例と同様に、B = 0.2 [m]、F = 0.05 [m]、ピクセルサイズ = 1 [um] とおくと、
$$Z_{max} = \frac{B \times F}{D} = \frac{0.2 \times 0.05}{1\mu} = 10 [km]$$
となります。10 km というのはとてつもなく良い数字です。自動運転自動車などの地上走行のロボットにっては十分すぎる数字です。しかし、実際には 1 ピクセルの視差を検出することは難しいですし、遠方にある物体から得られる光量は小さくなってカメラで鮮明に撮影できなくなる、という事情が発生します。そういったことから、例えば自動車向けのステレオカメラ製品では、最大距離は 150m 程度になりようです。
なお、ステレオカメラは、ミリ波レーダーや LiDAR と比較して遠くの物体を検出するのに不利だと言われることがあります。ミリ波レーダーや LiDAR は、センサー側から電磁波を照射するという性質から「アクティブ」な測距センサーと呼ばれ、ステレオカメラは環境光に頼って距離を測定するという性質から「パッシブ」な測距センサーと呼ばれます。自分から電磁波を出さないと検出する電磁波の強度も小さくなるという理由から、パッシブの方が不利だという論理です。しかし、ミリ波レーダーや LiDAR から照射される電磁波の出力強度が大きくなりすぎると人体に害を及ぼす可能性が出てくることから、法令で出力強度の上限が定められており、必ずしもアクティブなセンサーの方が有利とは言えません。