画像処理とOpenCV

画像処理とOpenCV

執筆:准教授 神原利彦

 ロボットを知能化するための基本技術として、画像処理がある。これは、ロボットに搭載したカメラで撮影した2次元画像を処理して、ロボットの周囲の環境の3次元的な様子をコンピュータが認識しようとする技術である。古くは、旧通産省の電子技術総合研究所(現:産業技術総合研究所)などで研究されて来た技術である。例えば、TVカメラからの画像を処理してロボットアームを制御した世界最初の実験例として図1のETLロボットMk1(未来技術遺産:1970年)が挙げられる。

 現在では、コンピュータの性能が向上し、驚くべきほどに画像処理の機能が進歩している。そもそも、画像処理の歴史は約50年と浅く、かつてはCPUの速度が遅いから出来なかったことや、メモリが足りないから出来なかったことなどが現時点で多数実装可能となっている。この画像処理の技術を誰でも使えるようにと1999年からオープンソースの形でまとめたライブラリがOpenCV(図2)である。現在は、インテルが所有・管理しているものの様々なプラットホームで動作する便利なライブラリであり、その機能は年々進歩している。例えば、OSではWindows/MacOSX/Linux/Android/iOSで使えるし、開発言語ではC++/Java/Pythonが使えるという具合である。要するに、スマホでもArduinoのような組み込みマイコンでも使えるのである。このOpenCVには当初は画像処理の機能を持たせた関数ばかりが集まっていたが、使う研究者たちが増えるにしたがって、人工知能(AI)の機能を実装した関数なども次々に増えて来た。機械学習の機能まで持ち合わせている。確かに、OpenCVの機能が増え、誰でも使えて便利になったのは喜ばしいことだが、一方で、ブラックボックス的な使い方しか出来ず、中でどんな処理をしているかを考えようともしない人も増えて来た。結果が出てくれば、途中経過はどうでもいいという考えである。技術者の立場としては、アルゴリズム(計算手順)を理解せずに結果をありがたがるというのはどうも不気味な感じがするので、とりあえず自分が動かしてみるOpenCVの関数に関しては、必ず関数の説明文や数式を読んでアルゴリズムの理解を心がけている。意外に思われるかもしれないが、画像処理の計算では、統計や確率、微分、積分に非線形の最適解法などが多用されており、数学的にもかなり難易度が高く、アルゴリズムを理解するということは、それらの数学を理解することでもある。例えば、図3左の例では、cvFindChessboardCorners()という関数でチェス盤パターンの70個のコーナー点を自動検出し、それを基にcvFindExtrinsicCameraParams2()という関数でチェス盤パターン平面の並進量と回転量を推定計算している。図3右のCGは、その並進量と回転量だけCGで動かしてみた結果である。並進量と回転量がただ数値で出て来ただけでは正しいかどうかわからないので、CGを使い仮想空間上で動かしてみた結果である。この図3右で推定結果が正しいことがわかる。この推定計算でレーベンバーグ・マーカート法という最適解の算出法が使われていることは、あまり知られていない。

 筆者が出身大学の研究室で画像処理の研究を始めたのは1990年のことだが、当時はOpenCVなど無く画像処理のソフトウェアはすべて自分たち学生が作っていた。その時代から考えると現在は恵まれている。だが、使うだけでアルゴリズムの理解が出来てない人は、いざ変な結果が出て来たら、なぜそんな結果になったのかがまるで思考出来ない。途中経過をすっ飛ばすとはそういう事だ。大学は考える場なので、変な結果が出て来たら、アルゴリズムから原因を思考する訓練を学生たちにやってもらい、頭を鍛えさせている。それは、必ず社会に出た時の糧となるのだから。