OpenCVによる高度な曲線レーン検出
ストーリー
はじめに
レーンマーキングは自動運転システムの要であり、車両を交通の中から安全に導きます。直線レーン検知の前プロジェクトを基に、影、遮蔽、不整地路面など複雑な環境でも確実に動作する堅牢な曲線レーン検知パイプラインを開発しました。
完全な画像処理ワークフローはPythonとOpenCVで実装:
- 歪み補正
- 透視変換(パースペクティブワープ)
- ソベルフィルタリング
- ヒストグラムピーク検出
- スライディングウィンドウ探索
- 多項式曲線フィッティング
- 検知レーンのオーバーレイ
- リアルタイム動画処理
従来システムの限界
以前のモデルは直線レーンに限定され、曲線、影、部分的遮蔽に苦戦していました。新パイプラインはエッジベースフィルタリングと動的スライディングウィンドウアプローチを導入し、これらの欠点を克服しています。
歪み補正
カメラレンズは放射状歪みを生じ、計測を歪めます。既知パターン(通常は非対称チェッカーボード)でカメラをキャリブレーションすることで、データセット全体を補正する歪みモデルを生成します。
キャリブレーション手順:チェッカーボードの複数画像を撮影、 cv2.findChessboardCorners() でコーナー検出、 cv2.calibrateCamera() でカメラ行列と歪み係数を計算、 cv2.undistort() で補正画像を生成。
以下は補正されたチェッカーボード画像の並列比較で、微妙だが重要な改善を示しています。
使用したキャリブレーションコード:
def undistort_img():
# オブジェクトポイント準備 0,0,0 … 8,5,0
obj_pts = np.zeros((6*9,3), np.float32)
obj_pts[:,:2] = np.mgrid[0:9, 0:6].T.reshape(-1,2)
objpoints = []
imgpoints = []
images = glob.glob('camera_cal/*.jpg')
for fname in images:
img = cv2.imread(fname)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, corners = cv2.findChessboardCorners(gray, (9,6), None)
if ret:
objpoints.append(obj_pts)
imgpoints.append(corners)
img_size = (img.shape[1], img.shape[0])
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, img_size, None, None)
dst = cv2.undistort(img, mtx, dist, None, mtx)
dist_pickle = {'mtx': mtx, 'dist': dist}
pickle.dump(dist_pickle, open('camera_cal/cal_pickle.p', 'wb'))
return dst
def undistort(img, cal_dir='camera_cal/cal_pickle.p'):
with open(cal_dir, 'rb') as f:
file = pickle.load(f)
mtx, dist = file['mtx'], file['dist']
return cv2.undistort(img, mtx, dist, None, mtx)
undistort_img()
img = cv2.imread('camera_cal/calibration1.jpg')
dst = undistort(img)
これらの関数は、同梱のJupyterノートブックの Code セクションでも利用可能です。
以下は走行シーンへの歪み補正適用例。視覚的差異は微妙ですが、正確な幾何学は下流処理にとって極めて重要です。
透視変換(パースペクティブワープ)
カメラ空間で直接曲線レーンを検知するのは困難。画像を鳥瞰図(バードアイビュー)に変換することで、レーンが平面上にあると仮定し、高精度で多項式フィッティングが可能になります。
変換は cv2.getPerspectiveTransform() と cv2.warpPerspective() で実行。ソース点とデスティネーション点は、レーン幾何学を維持しながら視認性を最大化するよう選択。
def perspective_warp(img, dst_size=(1280,720),
src=np.float32([(0.43,0.65),(0.58,0.65),(0.1,1),(1,1)]),
dst=np.float32([(0,0),(1,0),(0,1),(1,1)])):
img_size = np.float32([img.shape[1], img.shape[0]])
src = src * img_size
dst = dst * np.float32(dst_size)
M = cv2.getPerspectiveTransform(src, dst)
return cv2.warpPerspective(img, M, dst_size)
ソベルフィルタリング
色フィルタリングのみでは、明るいコンクリートをレーンマーキングと誤分類する恐れがあります。代わりに勾配ベースのエッジ検出を採用。ソベル演算子でHLS色空間の水平勾配を計算し、高コントラストのレーンエッジを強調しつつ路面を抑制。
結果のバイナリマスクは照明変化に強靭で、スライディングウィンドウ探索の入力として使用。
ヒストグラムピーク検出
スライディングウィンドウ適用前に、バイナリ画像のx軸方向ヒストグラムを計算し、レーンラインのおおよその水平位置を特定。左右それぞれの最高ピークが左右レーンの基点に対応。
スライディングウィンドウ探索
基点を用いて、スライディングウィンドウアルゴリズムが各レーンに属するピクセルインデックスを反復収集。その後、各レーンに2次多項式をフィッティングし、正確な曲率推定とレーン中心からの車両位置を算出。
最終オーバーレイで、検知レーン領域、曲率、車両オフセットをリアルタイム表示。
詳細を見る: Curved Lane Detection
製造プロセス
- 故障検知・診断(FDD):設備信頼性とメンテナンス効率を高める
- JavaとReactive Blocksでモーション検知アラームシステム - Raspberry Piに展開しSMS送信
- Farmaid:植物病害を精密検出・マーキングする自律ロボット
- Microsoft KinectをRaspberry Piと統合しSonbiロボットでリアルタイム人物検出
- 曲面加工のための精密CNCフライス加工
- Omron E3AS-F光電センサー、ToF検出で1.5メートル達成
- 8051ベース超音波距離センサー:設計、回路、アプリケーション
- 侵入検知システム(IDS):スマートアラートでネットワークを保護
- Hydra3D ToFセンサー、産業・屋外用途向けに高速・高精度3D検出を実現
- AEye、1000m先の車両検知可能な長距離LiDARを発表〜自動運転トラック向け
- マイクロアレイ技術を用いた臨床研究における遺伝子発現検出