工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

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

製造プロセス

  1. 故障検知・診断(FDD):設備信頼性とメンテナンス効率を高める
  2. JavaとReactive Blocksでモーション検知アラームシステム - Raspberry Piに展開しSMS送信
  3. Farmaid:植物病害を精密検出・マーキングする自律ロボット
  4. Microsoft KinectをRaspberry Piと統合しSonbiロボットでリアルタイム人物検出
  5. 曲面加工のための精密CNCフライス加工
  6. Omron E3AS-F光電センサー、ToF検出で1.5メートル達成
  7. 8051ベース超音波距離センサー:設計、回路、アプリケーション
  8. 侵入検知システム(IDS):スマートアラートでネットワークを保護
  9. Hydra3D ToFセンサー、産業・屋外用途向けに高速・高精度3D検出を実現
  10. AEye、1000m先の車両検知可能な長距離LiDARを発表〜自動運転トラック向け
  11. マイクロアレイ技術を用いた臨床研究における遺伝子発現検出