ステレオマッチングによりステレオ画像から距離画像を求める(OpenCV,Python を使用)

次で公開されているプログラムを参考に、ステレオ画像から距離画像を求める

https://github.com/opencv/opencv/blob/master/samples/python/stereo_match.py

サイト内の関連ページ


前準備

Python のインストールと必要なPythonライブラリのインストール(Windows上)

  1. Python のインストール

    注:既にPython(バージョン3.12を推奨)がインストール済みの場合は,この手順は不要である.

    winget(Windowsパッケージマネージャー)を使用してインストールを行う

    1. Windowsで,コマンドプロンプト管理者権限で起動する(例:Windowsキーを押し,「cmd」と入力し,「管理者として実行」を選択)
    2. winget(Windowsパッケージマネージャー)が利用可能か確認する:
      winget --version
      
    3. Pythonのインストール(下のコマンドにより Python 3.12 がインストールされる).
      winget install --scope machine Python.Launcher
      winget install --scope machine Python.Python.3.12
      
  2. 必要なPythonライブラリのインストール
    1. Windowsで,コマンドプロンプト管理者権限で起動する(例:Windowsキーを押し,「cmd」と入力し,「管理者として実行」を選択)
    2. 以下のコマンドを実行し,必要なライブラリをインストールする.
      pip install -U opencv-python opencv-contrib-python
      

【関連する外部ページ】

【サイト内の関連ページ】

このページで説明のために使用する画像

  1. まず、C:\image のような作業用のディレクトリ(フォルダ)を作る
  2. 次の Web ページを開く

    https://github.com/opencv/opencv/tree/master/samples/data

  3. aloeL.jpg, alorR.jpg の2つをダウンロードし、C:\image の下に保存

ステレオマッチングによりステレオ画像から距離画像を求める

  1. Python プログラムの実行

    Python プログラムの実行: 別ページ »で説明

    Python のまとめ: 別ページ »にまとめ

  2. 次を実行
    import cv2
    import numpy as np
    
    imgL = cv2.imread("C:/image/aloeL.jpg")
    imgR = cv2.imread("C:/image/aloeR.jpg")
    
    # disparity range is tuned for 'aloe' image pair
    window_size = 3
    min_disp = 16
    num_disp = 112-min_disp
    stereo = cv2.StereoSGBM_create(minDisparity = min_disp,
        numDisparities = num_disp,
        blockSize = 16,
        P1 = 8*3*window_size**2,
        P2 = 32*3*window_size**2,
        disp12MaxDiff = 1,
        uniquenessRatio = 10,
        speckleWindowSize = 100,
        speckleRange = 32
    )
    
    print('computing disparity...')
    disparity = stereo.compute(imgL, imgR).astype(np.float32) / 16.0
    
    cv2.imshow('disparity', (disparity-min_disp)/num_disp)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    画像が表示されるので確認. このあと,ウインドウの右上の「x」をクリックしない.画面の中をクリックしてから,何かのキーを押して閉じる