Я использовал 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);
}
Теперь у меня смешанные чувства по поводу того, что я получаю в качестве результата. Когда я рисую точку, спроецированную на каждый вид, все они соответствуют НО, независимо от того, где я сначала щелкнул в «каноническом виде», спроецированная точка всегда одинакова.
Задача ещё не решена.