2022年3月22日火曜日

PiCar-Xでlane detection(02) 自動運転のための車線検出

 車(PiCar-X)を決められたコース(道路)に沿って走らせるためには、当然PiCameraで写した写真からコースの向かっている方向を読み取り、進むべき方法をコンピュータ(RaspberryPi)に教えなければなりません。その為にはまず車線を線分として検出する必要があります。

【道路の画像】




その手順が前回書いた

1.PiCameraから画像の取り込み

2.オリジナル画像から作業領域をクロップ

3.画像をBGRからHSVへ変換

4.OpenCV – inRangeで画像を2値化

5.OpenCV – cannyによるエッジ検出

6.region of interest(注目する領域)を設定

7.OpenCV – HoughLinesPによる直線の検出

です。

まず順番は無視して、Canny法でエッジ検出をしてHough変換で直線を見つけてみます。
Canny法を使うために、はじめに画像をグレー変換し、ノイズ除去のために平滑化を行いました。

道路の画像として下記の絵に描いた図を使用しました。黄色と白色の車線があります。

グレー変換から
#画像の読み込み
image_path = 'road_image.png'
image = cv2.imread(image_path)

#gray scale
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

つづいてノイズ除去のための平滑化
# Gaussian blur
# 画像のぼかして平滑化することで、画像中のノイズ除去を行います
image_blur = cv2.GaussianBlur(image_gray, (5,5), 0)

Canny法によるedges検出
#edgesの検出
image_edges = cv2.Canny(image_blur,50,150)

Canny法のパラメーターの調整方法はここが解りやすいと思います。

Hough法による直線の検出
#Hough変換による直線の検出
hough_lines = cv2.HoughLinesP(image_edges, 2, np.pi/180, 200, np.array([]), minLineLength= 10, maxLineGap=50)

取りあえず白線、黄線のラインは緑色の複数の線として検出できています。
白線と黄線を別々に検出できれば応用範囲が広がりそうです。
そのためのステップが今回飛ばした3~4番目です。
今日はここまで、プログラム全体を下記に載せておきます。
import cv2
import numpy as np

def img_show(image, text):
  img_resize = cv2.resize(image, (640, 480))
  cv2.imshow(text, img_resize)
  cv2.waitKey(0)
  cv2.destroyAllWindows()

def show_lines(image, lines):
          lanelines_image = np.zeros_like(image)
          if lines is not None:
            for line in lines:
              X1, Y1, X2, Y2 = line.reshape(4)
              cv2.line(lanelines_image, (X1, Y1), (X2, Y2), (0,255,0), 2)
          return lanelines_image
  
#画像の読み込み
image_path = 'road_image.png'
image = cv2.imread(image_path)
img_show(image, 'original')

#gray scale
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
img_show(image_gray, 'gray')
cv2.imwrite('image_gray.png', image_gray)

# Gaussian blur
# 画像のぼかして平滑化することで、画像中のノイズ除去を行います
image_blur = cv2.GaussianBlur(image_gray, (5,5), 0) 
img_show(image_blur, 'blur')
cv2.imwrite('image_blur.png', image_blur)

#edgesの検出
image_edges = cv2.Canny(image_blur,50,150)
img_show(image_edges, 'edges')
cv2.imwrite('image_edges.png', image_edges)

#Hough変換による直線の検出
hough_lines = cv2.HoughLinesP(image_edges, 2, np.pi/180, 200, np.array([]), minLineLength= 10, maxLineGap=50)

image_lanelines = show_lines(image, hough_lines)

img_show(image_lanelines,'Hough lines')
cv2.imwrite('image_lanelines.png', image_lanelines)

0 件のコメント:

コメントを投稿