OpenCV でステレオマッチング(OpenCV,Python を使用)

1. エグゼクティブサマリー

OpenCV と Python を用いてステレオマッチングを行い,左右のステレオ画像ペアから視差マップを生成する手順を解説する.OpenCV の cv2.StereoBM_create によるブロックマッチングアルゴリズムを用い,視差マップの計算,正規化,ガウシアンブラーによる平滑化,Matplotlib による可視化までの一連の処理を Python プログラムとして実行する.使用する画像は,OpenCV 公式サンプルとして公開されている aloeL.jpg,aloeR.jpg である.

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

【OpenCV の公式情報】

【サイト内の関連ページ】 ステレオ画像

2. 前準備(必要ソフトウェアの入手)

ここでは、最低限の事前準備について説明する。機械学習や深層学習を行う場合は、NVIDIA CUDA、Visual Studio、Cursorなどを追加でインストールすると便利である。これらについては別ページ https://www.kkaneko.jp/cc/dev/aiassist.htmlで詳しく解説しているので、必要に応じて参照してください。

Python 3.12 のインストール(Windows 上) [クリックして展開]

以下のいずれかの方法で Python 3.12 をインストールする。Python がインストール済みの場合、この手順は不要である。

方法1:winget によるインストール

管理者権限コマンドプロンプトで以下を実行する。管理者権限のコマンドプロンプトを起動するには、Windows キーまたはスタートメニューから「cmd」と入力し、表示された「コマンドプロンプト」を右クリックして「管理者として実行」を選択する。

winget install --scope machine --id Python.Python.3.12 -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --override "/quiet InstallAllUsers=1 PrependPath=1 Include_pip=1 Include_test=0 Include_launcher=1 InstallLauncherAllUsers=1"

--scope machine を指定することで、システム全体(全ユーザー向け)にインストールされる。このオプションの実行には管理者権限が必要である。インストール完了後、コマンドプロンプトを再起動すると PATH が自動的に設定される。

