calib3d_solvePnP_vector

[32/64bit] 3次元と2次元の点の対応関係から,物体の姿勢を見つけます.この関数は,オブジェクト座標フレームで表現された3次元点を,カメラ座標フレームに変換するための回転ベクトルと並進ベクトルを,それぞれ異なる方法で返します.

calib3d_solvePnP_vector p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11

p1 = var : Point3f[] objectPoints
p2 = int : int objectPointsLength
p3 = var : Point2f[] imagePoints
p4 = int : int imagePointsLength
p5 = var : double* cameraMatrix
p6 = var : double[]? distCoeffs
p7 = int : int distCoeffsLength
p8 = var : [Out] double[] rvec
p9 = var : [Out] double[] tvec
p10 = int : int useExtrinsicGuess
p11 = int : int flags

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

解説

P3Pメソッド(SOLVEPNP_P3P、SOLVEPNP_AP3P):唯一の解を返すために4つの入力点を必要とする。


SOLVEPNP_IPPE 入力点は >= 4 でなければならず、オブジェクト点は同一平面上になければならない。


SOLVEPNP_IPPE_SQUARE マーカーのポーズ推定に適した特殊なケース。入力点の数は4でなければなりません。オブジェクトポイントは以下の順序で定義する必要があります。


点0: [-squareLength / 2, squareLength / 2, 0] 。


point 1: [ squareLength / 2, squareLength / 2, 0]の順に定義される。


ポイント2:[ squareLength / 2, -squareLength / 2, 0]の順になります。


点3:[-squareLength / 2, -squareLength / 2, 0]。








この関数は,オブジェクトポイントの集合と,それに対応する画像投影,カメラの固有行列と歪み係数が与えられた場合に,オブジェクトの姿勢を推定します(より正確には,カメラフレームのX軸は右向き,Y軸は下向き,Z軸は前向き).ワールドフレームで表現された点は、透視投影モデルとカメラ固有のパラメータマトリクスを用いて、画像平面に投影されます。\♪ u ♪ v ♪ 1 ♪ end{bmatrix} &= ??? -? ????\0.1em\\\\^{c}\\{T}_wX_{w}\\ Y_{w}\\ ♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪\\ ♪♪♪♪♪~\\ ♪♪♪♪♪♪♪♪~\♪♪~♪ 1 & 0 & 0 & 0 ♪ 0 & 0 & 1 & 0 ♪ END\r_{11} & r_{12} & r_{13} & t_x ¶ r_{21} & r_{22} & r_{23} & t_y ¶ r_{31} & r_{32} & r_{33} & t_z ¶ 0 & 0 & 1 ¶ end{bmatrix}.\♪♪♪♪♪♪♪~X_{w}\\ X_{w}/Y_{w}\\ ♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪\\\\\♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪\推定されたポーズは、ワールドフレームで表現された3Dポイントをカメラフレームに変換するための回転(rvec)と平行移動(tvec)のベクトルとなります。\\\\X_c ¶ Y_c ¶ Z_c ¶ 1 ¶end{bmatrix} &= ¶hspace{0.2em}.^{c}\\{T}_wX_{w}\\ Y_{w}\\ ♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪\\ ♪♪♪♪♪~\\\\♪ X, Y, Z\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\♪♪♪♪♪♪♪~X_{w}\\ X_{w}/Y_{w}\\ ♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪\\\\\♪♪♪♪end{align*}\Note


平面型拡張現実感に対する solvePnP の使用例は opencv_source_code/samples/python/plane_ar.py にあります。


Pythonをお使いの方へ。


solvePnP は連続した配列を必要とするので,Numpy 配列スライスは入力として動作しません(modules/calib3d/src/solvepnp.cpp version 2.4.9 の 55 行目あたりで cv::Mat::checkVector() を用いたアサーションにより強制されています).


