LoginSignup
9

More than 5 years have passed since last update.

OpenCV で 簡単 TopView

Posted at

突然ですが Raspberry Pi Zero W を入手しました。

Switch Science さんから、運良く発売日に注文でき、すぐに入手出来ました!
これを早速プラレールに搭載、うまく稼働させることに成功しました。
プラレールへの搭載方法と、Wifi でリモートコントロールするためのコードを以下の Git に公開しましたので、興味がありましたらご覧ください。
https://github.com/Kumapapa2012/Raspberry-Pi-Zero-on-PLA-RAIL-3rd

Top View について

本題の Top View について。
Top View とは、カメラの視界の映像を、あたかも真上から見下ろしているように見せる技術のことです。某社の自動車にも搭載されていますね。

プラレールに限らず、何か動きまわるものにカメラをつけて自動運転などを考える場合、単眼カメラでどうやってやればいいのか、結構悩むと思います。例えば、自身の進行方向や速度などはどのように判別すべきなのか?ある時点のコマとそこから一定時間後のコマとの間で、特徴点を見つけ、移動位置、拡大縮小率などから自身の動きを推測すればいいのか?などなど。。。
そんな中、Top View で問題を簡単にできそうだという記事を見つけました。1

手順としては簡単です。

1.適当な正方形または長方形を、画面の底辺と左右中心に合わせて撮影し、画面上の頂点座標を取得。以下のような画像です。
image.png
この画像は、4cm の正方形に「あ」の文字がある状態を撮影しています。
この場合、左上、右上、右下、左下の順で以下の座標になります。
T_L=(168,260)
T_R=(344,260)
B_R=(408,360)
B_L=(72,360)

2.TopView化した時の画像サイズと、その画像に正方形または長方形がどのように表示されるべきか決め、頂点座標を決定。これは、元の「あ」画像の最も長い辺つまり底辺を使用し、すべてが同じ長さの正方形になるように座標を計算します。詳しくは私の Notebook 2を参照してください。

3.それぞれの頂点座標を用い、cv2.getPerspectiveTransform()で変換行列取得。この変換行列によって、カメラ上の台形の「あ」が、上から見た正方形の「あ」に変換されます。
おそらくこの変換行列は定数項として、一度計算すればよいはず。

4.cv2.warpPerspective()カメラ画像に、3.で求めた変換行列を適用。

以上で Top View が得られます。

Youtube に、実際の動作の様子の Video をアップしました。
この Video では、"Canny" アルゴリズムでエッジ抽出したカメラ画像に、Top View 効果を適用しています。ちょっと歪んでいますが「あ」が概ね正方形に出ています。
※クリックして再生
image.png
なお、Notebook の動画との間に遅延が発生していますが、おそらくこれは、Notebook に無理やり動画を表示させたためと考えられます。

まだ調整が必要なものの、Top View にすると環境認識の問題が 3 次元から 2 次元の問題となり、識別器の要件もかなり簡単になりそうです。
Top View からレールが識別でき、トラックできれば、たとえば障害物検知と停止なら簡単にできそうです。

 参考文献

Line detection autopilot using Python + OpenCV.
Canny Edge Detection
JupyterでOpenCVの画像をインライン表示

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9