5点アルゴリズムによるカメラ位置・姿勢の推定 で2枚の画像を撮影したカメラの相対的な位置・姿勢情報を推定することができた。ここでは、推定された位置・姿勢情報を使って対応点の三次元情報を復元する方法を紹介する。 カメラの位置・姿勢情報、カメラの内部パラメータ、画像間での2D-2D対応から、三角測量の原理に基づいて対応点の三次元座標を推定することが出来る。OpenCVでは、この三角測量による三次元座標の計算を行うためのcv::triangulatePointsが用意されている。引数は、第1,2カメラの射影行列、それぞれの画像の対応点座標を格納した配列、三次元座標出力用の配列である。 先日の 5点アルゴリズムによるカメラ位置・姿勢の推定 のプログラムでcv::recoverPoseした後に、下記のコードを加えることで、対応点の三次元情報を復元することが出来る。 ただし、誤対応情報を利用する場合には、cv::findEssentialMatの部分を以下のように書き換える必要がある。 cv::Mat mask; //RANSACの結果を保持するためのマスク cv::Mat essentialMat = cv::findEssentialMat(p1, p2, 1.0, cv::Point2f(0, 0), cv::RANSAC, 0.9999, 0.003, mask); 以下のプログラムでは、三次元座標の復元は焦点距離1.0の正規化座標系での対応点座標を用いている。なので、それぞれのカメラの内部パラメータ行列は単位行列となり、射影行列はカメラの外部パラメータ行列と一致する。 //正規化座標系で計算しているのでProjection matrix=Extrinsic camera parameter matrix cv::Mat prjMat1, prjMat2; prjMat1 = cv::Mat::eye(3, 4, CV_64FC1); //片方は回転、並進ともに0 prjMat2 = cv::Mat(3, 4, CV_64FC1); for (int i = 0; i < 3; ++i) for (int j = 0; j < 3; ++j) { prjM