P3P アルゴリズムでは,2 チャンネルの情報を必要とする undistortPoints の呼び出し(modules/calib3d/src/solvepnp.cpp version 2.4.9 の 75 行目付近)のために,画像ポイントが (N,1,2) の形をした配列になっている必要があります.


したがって,あるデータ D = np.array(...) (D.shape = (N,M)) が与えられた場合,そのサブセットを例えば imagePoints として使用するためには,それを新しい配列に効果的にコピーしなければなりません: imagePoints = np.ascontiguousarray(D[:,:2]).reshape((N,1,2))








SOLVEPNP_DLSおよびSOLVEPNP_UPNPメソッドは、現在の実装が不安定で、完全に間違った結果を与えることがあるため、使用できません。これら2つのフラグのいずれかを渡すと、代わりにSOLVEPNP_EPNPメソッドが使用されます。


一般的なケースでは、最小ポイント数は4である。SOLVEPNP_P3PおよびSOLVEPNP_AP3P法の場合、正確に4点を使用することが必要である(最初の3点はP3P問題のすべての解を推定するために使用され、最後の1点は再投影誤差を最小化する最良の解を保持するために使用される)。


SOLVEPNP_ITERATIVEメソッドとuseExtrinsicGuess=trueを使用した場合、最小のポイント数は3です(ポーズを計算するには3ポイントで十分ですが、最大で4つの解があります)。収束させるためには、初期解をグローバル解に近づける必要があります。


SOLVEPNP_IPPEの場合、入力ポイントは≧4でなければならず、オブジェクトポイントはコプラナーでなければなりません。


SOLVEPNP_IPPE_SQUARE の場合、これはマーカーのポーズ推定に適した特殊なケースです。入力点の数は 4 でなければなりません。オブジェクトポイントは以下の順序で定義しなければならない。


点0: [-squareLength / 2, squareLength / 2, 0] 。


point 1: [ squareLength / 2, squareLength / 2, 0]の順に定義される。


ポイント2:[ squareLength / 2, -squareLength / 2, 0]の順になります。


point 3: [-squareLength / 2, -squareLength / 2, 0]SOLVEPNP_SQPNPの場合、入力ポイントは≧3でなければなりませんサンプル:samples/cpp/tutorial_code/features2D/Homography/decompose_homography.cpp、samples/cpp/tutorial_code/features2D/Homography/homography_from_camera_displacement.cpp。

元関数名(C#): calib3d_solvePnP_vector
元DLLエクスポート名: calib3d_solvePnP_vector
参照元CSファイル: Internal\PInvoke\NativeMethods\calib3d\NativeMethods_calib3d.cs
▼ C言語側関数定義
CVAPI(ExceptionStatus) calib3d_solvePnP_vector(cv::Point3f *objectPoints, int objectPointsLength,
    cv::Point2f *imagePoints, int imagePointsLength,
    double *cameraMatrix, double *distCoeffs, int distCoeffsLength,
    double *rvec, double *tvec, int useExtrinsicGuess,
    int flags)
{
    BEGIN_WRAP
    const cv::Mat objectPointsMat(objectPointsLength, 1, CV_32FC3, objectPoints);
    const cv::Mat imagePointsMat(imagePointsLength, 1, CV_32FC2, imagePoints);
    cv::Mat distCoeffsMat;
    if (distCoeffs != nullptr)
        distCoeffsMat = cv::Mat(distCoeffsLength, 1, CV_64FC1, distCoeffs);

    const cv::Matx<double, 3, 3> cameraMatrixMat(cameraMatrix);
    cv::Matx<double, 3, 1> rvecMat, tvecMat;
    cv::solvePnP(objectPointsMat, imagePointsMat, cameraMatrixMat, distCoeffsMat, rvecMat, tvecMat, useExtrinsicGuess != 0, flags);
    memcpy(rvec, rvecMat.val, sizeof(double) * 3);
    memcpy(tvec, tvecMat.val, sizeof(double) * 3);
    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