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

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

Python+OpenCVによる前方車両検出(2)

はじめに

nsr-9.hatenablog.jp

これの続きです。
今回は走行空間モデルの生成部分を実装します。

走行空間モデルの生成

前回は白線に内接する矩形の下の辺を求めました。 今回は上と左右の辺を求め、矩形を算出します。

前回 今回
f:id:nsr_9:20210823164337p:plain f:id:nsr_9:20210824192516p:plain

矩形を求める為には、左右のX座標と上下のY座標を決定する必要があります。
X座標は白線との交点で求まりますが、Y座標の定義が論文に記載されていません。
そこで今回は勝手ながら次のようにy座標を定義しました。

ある矩形の下の辺の高さをyとした時の上の辺の高さy'は、消失点の高さH'を用いて次のように次のように求めます。
f:id:nsr_9:20210824193315p:plain

実装は次のようになります。

def make_area(img, y, la, lb, ra, rb, vy):
    """
        la, lb: 左の白線の直線の式 y = ax + b
        ra, rb: 右の白線の直線の式 y=ax + b
        vy: 消失点の高さ
    """
    # 底辺のX
    lx = int((y - lb) / la)
    rx = int((y - rb) / ra)

    # 上底のY
    r = (y - vy)/(img.shape[0] - vy)
    _y = int(vy - r * vy)

    img = cv2.rectangle(img, (lx, _y), (rx, y), (0, 255, 0), 1)
    return img

実行すると次のようになります。 f:id:nsr_9:20210824193655j:plain

元論文の走行空間モデルと比較すると、いい感じに再現できてそうなことがわかりますね!
f:id:nsr_9:20210821193200p:plain

動画に対して推論した結果を示します。
f:id:nsr_9:20210824194532g:plain

白線検出結果が安定しているので、走行空間モデルもだいぶ安定して生成されているように思います。

また、走行空間モデルの中から9個の矩形をピックアップしてみました。

画像1 画像2
f:id:nsr_9:20210824195506j:plain f:id:nsr_9:20210824195514j:plain

黄色い矩形で囲んだ車に注目していると、進行方向上の遠方にいる車両の領域をうまく選択できている事がわかります。 f:id:nsr_9:20210824195902j:plain

まとめ

今回は消失点から走行空間モデルを生成する所まで実装できました。
次回は、車両検出部分を実装しようと思います。