0

cv::solvePnPRansac を使用して、3D から 2D への対応が与えられたオブジェクトのポーズを見つけたいと考えています。私の対応には外れ値があるかもしれないので、cv::solvePnP を使用したくありません。OpenGL でカメラから撮影したスナップショットの 3D から 2D への対応を使用しました。したがって、逆投影後、solvePnP を使用した後に返された回転行列が正しいことがわかりました。しかし、solvePnPRansac を使用すると、恒等行列とゼロの平行移動ベクトルが得られます。助けてください!次のコードを使用しました。前もって感謝します !

// Parameters to solvePnP
Mat camera_mat(3, 3, CV_64FC1);
Mat distCoeffs(4, 1, CV_64FC1);
Mat rvec(3, 1, CV_64FC1);
Mat tvec(3, 1, CV_64FC1);
Mat d(3, 3, CV_64FC1);

vector<Point3f> list_points3d_model_match;
vector<Point2f> list_points2d_scene_match;

while(map >> u >> v >> x >> y >> z)
{
    Point2f ip = Point2f(u, v);
    Point3f sp = Point3f(x, y, z);

    // cout << x << " " << y << " " << z << endl;
    list_points3d_model_match.push_back(sp);
    list_points2d_scene_match.push_back(ip);
}

camera_mat.at<double>(0, 0) = 600;
camera_mat.at<double>(1, 1) = 600;
camera_mat.at<double>(0, 2) = WIDTH / 2;
camera_mat.at<double>(1, 0) = HEIGHT / 2;
camera_mat.at<double>(3, 3) = 1;

// solvePnP( list_points3d_model_match, list_points2d_scene_match, camera_mat, distCoeffs, rvec, tvec,
   //                 useExtrinsicGuess,  CV_ITERATIVE);

tvec.at<float>(0) = 0;
tvec.at<float>(1) = 0;
tvec.at<float>(2) = 2;

d.at<float>(0, 0) = 1;
d.at<float>(1, 2) = -1;
d.at<float>(2, 1) = 1;

Rodrigues(d, rvec);

solvePnPRansac(list_points3d_model_match, list_points2d_scene_match, camera_mat, distCoeffs, rvec, tvec, false, CV_ITERATIVE);

Rodrigues(rvec, d);

double* _r = d.ptr<double>();
printf("rotation mat: \n %.3f %.3f %.3f\n%.3f %.3f %.3f\n%.3f %.3f %.3f\n",
    _r[0],_r[1],_r[2],_r[3],_r[4],_r[5],_r[6],_r[7],_r[8]);
}

cout << "translation vec:\n" << tvec << endl;

コードを実行すると、次の出力が得られます。

rotation mat: 
1.000 0.000 0.000
0.000 1.000 0.000
0.000 0.000 1.000

translation vec:
[0; 0; 0]
4

2 に答える 2

3

カメラ マトリックスが間違っています。コードは次のようになります。

camera_mat.at<double>(0, 0) = 600;
camera_mat.at<double>(1, 1) = 600;
camera_mat.at<double>(0, 2) = WIDTH / 2;
camera_mat.at<double>(1, 2) = HEIGHT / 2;
camera_mat.at<double>(3, 3) = 1;
于 2015-03-10T14:25:42.253 に答える
2

私は以前に同じ問題を抱えていましたが、それはカメラ マトリックスの間違った入力に関するものではありません。
の宣言を変更します。

Mat camera_mat(3, 3, CV_64FC1);
Mat distCoeffs(4, 1, CV_64FC1);

CV_32FC1 に初期サイズを与えないでMat tvecくださいMat d

于 2015-06-21T01:44:17.057 に答える