OpenCV - 项目图像平面指向3d

时间:2015-09-20 14:59:16

标签: c++ opencv camera calibration

我已经使用OpenCV从不同视图校准我的相机,我获得内在函数,rvec和tvec,重投影误差为.03 px(我认为校准很好)。

现在,考虑到我的场景的一个视图,我希望能够点击一个点并在其他视图上找到它的投影。 为此,我将执行以下功能:

void Camera::project(const vector<cv::Point2f> &pts_2d, vector<cv::Point3f> &pts_3d) {

     std::cout << "Start proj 2d -> 3d" << std::endl;

     cv::Mat pts_2d_homo;
     convertPointsToHomogeneous(pts_2d, pts_2d_homo);

     std::cout << "Cartesian to Homogeneous done!" << std::endl;

     // Project point to camera normalized coordinates    
     cv::Mat unproj;

     cv::transform(pts_2d_homo, unproj, intrinsics().inv());

     std::cout << "Point unprojected: " << unproj.at<cv::Point3f>(0) << std::endl;

     // Undo model view transform
     unproj -= transVec();

     cv::Mat rot;
     cv::Rodrigues(rotVec(), rot);
     cv::transform(unproj, unproj, rot.t());

     unproj *= 1.f/cv::norm(unproj);

     std::cout << "Model view undone: " << unproj.at<cv::Point3f>(0) << std::endl;

    for (int i = 0; i < unproj.rows; ++i) {
        std::cout << "Inside for :" << unproj.at<cv::Point3f>(i,0) << std::endl;
        pts_3d.push_back(unproj.at<cv::Point3f>(i,0));
   }
}

void Camera::project(const vector<cv::Point3f> &pts_3d, vector<cv::Point2f> &pts_2d) {
    cv::projectPoints(pts_3d, rotVec(), transVec(), intrinsics(), dist_coeffs(), pts_2d);

}

现在我对作为输出的内容感到复杂。当我绘制投影在每个视图上的点时,它们都对应但是无论我在“规范视图”中首先点击的位置,投影点总是相同的。

0 个答案:

没有答案