オプティカルフローの実験をしてみた

はじめに

オプティカルフローのアルゴリズムとして有名な Lucas-kanade法(以下LK法)の実験をしてみたので記録に残しておきます。もともとローリングシャッターとグローバルシャッターの違いを実験していたのですが、途中から高速度カメラでの評価になってきてしまったのですが、折角ですのでいろいろ記録に残しておきたいと思います。

なおアルゴリズムは Wikipedia の Lucas-kanade method をはじめ、いろいろなところにありますのでここでは割愛します。

LK法はKLT法などキーポイント周辺だけを追跡するような高度な技法にもさまざま応用されていますが、ここではシンプルに矩形対矩形のX-Y移動量推定を行うシンプルなツールとして例えば画面全体の移動量の計算などシンプルな想定で検証していきます。

高速度カメラ+FPGAを使ったリアルタイム振動計測

当サイトではローリングシャッターでの高速度撮影もやりつつグローバルシャッタカメラの開発などもやっているわけですが、特にオプティカルフローについてはローリングシャッターでも案外成り立つのではないか?という仮説のもといろいろやっております。

ローリングシャッターグとローバルシャッターの比較実験

そもそも異なるイメージセンサ2つを使って条件を揃えて比較実験をするのは簡単ではありません。そこで、疑似的にローリングシャッターカメラ画像を作成してみます。要は運動している物体に対してライン毎に露光時刻が異なり、ブランキング期間などがあればいいわけですから、ある程度疑似的に作ることが可能です。

ローリングシャッターカメラで撮影した画像では、撮影物体が動いていたり、もしくはカメラ自体が動いていた場合、ローリングシャッター現象などと呼ばれる形状の歪みが起こります。

疑似動画を作ってみた

下記は、視覚的にわかりやすくするために少し極端に作ったものを動画化したものです。イメージを掴んでいただければ幸いです。
左側がグローバルシャッターに対して右側がローリングシャッターを仮定して作った動画です。

横方向に振り子運動(正弦波運動)
円運動
CGで書いた丸の円運動

上は極端な例ですが、いろいろとパラメータを変えたり、自然画像やCGで実験を行ってみました。

横方向の運動のみで実験

ローリングシャッター歪みの特徴として横に動いているものが斜めに形状が歪むというものがあります。その状態でのマンドリル画像での計測実験が下記です。X方向の変化量(dx)はどちらも大きな差はありませんが、本来変化していないはずのY方向の成分がローリングシャッターではY方向の成分としても現れてしまっているのがわかるかと思います(Y軸のスケールの通り、わずかな量ではありますが)。

X方向の振り子運動の速度計測

回転運動の実験

ここでY成分の運動量もある回転運動のものでも実験してみると

回転運動の速度計測

誤差はあるもののあくまで誤差と言うレベルに見えます。

CGでの実験

ここでさらに黒字に白い丸を書いただけのCGのX方向運動を実験すると下記のようになりました。

今度はグローバルシャッターはほぼY軸方向には変化がなく、ローリングシャッターでのみY軸方向に誤差が現れました。

ローリングシャッター比較のまとめ

誤差量は画像依存性が高そうで決まった法則はここでは見出せませんでしたが、十分な特徴量のある画像を用いる場合、グローバルシャッターの方が高精度だが、ローリングシャッターでも用途次第ではそこそこ使い物になりそう。という感想です。

FPGAでのリアルタイム信号処理の検討

LK法は本来、画像の差分に対して10回程度のイテレーションで繰り返し収束を行って精度を上げます。
一方で当サイトは、フレーム間で10回も演算するぐらいなら、フレームレートを10倍にして1フレームごとに1回だけ計算したほうが精度が良くなるんじゃないか?というスタンスのサイトです。

早速実験してみます。

CGでの実験

順番に速度を上げながら実験してみます。
基準とするために十分収束するまでイテレーションしたものと、イテレーション1回のものを比較していきます。折角先ほど、ローリングシャッター用の疑似画像も作る環境を書いたのでこれもローリングシャッターとグローバルシャッター両方評価します。

基準となるデータ
10倍速
100倍速

順にカメラのフレームレートを10倍、100倍と高めていった想定です。
変化量が大きいうちは理想に対してやや小さい量を出していますが、動きに対して十分高いフレームレートに持っていくと、一回しか計算しなくてもかなり理想に近い値が出せるようです。

なお、ここでは前のフレームの結果を使って動き補償をするなどはしていないので実際にはもっと収束する方向への制御ができる可能性はあります。

自然画像での実験

同じく自然画像としてマンドリル画像を使って実験してみました。変化量が多いうちはデータ依存で誤差量が変わってくることがわかりますが、やはりフレームレートを速くしていくと理想の値に収束していくようです。

基準となるデータ
10倍速
100倍速

要するに撮影する対象に対して十分に高いサンプリングレートにすれば、シンプルな計算の繰り返しでも制度を出せる可能性はありそうです。

おわりに

ちょっとした実験のつもりが休日は本日潰してしまいました。
もともとローリングシャッターでも比較的成り立ちそうな処理として、オプティカルフローを選んで取り組んでいたのですが、折角最近グローバルシャッターカメラを作っていたのでそちらの優位性も言えればと思っていたのですが、結果、ローリングシャッター案外使える?という結果でした(笑)。

次は、グローバルシャッターでないとできないような評価ができればと思う次第です。

Raspberry Pi カメラモジュール【Raspberry Pi Camera V2】

Raspberry Pi カメラモジュール【Raspberry Pi Camera V2】

3,480円(09/14 09:11時点)
Amazonの情報を掲載しています

コメント

タイトルとURLをコピーしました