車(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 件のコメント:
コメントを投稿