方法2:インストーラーによるインストール

  1. Python 公式サイト(https://www.python.org/downloads/)にアクセスし、「Download Python 3.x.x」ボタンから Windows 用インストーラーをダウンロードする。
  2. ダウンロードしたインストーラーを実行する。
  3. 初期画面の下部に表示される「Add python.exe to PATH」に必ずチェックを入れてから「Customize installation」を選択する。このチェックを入れ忘れると、コマンドプロンプトから python コマンドを実行できない。
  4. 「Install Python 3.xx for all users」にチェックを入れ、「Install」をクリックする。

インストールの確認

コマンドプロンプトで以下を実行する。

python --version

バージョン番号(例:Python 3.12.x)が表示されればインストール成功である。「'python' は、内部コマンドまたは外部コマンドとして認識されていません。」と表示される場合は、インストールが正常に完了していない。

AIエディタ Windsurf のインストール(Windows 上) [クリックして展開]

Pythonプログラムの編集・実行には、AIエディタの利用を推奨する。ここでは、Windsurfのインストールを説明する。Windsurf がインストール済みの場合、この手順は不要である。

管理者権限コマンドプロンプトで以下を実行する。管理者権限のコマンドプロンプトを起動するには、Windows キーまたはスタートメニューから「cmd」と入力し、表示された「コマンドプロンプト」を右クリックして「管理者として実行」を選択する。

winget install --scope machine --id Codeium.Windsurf -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --custom "/SP- /SUPPRESSMSGBOXES /NORESTART /CLOSEAPPLICATIONS /DIR=""C:\Program Files\Windsurf"" /MERGETASKS=!runcode,addtopath,associatewithfiles,!desktopicon"
powershell -Command "$env:Path=[System.Environment]::GetEnvironmentVariable('Path','Machine')+';'+[System.Environment]::GetEnvironmentVariable('Path','User'); windsurf --install-extension MS-CEINTL.vscode-language-pack-ja --force; windsurf --install-extension ms-python.python --force; windsurf --install-extension Codeium.windsurfPyright --force"

--scope machine を指定することで、システム全体(全ユーザー向け)にインストールされる。このオプションの実行には管理者権限が必要である。インストール完了後、コマンドプロンプトを再起動すると PATH が自動的に設定される。

関連する外部ページ

Windsurf の公式ページ: https://windsurf.com/

必要なライブラリのインストール [クリックして展開]

管理者権限コマンドプロンプトで以下を実行する。管理者権限のコマンドプロンプトを起動するには、Windows キーまたはスタートメニューから「cmd」と入力し、表示された「コマンドプロンプト」を右クリックして「管理者として実行」を選択する。

次のコマンドは,旧バージョンを削除し,Python 用 opencv-python のインストールを行う. 最後の行はバージョン確認用である.

python -m pip uninstall -y opencv-python
python -m pip uninstall -y opencv-python-headless
python -m pip uninstall -y opencv-contrib-python
python -m pip install -U opencv-python opencv-contrib-python numpy
python -c "import sys, cv2; print(f'Python version: {sys.version}\nOpenCV version: {cv2.__version__}')"

3. 実行のための準備とその確認手順(Windows 前提)

3.1 プログラムファイルの準備

第5章に掲載するソースコードをテキストエディタ(メモ帳,Windsurf 等)に貼り付け,stereo_matching.py として保存する(文字コード:UTF-8).

3.2 画像ファイルのダウンロード

https://github.com/opencv/opencv/tree/master/samples/data で公開されている aloeL.jpg,aloeR.jpg を使用する(謝辞:画像の作者に感謝します)

3.3 実行コマンド

コマンドプロンプトでファイルの保存先ディレクトリに移動し,以下を実行する.

python stereo_matching.py

3.4 動作確認チェックリスト

確認項目期待される結果
画像ファイルの読み込みaloeL.jpg,aloeR.jpg がグレースケール画像として読み込まれる
視差マップの計算cv2.StereoBM_create により視差マップが計算される
画像の表示左画像,右画像,視差マップの3分割表示がウィンドウに表示される
カラーバーの表示視差マップにカラーバーが付与され,視差値の大小が色で確認できる

4. 概要・使い方・実行上の注意

本プログラムは,OpenCV の cv2.StereoBM_create を用いてステレオマッチングを行い,左右のステレオ画像ペア(aloeL.jpg,aloeR.jpg)から視差マップを生成する.パラメータは numDisparities=64(視差の探索範囲:64ピクセル),blockSize=15(マッチングブロックサイズ:15×15ピクセル)である.計算された視差マップは cv2.normalize で 0〜255 に正規化し,cv2.GaussianBlur(カーネルサイズ 15×15,標準偏差 5)で平滑化する.最終的に Matplotlib で左画像,右画像,視差マップを3分割表示する.

Google Colaboratory での画像パス設定

Google Colaboratory のときは,「IMROOT = os.environ['LOCALAPPDATA'] + '/'」の行を,「IMROOT = "./"」のように書き換える.

実行結果の例

ソースコードは第5章に掲載している.

5. ソースコード

以下のソースコードを stereo_matching.py として保存し実行する.

import os
import numpy as np
import cv2
import matplotlib.pyplot as plt

IMROOT = os.environ['LOCALAPPDATA'] + '/'
imgL = cv2.imread(IMROOT + "aloeL.jpg", cv2.IMREAD_GRAYSCALE)
imgR = cv2.imread(IMROOT + "aloeR.jpg", cv2.IMREAD_GRAYSCALE)
stereo = cv2.StereoBM_create(numDisparities=64, blockSize=15)
disparity = stereo.compute(imgL, imgR)
disp_norm = cv2.normalize(disparity, None, 0, 255, cv2.NORM_MINMAX, cv2.CV_8U)
disp_blur = cv2.GaussianBlur(disp_norm, (15, 15), 5)

plt.figure(figsize=(14, 4))
plt.subplot(1, 3, 1), plt.imshow(imgL, cmap='gray'), plt.title('Left Image')
plt.subplot(1, 3, 2), plt.imshow(imgR, cmap='gray'), plt.title('Right Image')
plt.subplot(1, 3, 3), plt.imshow(disp_blur, cmap='jet'), plt.title('Disparity Map'), plt.colorbar()
plt.tight_layout()
plt.show()

6. まとめ

ステレオマッチングと視差マップ

ステレオマッチングは,左右2枚の画像間で対応する画素を探索し,その位置のずれ(視差)を算出する処理である.本記事では OpenCV の cv2.StereoBM_create によるブロックマッチングアルゴリズムを用いて視差マップを生成した.

StereoBM のパラメータ設定

cv2.StereoBM_create では numDisparities(視差の探索範囲)と blockSize(マッチングブロックサイズ)を指定する.本記事では numDisparities=64blockSize=15 を使用した.

視差マップの正規化と平滑化

計算された視差マップは cv2.normalize で 0〜255 に正規化し,cv2.GaussianBlur で平滑化することで,可視化に適した画像を得る.

Matplotlib による可視化

plt.subplot で左画像,右画像,視差マップを3分割表示し,カラーマップ(jet)とカラーバーにより視差値の大小を色で確認できるようにした.

Google Colaboratory での画像パス設定

Windows では os.environ['LOCALAPPDATA'],Google Colaboratory では ./ を画像ルートパスとして設定する.