40

OpenCV でいくつかの点を三角測量しようとしていますが、このcv::triangulatePoints()関数を見つけました。問題は、そのドキュメントや例がほとんどないことです。

私はそれについていくつかの疑問を持っています。

  1. どのような方法を使用しますか? 私は三角測量について小さな調査を行っており、いくつかの方法 (線形、線形 LS、固有値、反復 LS、反復固有値など) がありますが、OpenCV で使用されているものを見つけることができません。

  2. どのように使用すればよいですか?入力として、射影行列と3xNの均一な2Dポイントが必要なようです。私はそれらを として定義していますstd::vector<cv::Point3d> pntsが、出力として4xN配列が必要std::vector<cv::Point4d>であり、存在しないため明らかに作成できません。出力ベクトルをどのように定義すればよいですか?

私が試した 2 番目の質問: cv::Mat pnts3D(4,N,CV_64F);andについてはcv::Mat pnts3d;、どちらも機能していないようです (例外がスローされます)。

4

6 に答える 6

16

@Ander Biguriの回答への小さな追加。非undistorted 画像で画像ポイントを取得undistortPoints()し、cam0pntsandで呼び出す必要がありますcam1pnts。これcv::triangulatePointsは、正規化された座標 (カメラから独立した) の 2D ポイントが必要でありcam0cam1必要のない[R|t^T]マトリックスのみである必要があるためです。Aで乗算します。

于 2015-04-23T10:05:03.213 に答える
3

cv::triangulatePoints を試してみたのですが、なぜかガベージ計算してしまいます。三角形分割された 3D ポイントの 4x1 マトリックスを返す線形三角形分割メソッドを手動で実装することを余儀なくされました。

Mat triangulate_Linear_LS(Mat mat_P_l, Mat mat_P_r, Mat warped_back_l, Mat warped_back_r)
{
    Mat A(4,3,CV_64FC1), b(4,1,CV_64FC1), X(3,1,CV_64FC1), X_homogeneous(4,1,CV_64FC1), W(1,1,CV_64FC1);
    W.at<double>(0,0) = 1.0;
    A.at<double>(0,0) = (warped_back_l.at<double>(0,0)/warped_back_l.at<double>(2,0))*mat_P_l.at<double>(2,0) - mat_P_l.at<double>(0,0);
    A.at<double>(0,1) = (warped_back_l.at<double>(0,0)/warped_back_l.at<double>(2,0))*mat_P_l.at<double>(2,1) - mat_P_l.at<double>(0,1);
    A.at<double>(0,2) = (warped_back_l.at<double>(0,0)/warped_back_l.at<double>(2,0))*mat_P_l.at<double>(2,2) - mat_P_l.at<double>(0,2);
    A.at<double>(1,0) = (warped_back_l.at<double>(1,0)/warped_back_l.at<double>(2,0))*mat_P_l.at<double>(2,0) - mat_P_l.at<double>(1,0);
    A.at<double>(1,1) = (warped_back_l.at<double>(1,0)/warped_back_l.at<double>(2,0))*mat_P_l.at<double>(2,1) - mat_P_l.at<double>(1,1);
    A.at<double>(1,2) = (warped_back_l.at<double>(1,0)/warped_back_l.at<double>(2,0))*mat_P_l.at<double>(2,2) - mat_P_l.at<double>(1,2);
    A.at<double>(2,0) = (warped_back_r.at<double>(0,0)/warped_back_r.at<double>(2,0))*mat_P_r.at<double>(2,0) - mat_P_r.at<double>(0,0);
    A.at<double>(2,1) = (warped_back_r.at<double>(0,0)/warped_back_r.at<double>(2,0))*mat_P_r.at<double>(2,1) - mat_P_r.at<double>(0,1);
    A.at<double>(2,2) = (warped_back_r.at<double>(0,0)/warped_back_r.at<double>(2,0))*mat_P_r.at<double>(2,2) - mat_P_r.at<double>(0,2);
    A.at<double>(3,0) = (warped_back_r.at<double>(1,0)/warped_back_r.at<double>(2,0))*mat_P_r.at<double>(2,0) - mat_P_r.at<double>(1,0);
    A.at<double>(3,1) = (warped_back_r.at<double>(1,0)/warped_back_r.at<double>(2,0))*mat_P_r.at<double>(2,1) - mat_P_r.at<double>(1,1);
    A.at<double>(3,2) = (warped_back_r.at<double>(1,0)/warped_back_r.at<double>(2,0))*mat_P_r.at<double>(2,2) - mat_P_r.at<double>(1,2);
    b.at<double>(0,0) = -((warped_back_l.at<double>(0,0)/warped_back_l.at<double>(2,0))*mat_P_l.at<double>(2,3) - mat_P_l.at<double>(0,3));
    b.at<double>(1,0) = -((warped_back_l.at<double>(1,0)/warped_back_l.at<double>(2,0))*mat_P_l.at<double>(2,3) - mat_P_l.at<double>(1,3));
    b.at<double>(2,0) = -((warped_back_r.at<double>(0,0)/warped_back_r.at<double>(2,0))*mat_P_r.at<double>(2,3) - mat_P_r.at<double>(0,3));
    b.at<double>(3,0) = -((warped_back_r.at<double>(1,0)/warped_back_r.at<double>(2,0))*mat_P_r.at<double>(2,3) - mat_P_r.at<double>(1,3));
    solve(A,b,X,DECOMP_SVD);
    vconcat(X,W,X_homogeneous);
    return X_homogeneous;
}

入力パラメータは、2 つの 3x4 カメラ投影行列と、対応する左右のピクセル ペア (x、y、w) です。

于 2014-09-12T15:09:12.587 に答える
0

または、ここに実装されている Hartley & Zisserman の方法を使用することもできます: http://www.morethantechnical.com/2012/01/04/simple-triangulation-with-opencv-from-harley-zisserman-w-code/

于 2013-10-11T09:26:35.443 に答える