OpenCV - проектное изображение плоскости, указывающее на 3d

Я использовал 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 ответов

Другие вопросы по тегам