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);

}

Теперь у меня смешанные чувства по поводу того, что я получаю в качестве результата. Когда я рисую точку, спроецированную на каждый вид, все они соответствуют НО, независимо от того, где я сначала щелкнул в «каноническом виде», спроецированная точка всегда одинакова.

2

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]