ステレオ対応アルゴリズム

SGM (セミグローバル マッチング) 原則:

SGM の原理は、wiki 百科事典と matlab 公式 Web サイトで詳しく説明されています:
wiki matlab
原理を完全に理解したい場合は、元の論文を読むことをお勧めします(私は怠け者なので読みません)。
高品質の論文解釈とコード実装
マスター自身が C++ で実装した SGM アルゴリズムgithub では
最初に 2 つの重要なパラメーターが導入されています:
注: この部分は matlab の説明を参照し、次の部分は opencv の実装を参照します。多少異なる場合がありますが、一般的には一貫しています。
視差レベル方向数

視差レベル

視差レベル: 視差レベルは、マッチングの検索スペースを定義するために使用されるパラメーターです。以下の図に示すように、アルゴリズムは右画像の D ピクセルの中から左画像の各ピクセルを検索します。生成される D 値は、左画像のピクセルの D 視差レベルです。左画像の最初の D 列は、右画像の対応するピクセルが比較に利用できないため、使用されません。図中、wは画像の幅、hは画像の高さを表します。特定の画像解像度の場合、視差レベルを大きくすると、奥行きを検出するための最小距離が短くなります。視差レベルを大きくすると、アルゴリズムの計算負荷も増加します。特定の視差レベルで、画像の解像度を上げると、奥行きを検出するための最小距離が長くなります。画像の解像度を上げると、奥行き推定の精度も向上します。視差レベルの数は、同じ深度にある物体を検出するための入力画像の解像度に比例します。この例では、8 ~ 128 (両方の値を含む) の視差レベルがサポートされています。アルゴリズムの説明では、64 の視差レベルについて言及しています。この例で提供されるモデルは、任意の解像度の入力イメージを受け入れることができます。—matlab

理解するには単語が多すぎるので、gpt に説明を求めました。

# gpt生成,仅供本人理解SSD原理
import numpy as np

