カメラキャリブレーションと3次元再構成 ======================================================= .. highlight:: cpp .. index:: gpu::StereoBM_GPU .. _gpu::StereoBM_GPU: gpu::StereoBM_GPU ----------------- `id=0.954546910778 Comments from the Wiki `__ .. ctype:: gpu::StereoBM_GPU ブロックマッチングアルゴリズムを用いてステレオ対応点を求めるためのクラス. .. code-block:: c 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`` :math:`>` 0 の場合)です. ``avergeTexThreshold = 0`` の場合,低テクスチャフィルタリングは行われません.そうでない場合は,左画像において :math:`\sum HorizontalGradiensInWindow(x, y, winSize) < (winSize \cdot winSize) \cdot avergeTexThreshold` となる箇所,つまり,左の入力画像のテクスチャが不足していると,各点 ``(x, y)`` における視差が0にセットされます. .. index:: cv::gpu::StereoBM_GPU::StereoBM_GPU .. _cv::gpu::StereoBM_GPU::StereoBM_GPU: cv::gpu::StereoBM_GPU::StereoBM_GPU ----------------------------------- `id=0.951318691086 Comments from the Wiki `__ _ .. cfunction:: StereoBM_GPU::StereoBM_GPU() .. cfunction:: StereoBM_GPU::StereoBM_GPU(int preset, int ndisparities = DEFAULT_NDISP, int winSize = DEFAULT_WINSZ) StereoBMGPU コンストラクタ. :param preset: プリセット: * **BASIC_PRESET** 事前処理なし. * **PREFILTER_XSOBEL** Sobel 事前フィルタ. :param ndisparities: 視差数.これは,8の倍数かつ 256 以下の値でなければいけません. :param winSize: ブロックサイズ. .. index:: cv::gpu::StereoBM_GPU::operator () .. _cv::gpu::StereoBM_GPU::operator (): cv::gpu::StereoBM_GPU::operator () ---------------------------------- `id=0.0984560471259 Comments from the Wiki `__ .. cfunction:: void StereoBM_GPU::operator() (const GpuMat\& left, const GpuMat\& right, GpuMat\& disparity) .. cfunction:: void StereoBM_GPU::operator() (const GpuMat\& left, const GpuMat\& right, GpuMat\& disparity, const Stream\& stream) ステレオ対応点オペレータ.指定された平行ステレオペアにおける視差を求めます. :param left: 左画像. ``CV_8UC1`` 型のみがサポートされています. :param right: 右画像.左画像と同じサイズ,同じ型の画像です. :param disparity: 出力される視差マップ.これは,入力画像と同じサイズで, ``CV_8UC1`` 型の画像になります. :param stream: 非同期バージョン用のストリーム. .. index:: cv::gpu::StereoBM_GPU::checkIfGpuCallReasonable .. _cv::gpu::StereoBM_GPU::checkIfGpuCallReasonable: cv::gpu::StereoBM_GPU::checkIfGpuCallReasonable ----------------------------------------------- `id=0.0250241562029 Comments from the Wiki `__ .. cfunction:: bool StereoBM_GPU::checkIfGpuCallReasonable() このアルゴリズムに対して,現在のGPUがCPUよりも高速に動作するか否かを推定する経験則.現在アクティブなデバイスに対して実行されます. .. index:: gpu::StereoBeliefPropagation .. _gpu::StereoBeliefPropagation: gpu::StereoBeliefPropagation ---------------------------- `id=0.620577978819 Comments from the Wiki `__ .. ctype:: gpu::StereoBeliefPropagation このクラスは,belief propagation アルゴリズムを用いて,ステレオ対応点を求めます. .. code-block:: c 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`` は,大量のメモリを必要とします: メッセージストレージ用に .. math:: width \_ step \cdot height \cdot ndisp \cdot 4 \cdot (1 + 0.25) .また,データコストストレージ用に .. math:: width \_ step \cdot height \cdot ndisp \cdot (1 + 0.25 + 0.0625 + \dotsm + \frac{1}{4^{levels}} . ``width_step`` は,パディングを含む1行のバイト数です. .. index:: gpu::StereoBeliefPropagation::StereoBeliefPropagation cv::gpu::StereoBeliefPropagation::StereoBeliefPropagation --------------------------------------------------------- `id=0.764379555112 Comments from the Wiki `__ .. cfunction:: StereoBeliefPropagation::StereoBeliefPropagation( int ndisp = DEFAULT_NDISP, int iters = DEFAULT_ITERS, int levels = DEFAULT_LEVELS, int msg_type = CV_32F) .. cfunction:: 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 コンストラクタ :param ndisp: 視差数. :param iters: 各レベルにおける BP 反復数. :param levels: レベル数. :param max_data_term: データコストを表す項の閾値. :param data_weight: データの重み. :param max_disc_term: 不連続性を表す項の閾値. :param disc_single_jump: 1つの不連続を飛び越えるコスト. :param msg_type: メッセージの型. ``CV_16SC1`` と ``CV_32FC1`` がサポートされています. ``StereoBeliefPropagation`` uses truncated linear model for the data cost and discontinuity term: .. math:: DataCost = data \_ weight \cdot \min ( \lvert I_2-I_1 \rvert , max \_ data \_ term) .. math:: DiscTerm = \min (disc \_ single \_ jump \cdot \lvert f_1-f_2 \rvert , max \_ disc \_ term) 詳細は, felzenszwalb_bp を参照してください. デフォルトでは, ``StereoBeliefPropagation`` は,浮動小数点数を利用し,メッセージには ``CV_32FC1`` 型が用いられます.しかし,パフォーマンスを上げたい場合に,固定小数点数と ``CV_16SC1`` 型のメッセージを利用することもできます.この場合,オーバフローを避けるために,パラメータは以下を満足しなければいけません. .. math:: 10 \cdot 2^{levels-1} \cdot max \_ data \_ term < SHRT \_ MAX .. index:: gpu::StereoBeliefPropagation::estimateRecommendedParams cv::gpu::StereoBeliefPropagation::estimateRecommendedParams ----------------------------------------------------------- `id=0.190588234905 Comments from the Wiki `__ ```` ```` ```` ```` ```` .. cfunction:: void StereoBeliefPropagation::estimateRecommendedParams( int width, int height, int\& ndisp, int\& iters, int\& levels) 指定された画像サイズ( widthと height)に対する推奨パラメータ( ndisp, iters, levels)を計算するための経験則. .. index:: gpu::StereoBeliefPropagation::operator () cv::gpu::StereoBeliefPropagation::operator () --------------------------------------------- `id=0.789337769743 Comments from the Wiki `__ .. cfunction:: void StereoBeliefPropagation::operator()( const GpuMat\& left, const GpuMat\& right, GpuMat\& disparity) .. cfunction:: void StereoBeliefPropagation::operator()( const GpuMat\& left, const GpuMat\& right, GpuMat\& disparity, Stream\& stream) ステレオ対応点オペレータ.指定された平行化ステレオペア,またはデータコストにおける視差を求めます. :param left: 左画像. ``CV_8UC1`` , ``CV_8UC3`` および ``CV_8UC4`` 型がサポートされています. :param right: 右画像.左画像と同じサイズ,同じ型です. :param disparity: 出力される視差マップ. ``disparity`` が空の場合,出力型は ``CV_16SC1`` になり,それ以外の場合は ``disparity.type()`` になります. :param stream: 非同期バージョン用のストリーム. .. cfunction:: void StereoBeliefPropagation::operator()( const GpuMat\& data, GpuMat\& disparity) .. cfunction:: void StereoBeliefPropagation::operator()( const GpuMat\& data, GpuMat\& disparity, Stream\& stream) * **data** ユーザ指定のデータコスト.これは,メッセージの型が ``msg_type`` で,サイズが :math:`\texttt{imgRows} \cdot \texttt{ndisp} \times \texttt{imgCols}` でなければいけません. * **disparity** 出力される視差マップ. ``disparity`` が空の場合,出力型は ``CV_16SC1`` になり,それ以外の場合は ``disparity.type()`` になります. * **stream** 非同期バージョン用のストリーム. .. index:: gpu::StereoConstantSpaceBP .. _gpu::StereoConstantSpaceBP: gpu::StereoConstantSpaceBP -------------------------- `id=0.863145643303 Comments from the Wiki `__ .. ctype:: gpu::StereoConstantSpaceBP constant space belief propagation アルゴリズムを用いてステレオ対応点を求めるためのクラス. .. code-block:: c 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 にセットしてください. .. index:: gpu::StereoConstantSpaceBP::StereoConstantSpaceBP cv::gpu::StereoConstantSpaceBP::StereoConstantSpaceBP ----------------------------------------------------- `id=0.780494640086 Comments from the Wiki `__ .. cfunction:: 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) .. cfunction:: 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 コンストラクタ. :param ndisp: 視差数. :param iters: 各レベルにおける BP 反復数. :param levels: レベル数. :param nr_plane: 1番目のレベルにおける,視差レベル数. :param max_data_term: データコストを表す項の切断値. :param data_weight: データの重み. :param max_disc_term: 不連続性を表す項の切断値. :param disc_single_jump: 1つの不連続を飛び越えるコスト. :param min_disp_th: 最小視差の閾値. :param msg_type: メッセージの型. ``CV_16SC1`` と ``CV_32FC1`` がサポートされています. ``StereoConstantSpaceBP`` uses truncated linear model for the data cost and discontinuity term: .. math:: DataCost = data \_ weight \cdot \min ( \lvert I_2-I_1 \rvert , max \_ data \_ term) .. math:: DiscTerm = \min (disc \_ single \_ jump \cdot \lvert f_1-f_2 \rvert , max \_ disc \_ term) 詳細は, qx_csbp を参照してください. デフォルトでは, ``StereoConstantSpaceBP`` は,浮動小数点数を利用し,メッセージには ``CV_32FC1`` 型が用いられます.しかし,パフォーマンスを上げたい場合に,固定小数点数と ``CV_16SC1`` 型のメッセージを利用することもできます.この場合,オーバフローを避けるために,パラメータは以下を満足しなければいけません. .. math:: 10 \cdot 2^{levels-1} \cdot max \_ data \_ term < SHRT \_ MAX .. index:: gpu::StereoConstantSpaceBP::estimateRecommendedParams cv::gpu::StereoConstantSpaceBP::estimateRecommendedParams --------------------------------------------------------- `id=0.894300721089 Comments from the Wiki `__ ```` ```` ```` ```` ```` ``_`` .. cfunction:: void StereoConstantSpaceBP::estimateRecommendedParams( int width, int height, int\& ndisp, int\& iters, int\& levels, int\& nr_plane) 指定された画像サイズ( widthと height)に対するパラメータ( ndisp, iters, levels, nrplane)を計算するための経験則. .. index:: gpu::StereoConstantSpaceBP::operator () cv::gpu::StereoConstantSpaceBP::operator () ------------------------------------------- `id=0.745731287114 Comments from the Wiki `__ .. cfunction:: void StereoConstantSpaceBP::operator()( const GpuMat\& left, const GpuMat\& right, GpuMat\& disparity) .. cfunction:: void StereoConstantSpaceBP::operator()( const GpuMat\& left, const GpuMat\& right, GpuMat\& disparity, Stream\& stream) ステレオ対応点オペレータ.指定された平行化ステレオペアにおける視差を求めます. :param left: 左画像. ``CV_8UC1`` , ``CV_8UC3`` および ``CV_8UC4`` 型がサポートされています. :param right: 右画像.左画像と同じサイズ,同じ型です. :param disparity: 出力される視差マップ. ``disparity`` が空の場合,出力型は ``CV_16SC1`` になり,それ以外の場合は ``disparity.type()`` になります. :param stream: 非同期バージョン用のストリーム. .. index:: gpu::DisparityBilateralFilter .. _gpu::DisparityBilateralFilter: gpu::DisparityBilateralFilter ----------------------------- `id=0.0573275524172 Comments from the Wiki `__ .. ctype:: gpu::DisparityBilateralFilter joint bilateral フィルタリングによる視差マップ改善のためのクラス. .. code-block:: c 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 を実装しています. .. index:: gpu::DisparityBilateralFilter::DisparityBilateralFilter cv::gpu::DisparityBilateralFilter::DisparityBilateralFilter ----------------------------------------------------------- `id=0.843862400514 Comments from the Wiki `__ .. cfunction:: DisparityBilateralFilter::DisparityBilateralFilter( int ndisp = DEFAULT_NDISP, int radius = DEFAULT_RADIUS, int iters = DEFAULT_ITERS) .. cfunction:: DisparityBilateralFilter::DisparityBilateralFilter( int ndisp, int radius, int iters, float edge_threshold, float max_disc_threshold, float sigma_range) DisparityBilateralFilter コンストラクタ. :param ndisp: 視差数. :param radius: フィルタ半径. :param iters: 反復数. :param edge_threshold: データの連続性に対する閾値. :param max_disc_threshold: 外れ値を除外するための定数. :param sigma_range: フィルタ範囲. .. index:: gpu::DisparityBilateralFilter::operator () cv::gpu::DisparityBilateralFilter::operator () ---------------------------------------------- `id=0.781228616937 Comments from the Wiki `__ .. cfunction:: void DisparityBilateralFilter::operator()( const GpuMat\& disparity, const GpuMat\& image, GpuMat\& dst) .. cfunction:: void DisparityBilateralFilter::operator()( const GpuMat\& disparity, const GpuMat\& image, GpuMat\& dst, Stream\& stream) joint bilateral フィルタリングを用いて,視差マップを改善します. :param disparity: 入力視差マップ. ``CV_8UC1`` と ``CV_16SC1`` 型がサポートされています. :param image: 入力画像. ``CV_8UC1`` と ``CV_8UC3`` 型がサポートされています. :param dst: 出力視差マップ. ``disparity`` と同じサイズ,同じ型になります. :param stream: 非同期バージョン用のストリーム. .. index:: gpu::drawColorDisp cv::gpu::drawColorDisp ---------------------- `id=0.789608783561 Comments from the Wiki `__ .. cfunction:: void drawColorDisp(const GpuMat\& src_disp, GpuMat\& dst_disp, int ndisp) .. cfunction:: void drawColorDisp(const GpuMat\& src_disp, GpuMat\& dst_disp, int ndisp, const Stream\& stream) 視差画像に色をつけます. :param src_disp: 入力視差画像. ``CV_8UC1`` と ``CV_16SC1`` 型がサポートされます. :param dst_disp: 出力視差画像. ``src_disp`` と同じサイズで, ``CV_8UC4`` 型の ``BGRA`` フォーマット(alpha = 255)です. :param ndisp: 視差数. :param stream: 非同期バージョン用のストリーム. この関数は, :math:`[0..ndisp)` を ``HSV`` 色空間の :math:`[0..240, 1, 1]` に変換し,その ``HSV`` 色空間を ``RGB`` に変換します. .. index:: gpu::reprojectImageTo3D cv::gpu::reprojectImageTo3D --------------------------- `id=0.854532463963 Comments from the Wiki `__ .. cfunction:: void reprojectImageTo3D(const GpuMat\& disp, GpuMat\& xyzw, const Mat\& Q) .. cfunction:: void reprojectImageTo3D(const GpuMat\& disp, GpuMat\& xyzw, const Mat\& Q, const Stream\& stream) 視差画像を3次元空間に再投影します. :param disp: 入力視差画像. ``CV_8U`` および ``CV_16S`` 型をサポートしています. :param xyzw: 出力される,4チャンネル, ``disp`` と同じサイズの浮動小数点型画像です. ``xyzw(x,y)`` の各要素には,視差画像を元に求められた,点 ``(x,y)`` に対応する3次元座標 ``(x,y,z,1)`` が格納されます. :param Q: :ref:`StereoRectify` で得られる, :math:`4 \times 4` の射影変換行列. :param stream: 非同期バージョン用のストリーム. 参考: :func:`reprojectImageTo3D` .