1

すべての SolvePnP の可能性の間で精度と時間を比較しようとしています: CV_ITERATIVE、CV_EPNP、および CV_P3P

また、結果を Matlab EPNP と比較しました。

そして、EPNP と P3P が失敗したように見えます:

std::vector<cv::Point2f> imgPoints;
imgPoints.push_back(cv::Point2f(400,188));
imgPoints.push_back(cv::Point2f(400,300));
imgPoints.push_back(cv::Point2f(512,300));
imgPoints.push_back(cv::Point2f(512,188));

double size = 80.0;
std::vector<cv::Point3f> objPoints;
objPoints.push_back(cv::Point3f(0,0,0));
objPoints.push_back(cv::Point3f(0,size,0));
objPoints.push_back(cv::Point3f(size,size,0));
objPoints.push_back(cv::Point3f(size,0,0));

cv::Mat rvec0 = cv::Mat::zeros(3, 1, CV_64FC1);
cv::Mat tvec0 = cv::Mat::zeros(3, 1, CV_64FC1);

cv::Mat rvec1 = cv::Mat::zeros(3, 1, CV_64FC1);
cv::Mat tvec1 = cv::Mat::zeros(3, 1, CV_64FC1);

cv::Mat rvec2 = cv::Mat::zeros(3, 1, CV_64FC1);
cv::Mat tvec2 = cv::Mat::zeros(3, 1, CV_64FC1);

cv::Mat cam, coeff;
cam = (cv::Mat_<double>(3,3) << 700,0,300,0,700,400,0,0,1);
cv::solvePnP(objPoints,imgPoints,cam,coeff,rvec0,tvec0,CV_ITERATIVE);
cv::solvePnP(objPoints,imgPoints,cam,coeff,rvec1,tvec1,CV_P3P);
cv::solvePnP(objPoints,imgPoints,cam,coeff,rvec2,tvec2,CV_EPNP);

cv::Mat rmat0,rmat1,rmat2;
cv::Rodrigues(rvec0,rmat0);
cv::Rodrigues(rvec1,rmat1);
cv::Rodrigues(rvec2,rmat2);

std::cout << "ITERATIVE : Rotation matrix : " << std::endl << rmat0 << std::endl;
std::cout << "ITERATIVE : Tranlation vector : " << std::endl << tvec0 << std::endl << std::endl;

std::cout << "P3P : Rotation matrix : " << std::endl << rmat1 << std::endl;
std::cout << "P3P : Tranlation vector : " << std::endl << tvec1 << std::endl << std::endl;

std::cout << "EPNP : Rotation matrix : " << std::endl << rmat2 << std::endl;
std::cout << "EPNP : Tranlation vector : " << std::endl << tvec2  << std::endl << std::endl;

ください :

ITERATIVE : 回転行列 : [1, -2.196885546074445e-016, 9.692430825310778e-016; 2.196885546074445e-016、1、1.012059558506939e-015; -9.692430825310778e-016、-1.012059558506939e-015、1]

ITERATIVE : 翻訳ベクトル : [71.42857142857143; -151.4285714285714; 500]

P3P : 回転行列 : [1, 0, 0; 0、1、0; 0、0、1]

P3P : 翻訳ベクトル : [-3.97771428571427e-015; -4.022285714285698e-015; 9.989999999999962e-017]

EPNP : 回転行列 : [1, 0, 0; 0、1、0; 0、0、1]

EPNP : 翻訳ベクトル : [-3.97771428571427e-015; -4.022285714285698e-015; 9.989999999999962e-017]

なにか提案を ?

アレクサンドル・コーンマン

4

2 に答える 2

1

私はあなたのためにヒントを持っています.いくつかのことは私にとって奇妙に聞こえます.

  1. カムマトリックスの中心点に (300,400) を指定すると、画像は 600*800 (垂直) になりますか?
  2. 2D ポイントの投影位置については、必ず OpenCV の方法で配置してください。画像の (0,0) ポイントは左上隅です。
  3. ポイントは同一平面上 (平面 z=0) であり、おそらく solvePnP はこれに敏感です。
于 2014-06-23T09:42:29.243 に答える