def compute_disparity(left_img, right_img, block_size=5, num_disparities=64):
    # 图像尺寸
    height, width = left_img.shape

    # 初始化视差图
    disparity_map = np.zeros_like(left_img)

    # 遍历每个像素
    for y in range(height):
        for x in range(width):
            # 定义搜索范围
            min_x = max(0, x - num_disparities // 2)
            max_x = min(width, x + num_disparities // 2)

            # 提取左图像块
            left_block = left_img[y:y+block_size, x:x+block_size]

            # 初始化最小 SSD 和对应的视差
            min_ssd = float('inf')
            best_disparity = 0

            # 在搜索范围内寻找最佳视差
            for d in range(min_x, max_x):
                # 提取右图像块
                right_block = right_img[y:y+block_size, d:d+block_size]

                # 计算 SSD
                ssd = np.sum((left_block - right_block)**2)

                # 更新最小 SSD 和对应的视差
                if ssd < min_ssd:
                    min_ssd = ssd
                    best_disparity = abs(x - d)

            # 将最佳视差保存到视差图中
            disparity_map[y, x] = best_disparity

    return disparity_map

# 示例用法
left_img = np.random.randint(0, 255, size=(100, 100), dtype=np.uint8)
right_img = np.roll(left_img, shift=5, axis=1)  # 创建右图,右移了5个像素

disparity_map = compute_disparity(left_img, right_img, block_size=5, num_disparities=64)

# 可视化结果(这里简化为将视差图缩放以便可视化)
import matplotlib.pyplot as plt
plt.imshow(disparity_map, cmap='gray')
plt.title('Disparity Map')
plt.show()

これにより、Disparity Levelsが視差を算出する範囲(視差探索範囲)であることが分かる。

方向の数

ルート数:

方向の数: SGBM アルゴリズムでは、コスト関数を最適化するために、入力画像を複数の方向から考慮します。一般に、視差結果の精度は、方向の数が増えるほど向上します。この例では、左から右 (A1)、左上から右下 (A2)、上から下 (A3)、右上から左下 (A4) の 5 つの方向を分析します。右から左へ(A5)。
ここに画像の説明を挿入します

単一のパスによるピクセルのマッチングは十分に堅牢ではなく、画像に応じた 2 次元の最適化のためのグローバル マッチングの時間計算量が高すぎるため (NP 完全問題)、SGM の作成者は 1 次元のパス集約を使用して近似します。二次元の最適化。
ここに画像の説明を挿入します
写真参照

SADとSSD

SAD または SSD を使用して、マッチングのための画像の類似性を計算します。
数式:
> 引用はこちら
数式とコードは gpt によって生成されていますが、数式は正しいように見えます。コードは理解を助けるものであり、参照のみを目的としています。
コード内の num_disparities は視差レベルです

opencv の SGBM

私は opencv をよく使用するので、ここではopencvでのコードの実装のみに焦点を当てます。

opencv StereoSGBM_create の例:

# gpt生成,仅作为参考,具体请查看opencv官方文档https://docs.opencv.org/4.x/d2/d85/classcv_1_1StereoSGBM.html
import cv2
import numpy as np

# 读取左右视图
left_image = cv2.imread('left_image.png', cv2.IMREAD_GRAYSCALE)
right_image = cv2.imread('right_image.png', cv2.IMREAD_GRAYSCALE)

# 创建SGBM对象
sgbm = cv2.StereoSGBM_create(
    minDisparity=0,
    numDisparities=16,  # 视差范围,一般为16的整数倍
    blockSize=5,        # 匹配块的大小,一般为奇数
    P1=8 * 3 * 5 ** 2,   # SGBM算法参数
    P2=32 * 3 * 5 ** 2,  # SGBM算法参数
    disp12MaxDiff=1,    # 左右视差图的最大差异
    uniquenessRatio=10,  # 匹配唯一性百分比
    speckleWindowSize=100,  # 过滤小连通区域的窗口大小
    speckleRange=32      # 连通区域内的差异阈值
)

# 计算视差图
disparity_map = sgbm.compute(left_image, right_image)

# 将视差图进行归一化处理
disparity_map = cv2.normalize(disparity_map, None, 0, 255, cv2.NORM_MINMAX)

# 显示左图、右图和视差图
cv2.imshow('Left Image', left_image)
cv2.imshow('Right Image', right_image)
cv2.imshow('Disparity Map', disparity_map.astype(np.uint8))

cv2.waitKey(0)
cv2.destroyAllWindows()

SGBMとSGMの違い

opencv sgbm と sgm の違いは何ですか
opencv官方的解释:
このクラスは、次のように元のアルゴリズムとは異なる、修正された H. Hirschmuller アルゴリズム [82] を実装します。

  1. デフォルトでは、アルゴリズムはシングルパスです。これは、8 方向ではなく 5 方向のみを考慮することを意味します。createStereoSGBM で mode=StereoSGBM::MODE_HH を設定すると、アルゴリズムの完全なバリアントが実行されますが、大量のメモリを消費する可能性があることに注意してください。
  2. このアルゴリズムは、個々のピクセルではなくブロックを照合します。ただし、blockSize=1 に設定すると、ブロックが単一ピクセルに減ります。
  3. 相互情報コスト機能は実装されていません。代わりに、[15] のより単純な Birchfield-Tomasi サブピクセル メトリックが使用されます。ただし、カラー画像もサポートされています。
    K. Konolige アルゴリズム StereoBM のいくつかの前処理ステップと後処理ステップが含まれています。たとえば、前フィルタリング (StereoBM::PREFILTER_XSOBEL タイプ) と後フィルタリング (一意性チェック、二次補間、およびスペックル フィルタリング) です。

大まかに言うと、SGM との違いは、SGBM アルゴリズムをマッチングする際の最小単位がピクセルではなくブロックである点ですが、blockSize=1 に設定すると SGM になります。相互情報は実装されていませんが、より単純な Birchfield-Tomasi サブピクセル メトリックが使用されます。さらに、いくつかの前処理操作と後処理操作があります。
ここに画像の説明を挿入します
おそらくそれです、それが正しいかどうかはわかりません。

ディープステレオマッチングアルゴリズム

まずは穴を開けます

おすすめ

転載: blog.csdn.net/onlyyoujojo/article/details/135244558