カメラキャリブレーションと3次元再構成

gpu::StereoBM_GPU

Comments from the Wiki

gpu::StereoBM_GPU

ブロックマッチングアルゴリズムを用いてステレオ対応点を求めるためのクラス.

class StereoBM_GPU
{
public:
    enum { BASIC_PRESET = 0, PREFILTER_XSOBEL = 1 };

    enum { DEFAULT_NDISP = 64, DEFAULT_WINSZ = 19 };

    StereoBM_GPU();
    StereoBM_GPU(int preset, int ndisparities = DEFAULT_NDISP,
                 int winSize = DEFAULT_WINSZ);

    void operator() (const GpuMat& left, const GpuMat& right,
                     GpuMat& disparity);
    void operator() (const GpuMat& left, const GpuMat& right,
                     GpuMat& disparity, const Stream & stream);

    static bool checkIfGpuCallReasonable();

    int preset;
    int ndisp;
    int winSize;

    float avergeTexThreshold;

    ...
};

このクラスは,ブロックマッチングアルゴリズムを用いて視差マップを計算します.これには,事前処理,事後処理が含まれます:Sobel 事前フィルタリング( PREFILTER_XSOBEL がセットされた場合),および低テクスチャフィルタリング( avergeTexThreshold > 0 の場合)です. avergeTexThreshold = 0 の場合,低テクスチャフィルタリングは行われません.そうでない場合は,左画像において \sum HorizontalGradiensInWindow(x, y, winSize) < (winSize \cdot winSize) \cdot avergeTexThreshold となる箇所,つまり,左の入力画像のテクスチャが不足していると,各点 (x, y) における視差が0にセットされます.

cv::gpu::StereoBM_GPU::StereoBM_GPU

Comments from the Wiki

_

StereoBM_GPU::StereoBM_GPU()
StereoBM_GPU::StereoBM_GPU(int preset, int ndisparities = DEFAULT_NDISP, int winSize = DEFAULT_WINSZ)

StereoBMGPU コンストラクタ.

パラメタ:
  • preset

    プリセット:

    • BASIC_PRESET 事前処理なし.
    • PREFILTER_XSOBEL Sobel 事前フィルタ.
  • ndisparities – 視差数.これは,8の倍数かつ 256 以下の値でなければいけません.
  • winSize – ブロックサイズ.

cv::gpu::StereoBM_GPU::operator ()

Comments from the Wiki

void StereoBM_GPU::operator() (const GpuMat& left, const GpuMat& right, GpuMat& disparity)
void StereoBM_GPU::operator() (const GpuMat& left, const GpuMat& right, GpuMat& disparity, const Stream& stream)

ステレオ対応点オペレータ.指定された平行ステレオペアにおける視差を求めます.

パラメタ:
  • left – 左画像. CV_8UC1 型のみがサポートされています.
  • right – 右画像.左画像と同じサイズ,同じ型の画像です.
  • disparity – 出力される視差マップ.これは,入力画像と同じサイズで, CV_8UC1 型の画像になります.
  • stream – 非同期バージョン用のストリーム.

cv::gpu::StereoBM_GPU::checkIfGpuCallReasonable

Comments from the Wiki

bool StereoBM_GPU::checkIfGpuCallReasonable()

このアルゴリズムに対して,現在のGPUがCPUよりも高速に動作するか否かを推定する経験則.現在アクティブなデバイスに対して実行されます.

gpu::StereoBeliefPropagation

Comments from the Wiki

gpu::StereoBeliefPropagation

このクラスは,belief propagation アルゴリズムを用いて,ステレオ対応点を求めます.

class StereoBeliefPropagation
{
public:
    enum { DEFAULT_NDISP  = 64 };
    enum { DEFAULT_ITERS  = 5  };
    enum { DEFAULT_LEVELS = 5  };

    static void estimateRecommendedParams(int width, int height,
        int& ndisp, int& iters, int& levels);

    explicit StereoBeliefPropagation(int ndisp = DEFAULT_NDISP,
        int iters  = DEFAULT_ITERS,
        int levels = DEFAULT_LEVELS,
        int msg_type = CV_32F);
    StereoBeliefPropagation(int ndisp, int iters, int levels,
        float max_data_term, float data_weight,
        float max_disc_term, float disc_single_jump,
        int msg_type = CV_32F);

    void operator()(const GpuMat& left, const GpuMat& right,
                    GpuMat& disparity);
    void operator()(const GpuMat& left, const GpuMat& right,
                    GpuMat& disparity, Stream& stream);
    void operator()(const GpuMat& data, GpuMat& disparity);
    void operator()(const GpuMat& data, GpuMat& disparity, Stream& stream);

    int ndisp;

