はじめに
こんにちは、HCB Advent Calendar 2021の18日目を担当する、kudokaiです。
卒業研究では車幅感覚習得支援システムの提案という研究をしており、研究の中ではPythonを使った車線推定機能を実装しています。
今回は僕が実装した車線推定について紹介します。
普段はiOSアプリに関する記事を書いたりiOSアプリを開発したりしています。
今回、Pythonの記事は初めて書きます。
車線推定方法
Hough変換
Hough変換とは画像や動画の中から直線や円を検出するアルゴリズムです。
OpenCVで提供されているHoughLinesP関数を使用する方法が一番簡単なのかなと思います。
Hough変換に至るまで、画像のグレースケール化→2値化をしておく必要があります。
lines = cv2.HoughLinesP(edges, rho=1, theta=np.pi/360, threshold=60, minLineLength=10, maxLineGap=20)
この1行でHough変換が使えます。
第2引数と第3引数に関してはハフ変換による直線検出をご覧ください。
-
threshold
直線上に乗った線がこの値を超えたら直線とみなします。 -
minLineLength
検出する直線の最小の長さを表します。この値より短い線分は検出されません。 -
maxLineGap
同一線上にある点の間隔の最大値を指定します。指定した値より小さければ、同一の直線とします。
Haar-Like特徴
Haar-Like特徴とは、局所領域の明暗差から求めた特徴量のことです。
矩形領域のパターンを設定し、白領域に対応する画素の和と、黒領域に対応する画素の和の差を特徴量とします。
この特徴量は特に顔検出でよく使われます。
矩形領域のパターンは例として以下のようなものを用意します。
より高い精度を出すためには、実際もっと多くのパターンが必要になります。
Haar-Like特徴の詳細はAn efficient lane detection algorithm for lane departure detectionというIEEEの論文に書いてあります。
僕の研究では白線の推定をするだけなので矩形領域のパターンは用意せず、探索領域内における相対的な画素値を用いてHaar-Like特徴を簡略化して実装しています。
車線推定結果
Hough変換とHaar-Like特徴を用いてそれぞれの推定結果を動画として書き出しました。
走行動画は僕が通っている大学敷地内で撮影したものを使っています。
Hough変換
緑の線が白線の候補になります。
車線以外の箇所も多数検出されていますね。
Haar-Like特徴
ピンクの点が車線の候補になります。
緑の枠線が車線の探索領域になります。
いい感じに推定できているかと思います。
しかし、車線逸脱時には縁石を車線を判定してしまうので改良が必要です。
Hough変換と比べても動画の書き出し時間が圧倒的に短くなりました。
最後に
提案システム実装の足掛かりとして車線推定の機能を実装しました。
今回は特に具体的なコードは載せずにアルゴリズムの紹介をしてきました。(研究で書いたソースコードって外部に公開してもいいものなのか...)
Hough変換はカーブに対応するのは難しそうですが、Haar-Like特徴であれば相対的な画素値を用いるのでカーブにも対応できそうな気がしています。