2016-04-13 24 views
12

ビデオから道路レーンを検出する必要があります。ここに私のやり方があります。PythonとOpenCV - 私の車線検出アルゴリズムを改善する

  1. グレースケールROI
  2. cv2.equalizeHist
  3. とグレイスケールROI(3)
  4. にガウスぼかしを適用する等化
  5. (中央部の焦点を合わせる)画像をスライスすることによって関心領域(ROI)を決定
  6. しきい値(4)cv2.adaptiveThreshold
  7. Skeletonizeを用いて(5)skimage.morphology.skeletonize
  8. を使用してを適用します

    1. rho)は直線が右(ボトムアップに傾斜していることを意味する(肯定的である場合、それは以下となりますようにcv2.HoughLinesについては(6)

    上、私が設定しました(角度の範囲を設定しています)

  9. rhoが負の場合(直線は左に傾いています(ボトムアップ)、線が描かれている場合のみ線を描きます特定の角度にある)

これは、線を描くための私のコードです:私はちょうどcv2.HoughLines機能のために上記の何をしたかしなかった場合は

lines = cv2.HoughLines(image_bin, 1, np.pi/180, 50) 
    try: 
     range = lines.shape[0] 
    except AttributeError: 
     range = 0 

    for i in xrange(range): 
     for rho, theta in lines[i]: 
      if rho > 0 and (np.pi*1/10 < theta < np.pi*4/10): 
       a = np.cos(theta) 
       b = np.sin(theta) 
       x0 = a * rho 
       y0 = b * rho 
       x1 = int(x0 + 1000 * (-b)) 
       y1 = int(y0 + 1000 * (a)) 
       x2 = int(x0 - 1000 * (-b)) 
       y2 = int(y0 - 1000 * (a)) 

       cv2.line(roi, (x1, y1), (x2, y2), (0, 255, 0)) 

      if rho < 0 and (np.pi*7/10 < theta < np.pi*9/10): 
       a = np.cos(theta) 
       b = np.sin(theta) 
       x0 = a * rho 
       y0 = b * rho 
       x1 = int(x0 + 1000 * (-b)) 
       y1 = int(y0 + 1000 * (a)) 
       x2 = int(x0 - 1000 * (-b)) 
       y2 = int(y0 - 1000 * (a)) 

       cv2.line(roi, (x1, y1), (x2, y2), (0, 255, 0)) 

、私が描かれた不要な行の多くがあるだろうと信じています。

パラメータを調整した後、私はかなり良い結果を得ましたが、それはただ1つの画像のためです。私はそれが変化し続けるビデオには良いとは思わない。 私が気にするのは、必要な線を描くアルゴリズム(道路線)に関することです。もっと良い方法はありますか?少なくとも私より優れています。

これは私の結果である:

元の画像: The original image

イコライズヒストグラム、閾値、およびROIのスケルトン画像: Equalized Histogram, thresholded, and skeletonized

最終結果: Final result

答えて

6

あなたのアプリケーションにProbabilistic Hough Line Transformを使用することを検討することをお勧めしますに。 OpenCVのPython APIでは、関数cv2.HoughLinesPに実装されています。実際には線分を与えるので、端点を計算する必要はありません。また、標準のHough Line Transformよりもはるかに高速です。

ただし、いくつかのトレードオフがあります。たとえば、ラインセグメントをつなぎ合わせるロジックを追加する必要があります。一方、私はそれが本当に悪いことではないことを発見しました。私のおもちゃプロジェクト(自転車のミニチュアバス)の1つで、このアプローチを使用し、別々の線分を縫い合わせることで、標準的なハフ線の変形があなたに全く線を与えない曲がった道路に簡単に対処できました。

希望に役立ちます。

編集:線分 "ステッチング"の細部については、あなたが達成しようとしているものによって異なります。道路を表示したいだけで、線分間に隙間があることに満足すれば、すべての線分を表示するだけでステッチングを行う必要はありません。私のアプリケーションでは、車線の曲率を決定する必要があったので、車線の平均勾配を含む各車線のモデルを構築するためにステッチングを行いました。それに応じてホイールを移動させる。

"ステッチング"とは、特に洗練されたものを意味するわけではありませんが、それを達成するための特定のOpenCV関数を認識していません。私はちょうど同じ車線の一部だった関連する線分の方法を必要としました。そこで、画像の上部からHoughLinesPから返された線分を下方向に処理し、各線分の傾きとy切片を使用して、線分がどこに交差するかを判断しました。

+0

どうすればいいですか?申し訳ありませんが、まだプログラミングと画像処理の初心者です。 – Hilman

+0

私はいくつかのノートを追加しました。コードを提供していただきありがとうございます。それはC + +で、特定の実装はあなたとは非常に異なります - 基本的に、私はあなたのアプリケーションのためにそれを適応させるための十分な時間がありません。 – Aenimated1

関連する問題