    int iters;
    int levels;

    float max_data_term;
    float data_weight;
    float max_disc_term;
    float disc_single_jump;

    int msg_type;

    ...
};

このクラスは,Pedro F. Felzenszwalb のアルゴリズム felzenszwalb_bp を実装しています.自身のデータのコスト(切断線形モデルを利用します)または,ユーザによって与えられたデータのコストを計算することができます.

注意事項: StereoBeliefPropagation は,大量のメモリを必要とします: メッセージストレージ用に

width \_ step  \cdot height  \cdot ndisp  \cdot 4  \cdot (1 + 0.25)

.また,データコストストレージ用に

width \_ step  \cdot height  \cdot ndisp  \cdot (1 + 0.25 + 0.0625 +  \dotsm +  \frac{1}{4^{levels}}

width_step は,パディングを含む1行のバイト数です.

cv::gpu::StereoBeliefPropagation::StereoBeliefPropagation

Comments from the Wiki

StereoBeliefPropagation::StereoBeliefPropagation(int ndisp = DEFAULT_NDISP, int iters = DEFAULT_ITERS, int levels = DEFAULT_LEVELS, int msg_type = CV_32F)
StereoBeliefPropagation::StereoBeliefPropagation(int ndisp, int iters, int levels, float max_data_term, float data_weight, float max_disc_term, float disc_single_jump, int msg_type = CV_32F)

StereoBeliefPropagation コンストラクタ

パラメタ:
  • ndisp – 視差数.
  • iters – 各レベルにおける BP 反復数.
  • levels – レベル数.
  • max_data_term – データコストを表す項の閾値.
  • data_weight – データの重み.
  • max_disc_term – 不連続性を表す項の閾値.
  • disc_single_jump – 1つの不連続を飛び越えるコスト.
  • msg_type – メッセージの型. CV_16SC1CV_32FC1 がサポートされています.

StereoBeliefPropagation uses truncated linear model for the data cost and discontinuity term:

DataCost = data \_ weight  \cdot \min ( \lvert I_2-I_1  \rvert , max \_ data \_ term)

DiscTerm =  \min (disc \_ single \_ jump  \cdot \lvert f_1-f_2  \rvert , max \_ disc \_ term)

詳細は, felzenszwalb_bp を参照してください.

デフォルトでは, StereoBeliefPropagation は,浮動小数点数を利用し,メッセージには CV_32FC1 型が用いられます.しかし,パフォーマンスを上げたい場合に,固定小数点数と CV_16SC1 型のメッセージを利用することもできます.この場合,オーバフローを避けるために,パラメータは以下を満足しなければいけません.

10  \cdot 2^{levels-1}  \cdot max \_ data \_ term < SHRT \_ MAX

cv::gpu::StereoBeliefPropagation::estimateRecommendedParams

Comments from the Wiki


void StereoBeliefPropagation::estimateRecommendedParams(int width, int height, int& ndisp, int& iters, int& levels)

指定された画像サイズ( widthと height)に対する推奨パラメータ( ndisp, iters, levels)を計算するための経験則.

cv::gpu::StereoBeliefPropagation::operator ()

Comments from the Wiki

void StereoBeliefPropagation::operator()( const GpuMat& left, const GpuMat& right, GpuMat& disparity)
void StereoBeliefPropagation::operator()( const GpuMat& left, const GpuMat& right, GpuMat& disparity, Stream& stream)

ステレオ対応点オペレータ.指定された平行化ステレオペア,またはデータコストにおける視差を求めます.

パラメタ:
  • left – 左画像. CV_8UC1 , CV_8UC3 および CV_8UC4 型がサポートされています.
  • right – 右画像.左画像と同じサイズ,同じ型です.
  • disparity – 出力される視差マップ. disparity が空の場合,出力型は CV_16SC1 になり,それ以外の場合は disparity.type() になります.
  • stream – 非同期バージョン用のストリーム.
void StereoBeliefPropagation::operator()( const GpuMat& data, GpuMat& disparity)
void StereoBeliefPropagation::operator()( const GpuMat& data, GpuMat& disparity, Stream& stream)
  • data ユーザ指定のデータコスト.これは,メッセージの型が msg_type で,サイズが \texttt{imgRows} \cdot \texttt{ndisp} \times \texttt{imgCols} でなければいけません.
  • disparity 出力される視差マップ. disparity が空の場合,出力型は CV_16SC1 になり,それ以外の場合は disparity.type() になります.
  • stream 非同期バージョン用のストリーム.

gpu::StereoConstantSpaceBP

Comments from the Wiki

gpu::StereoConstantSpaceBP

constant space belief propagation アルゴリズムを用いてステレオ対応点を求めるためのクラス.

class StereoConstantSpaceBP
{
public:
    enum { DEFAULT_NDISP    = 128 };
    enum { DEFAULT_ITERS    = 8   };
    enum { DEFAULT_LEVELS   = 4   };
    enum { DEFAULT_NR_PLANE = 4   };

    static void estimateRecommendedParams(int width, int height,
        int& ndisp, int& iters, int& levels, int& nr_plane);

    explicit StereoConstantSpaceBP(int ndisp = DEFAULT_NDISP,
        int iters    = DEFAULT_ITERS,
        int levels   = DEFAULT_LEVELS,
        int nr_plane = DEFAULT_NR_PLANE,
        int msg_type = CV_32F);
    StereoConstantSpaceBP(int ndisp, int iters, int levels, int nr_plane,
        float max_data_term, float data_weight,
        float max_disc_term, float disc_single_jump,
        int min_disp_th = 0,
        int msg_type = CV_32F);

    void operator()(const GpuMat& left, const GpuMat& right,
                    GpuMat& disparity);
    void operator()(const GpuMat& left, const GpuMat& right,
                    GpuMat& disparity, Stream& stream);

    int ndisp;

    int iters;
    int levels;

    int nr_plane;

    float max_data_term;
    float data_weight;
    float max_disc_term;
    float disc_single_jump;

    int min_disp_th;

    int msg_type;

    bool use_local_init_data_cost;

    ...
};

このクラスは,Q. Yang のアルゴリズム qx_csbp を実装しています. StereoConstantSpaceBP は,局所的最小値,大域的最小値データコスト初期化アルゴリズムを共にサポートしています.詳細は,論文をご覧ください.デフォルトでは,局所的最小値アルゴリズムが利用され,大域的最小値アルゴリズムを有効にするには use_local_init_data_cost を false にセットしてください.

cv::gpu::StereoConstantSpaceBP::StereoConstantSpaceBP

Comments from the Wiki

StereoConstantSpaceBP::StereoConstantSpaceBP(int ndisp = DEFAULT_NDISP, int iters = DEFAULT_ITERS, int levels = DEFAULT_LEVELS, int nr_plane = DEFAULT_NR_PLANE, int msg_type = CV_32F)
StereoConstantSpaceBP::StereoConstantSpaceBP(int ndisp, int iters, int levels, int nr_plane, float max_data_term, float data_weight, float max_disc_term, float disc_single_jump, int min_disp_th = 0, int msg_type = CV_32F)

StereoConstantSpaceBP コンストラクタ.

パラメタ:
  • ndisp – 視差数.
  • iters – 各レベルにおける BP 反復数.
  • levels – レベル数.
  • nr_plane – 1番目のレベルにおける,視差レベル数.
  • max_data_term – データコストを表す項の切断値.
  • data_weight – データの重み.
  • max_disc_term – 不連続性を表す項の切断値.
  • disc_single_jump – 1つの不連続を飛び越えるコスト.
  • min_disp_th – 最小視差の閾値.
  • msg_type – メッセージの型. CV_16SC1CV_32FC1 がサポートされています.

StereoConstantSpaceBP uses truncated linear model for the data cost and discontinuity term:

DataCost = data \_ weight  \cdot \min ( \lvert I_2-I_1  \rvert , max \_ data \_ term)

DiscTerm =  \min (disc \_ single \_ jump  \cdot \lvert f_1-f_2  \rvert , max \_ disc \_ term)

詳細は, qx_csbp を参照してください.

デフォルトでは, StereoConstantSpaceBP は,浮動小数点数を利用し,メッセージには CV_32FC1 型が用いられます.しかし,パフォーマンスを上げたい場合に,固定小数点数と CV_16SC1 型のメッセージを利用することもできます.この場合,オーバフローを避けるために,パラメータは以下を満足しなければいけません.

10  \cdot 2^{levels-1}  \cdot max \_ data \_ term < SHRT \_ MAX

cv::gpu::StereoConstantSpaceBP::estimateRecommendedParams

Comments from the Wiki

void StereoConstantSpaceBP::estimateRecommendedParams(int width, int height, int& ndisp, int& iters, int& levels, int& nr_plane)

指定された画像サイズ( widthと height)に対するパラメータ( ndisp, iters, levels, nrplane)を計算するための経験則.

cv::gpu::StereoConstantSpaceBP::operator ()

Comments from the Wiki

void StereoConstantSpaceBP::operator()( const GpuMat& left, const GpuMat& right, GpuMat& disparity)
void StereoConstantSpaceBP::operator()( const GpuMat& left, const GpuMat& right, GpuMat& disparity, Stream& stream)

ステレオ対応点オペレータ.指定された平行化ステレオペアにおける視差を求めます.

パラメタ:
  • left – 左画像. CV_8UC1 , CV_8UC3 および CV_8UC4 型がサポートされています.
  • right – 右画像.左画像と同じサイズ,同じ型です.
  • disparity – 出力される視差マップ. disparity が空の場合,出力型は CV_16SC1 になり,それ以外の場合は disparity.type() になります.
  • stream – 非同期バージョン用のストリーム.

gpu::DisparityBilateralFilter

Comments from the Wiki

gpu::DisparityBilateralFilter

joint bilateral フィルタリングによる視差マップ改善のためのクラス.

class CV_EXPORTS DisparityBilateralFilter
{
public:
    enum { DEFAULT_NDISP  = 64 };
    enum { DEFAULT_RADIUS = 3 };
    enum { DEFAULT_ITERS  = 1 };

    explicit DisparityBilateralFilter(int ndisp = DEFAULT_NDISP,
        int radius = DEFAULT_RADIUS, int iters = DEFAULT_ITERS);

    DisparityBilateralFilter(int ndisp, int radius, int iters,
        float edge_threshold, float max_disc_threshold,
        float sigma_range);

    void operator()(const GpuMat& disparity, const GpuMat& image,
                    GpuMat& dst);
    void operator()(const GpuMat& disparity, const GpuMat& image,
                    GpuMat& dst, Stream& stream);

    ...
};

このクラスは,Q. Yang のアルゴリズム qx_csbp を実装しています.

cv::gpu::DisparityBilateralFilter::DisparityBilateralFilter

Comments from the Wiki

DisparityBilateralFilter::DisparityBilateralFilter(int ndisp = DEFAULT_NDISP, int radius = DEFAULT_RADIUS, int iters = DEFAULT_ITERS)
DisparityBilateralFilter::DisparityBilateralFilter(int ndisp, int radius, int iters, float edge_threshold, float max_disc_threshold, float sigma_range)

DisparityBilateralFilter コンストラクタ.

パラメタ:
  • ndisp – 視差数.
  • radius – フィルタ半径.
  • iters – 反復数.
  • edge_threshold – データの連続性に対する閾値.
  • max_disc_threshold – 外れ値を除外するための定数.
  • sigma_range – フィルタ範囲.

cv::gpu::DisparityBilateralFilter::operator ()

Comments from the Wiki

void DisparityBilateralFilter::operator()( const GpuMat& disparity, const GpuMat& image, GpuMat& dst)
void DisparityBilateralFilter::operator()( const GpuMat& disparity, const GpuMat& image, GpuMat& dst, Stream& stream)

joint bilateral フィルタリングを用いて,視差マップを改善します.

パラメタ:
  • disparity – 入力視差マップ. CV_8UC1CV_16SC1 型がサポートされています.
  • image – 入力画像. CV_8UC1CV_8UC3 型がサポートされています.
  • dst – 出力視差マップ. disparity と同じサイズ,同じ型になります.
  • stream – 非同期バージョン用のストリーム.

cv::gpu::drawColorDisp

Comments from the Wiki

void drawColorDisp(const GpuMat& src_disp, GpuMat& dst_disp, int ndisp)
void drawColorDisp(const GpuMat& src_disp, GpuMat& dst_disp, int ndisp, const Stream& stream)

視差画像に色をつけます.

パラメタ:
  • src_disp – 入力視差画像. CV_8UC1CV_16SC1 型がサポートされます.
  • dst_disp – 出力視差画像. src_disp と同じサイズで, CV_8UC4 型の BGRA フォーマット(alpha = 255)です.
  • ndisp – 視差数.
  • stream – 非同期バージョン用のストリーム.

この関数は, [0..ndisp)HSV 色空間の [0..240, 1, 1] に変換し,その HSV 色空間を RGB に変換します.

cv::gpu::reprojectImageTo3D

Comments from the Wiki

void reprojectImageTo3D(const GpuMat& disp, GpuMat& xyzw, const Mat& Q)
void reprojectImageTo3D(const GpuMat& disp, GpuMat& xyzw, const Mat& Q, const Stream& stream)

視差画像を3次元空間に再投影します.

パラメタ:
  • disp – 入力視差画像. CV_8U および CV_16S 型をサポートしています.
  • xyzw – 出力される,4チャンネル, disp と同じサイズの浮動小数点型画像です. xyzw(x,y) の各要素には,視差画像を元に求められた,点 (x,y) に対応する3次元座標 (x,y,z,1) が格納されます.
  • QStereoRectify で得られる, 4 \times 4 の射影変換行列.
  • stream – 非同期バージョン用のストリーム.

参考: reprojectImageTo3D() .