社会人研究者が色々頑張るブログ

pythonで画像処理やパターン認識をやっていきます

Python+OpenCVによる白線検出(4)

はじめにのはじめに

完成版の記事です nsr-9.hatenablog.jp

はじめに

nsr-9.hatenablog.jp nsr-9.hatenablog.jp nsr-9.hatenablog.jp

これらの続きです。
今回は、消失点の仮説検証部分を実装します。

Verification(消失点)

Verificationでは以下の2つを検証します。
1.2本の白線候補の式が尤もらしいか検証する「白線の検証」
2.2本の白線からなる消失点候補が尤もらしいか検証する「消失点の検証」
今回は消失点の検証を実装しました。

消失点の検証

白線の仮説生成では、左右でそれぞれ3点の白線候補点を生成し、真ん中以外の2点を通る直線を生成しました。
また白線の仮説検証は、直線と点の距離に対するしきい値処理によって行いました。

f:id:nsr_9:20210816161819p:plain

消失点の検証では、生成した消失点の仮説(点)と消失線(線)の距離に対して、しきい値処理を行います。
f:id:nsr_9:20210817194024p:plain

距離を求めるコードは前回作成したものをそのまま使い回す事ができます。

import cv2
import numpy as np

def linear(n1, n2):
    a = (n2[1]-n1[1])/(n2[0]-n1[0])
    b = (n2[0]*n1[1]-n1[0]*n2[1])/(n2[0]-n1[0])
    return a, b


def distance(p1, p2, p3):
    a, b = linear(p1, p3)
    return abs(a*p2[0]-p2[1]+b)/(a**2+1)**0.5

p1, p3に消失線、p2に消失点の座標を渡します。

消失線の推定

消失線は消失点が存在しうる線、すなわち地平線を意味します。
画像中から地平線を求めるのは非常に難しいため、論文では画像の中心に地平線が映るようにカメラを校正、設置しています。
今回使用しているビデオは、当然ですがこの様な校正処理が行われていない為、消失線の高さを予め決定する必要があります。

今回は「消失線上に消失点が存在する」事を逆に考え、「多くの消失点が存在する高さに消失線がある」としました。
以下に、全フレームに対する消失点を1枚の画像にプロットした結果を示します。

f:id:nsr_9:20210817195211p:plain この時、仮説検証において尤もらしいとした白線のみを使用し、消失点をピンク色の点でプロッティングしました。
また、全消失点の平均を水色でプロットしました。

概ね、道路中央かつ遠方の位置に消失点が集合していることが確認できます。

消失点の検証

仮説生成により得られた消失点と、事前に推定した消失線と用いて仮説検証を行いました。
実行例を以下に示します。
f:id:nsr_9:20210817201127j:plain

消失線を水色で表示しました。
この画像では左右の白線が正しく求まってそうに見えるのですが、その際は黄色の消失点は、消失線上に存在しています。

次の例は白線が正しく求まっていない例です。
f:id:nsr_9:20210817201703j:plain

この画像では左の白線の推定結果が正しくない例ですが、その際の消失点は消失点に対し上部に存在しています。
この消失線とのズレをしきい値処理することで、誤った消失点を棄却する事ができます。

消失点の検証は、以下のコードで求める事ができます。

def verification(p1, p2, p3, th):
    return True if distance(p1, p2, p3) < th else False

白線の仮説検証の動作例

今回作成した消失点の仮説検証を実行し、動画化しました。 f:id:nsr_9:20210817204959g:plain

f:id:nsr_9:20210817205020g:plain

まとめ

今回は、 An Efficient Lane Detection Algorithm For Lane Departure Detectionの消失点のVerification部分を実装しました。
次は、いよいよ車線逸脱警報部分を実装します。