calib3d_stereoRectify_array

[32/64bit] キャリブレーションされたステレオカメラの各ヘッドに対して,平行化変換を計算します.

calib3d_stereoRectify_array p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19

p1 = var : double* cameraMatrix1
p2 = var : double[] distCoeffs1
p3 = int : int dc1Size
p4 = var : double* cameraMatrix2
p5 = var : double[] distCoeffs2
p6 = int : int dc2Size
p7 = ARGS_SIZE : Size imageSize
p8 = var : double* R
p9 = var : double[] T
p10 = var : double* R1
p11 = var : double* R2
p12 = var : double* P1
p13 = var : double* P2
p14 = var : double* Q
p15 = int : int flags
p16 = double : double alpha
p17 = ARGS_SIZE : Size newImageSize
p18 = var : out Rect validPixROI1
p19 = var : out Rect validPixROI2

(プラグイン / モジュール : OpenCvSharpExtern.dll)

解説

この関数は,各カメラの回転行列を計算し,両カメラの画像平面を(仮想的に)同一平面にします.その結果,すべてのエピポーラ線が平行になり,密なステレオ対応関係の問題が簡単になります.この関数は, stereoCalibrate によって計算された行列を入力として受け取ります.出力として,2つの回転行列と,新しい座標への2つの投影行列が得られます.この関数は,以下の2つのケースを区別します:水平ステレオ:1番目と2番目のカメラのビューが,主にx軸に沿って相対的にシフトします(わずかな垂直方向のシフトもあり得ます).整形された画像では,左右のカメラの対応するエピポーラ線は水平で,同じy座標を持ちます.P1とP2は次のようになります。





\P1} = ????? ) ????? ) ????? ) ????? ) ????? ) ????? ) ????? ) ????? ) ????? ) ??_?CC








\\\\,\]





ここで、T_x\はカメラ間の水平方向の移動量、CALIB_ZERO_DISPARITYが設定されている場合は、\(cx_1=cx_2\)となります。





垂直方向のステレオ:1台目と2台目のカメラのビューは、主に垂直方向に相対的にシフトします(おそらく水平方向にも少しシフトします)。整形された画像のエピポーララインは垂直で,同じx座標を持っています.P1とP2は次のようになります。





\P1 = ????? ) ????? ) ????? ) ????? ) ????? ) ????? ) ????? ) ????? ) ????? ) ??_?CC








\♪\\\\





ご覧のように、P1、P2の最初の3列は、実質的に新しい「平行化された」カメラ行列となります。この行列は,R1 と R2 とともに initUndistortRectifyMap に渡され,各カメラの平行化マップを初期化します。以下に,stereo_calib.cpp サンプルのスクリーンショットを示します。いくつかの赤い水平線が,対応する画像領域を通過しています.これは,画像がよく平行化されていることを意味しており,ほとんどのステレオ対応付けアルゴリズムがこれに依存しています.緑色の四角形は, roi1 と roi2 です.これらの内部は,すべて有効なピクセルであることが分かります.

元関数名(C#): calib3d_stereoRectify_array
元DLLエクスポート名: calib3d_stereoRectify_array
参照元CSファイル: Internal\PInvoke\NativeMethods\calib3d\NativeMethods_calib3d.cs
▼ C言語側関数定義
CVAPI(ExceptionStatus) calib3d_stereoRectify_array(double *cameraMatrix1,
    double *distCoeffs1, int dc1Size,
    double *cameraMatrix2,
    double *distCoeffs2, int dc2Size,
    MyCvSize imageSize,
    double *R, double *T,
    double *R1, double *R2, double *P1, double *P2,
    double *Q, int flags, double alpha, MyCvSize newImageSize,
    MyCvRect *validPixROI1, MyCvRect *validPixROI2)
{
    BEGIN_WRAP
    cv::Mat cameraMatrix1M(3, 3, CV_64FC1, cameraMatrix1);
    cv::Mat cameraMatrix2M(3, 3, CV_64FC1, cameraMatrix2);
    cv::Mat distCoeffs1M(dc1Size, 1, CV_64FC1, distCoeffs1);
    cv::Mat distCoeffs2M(dc2Size, 1, CV_64FC1, distCoeffs2);
    cv::Mat RM(3, 3, CV_64FC1, R);
    cv::Mat TM(1, 3, CV_64FC1, T);

    cv::Mat R1M(3, 3, CV_64FC1, R1);
    cv::Mat R2M(3, 3, CV_64FC1, R2);
    cv::Mat P1M(3, 4, CV_64FC1, P1);
    cv::Mat P2M(3, 4, CV_64FC1, P2);
    cv::Mat QM(4, 4, CV_64FC1, Q);

    cv::Rect _validPixROI1, _validPixROI2;
    cv::stereoRectify(cameraMatrix1M, distCoeffs1M, cameraMatrix2M, distCoeffs2M,
        cpp(imageSize), RM, TM, R1M, R2M, P1M, P2M, QM, flags, alpha, cpp(newImageSize),
        &_validPixROI1, &_validPixROI2);
    *validPixROI1 = c(_validPixROI1);
    *validPixROI2 = c(_validPixROI2);
    END_WRAP
}

情報

プラグイン / モジュールOpenCvSharpExtern.dll
バージョン1.00
作成日2021/11/30
著作者inovia
URLhttps://hsp.moe/
備考#include "OpenCvSharpExtern32.as"
#include "OpenCvSharpExtern64.as"
使用するHSPランタイムのビット数に合わせたインクルードファイルを使用すること
タイプOpenCVSharpラッパーDLL
グループNativeMethods_calib3d
対応環境
  • Windows 版 HSP
hs ファイルhsphelp\OpenCvSharpExtern.hs