У меня есть камера, обращенная к эквиваленту шахматной доски. Я знаю мирное расположение точек, а также 2d-расположение соответствующих проецируемых точек на изображении камеры. Все точки мира принадлежат к одной и той же плоскости. Я использую solvePnP:Реверс OpenCV projectPoints
Matx33d camMat;
Matx41d distCoeffs;
Matx31d rvec;
Matx31d tvec;
std::vector<Point3f> objPoints;
std::vector<Point2f> imgPoints;
solvePnP(objPoints, imgPoints, camMat, distCoeffs, rvec, tvec);
тогда я могу перейти от 3D-мира точек на 2d точек изображения с projectPoints:
std::vector<Point2f> projPoints;
projectPoints(objPoints, rvec, tvec, camMat, distCoeffs, projPoints);
projPoints очень близки к imgPoints.
Как я могу сделать обратное с помощью точки экрана, соответствующей точке мира 3D, принадлежащей одной и той же плоскости. Я знаю, что с одного взгляда невозможно восстановить трехмерное местоположение, но здесь я нахожусь в одной плоскости, так что это действительно проблема 2d. Я могу вычислить матрицу обратного вращения, а также вектор обратного перевода, но как я могу продолжить?
Matx33d rot;
Rodrigues(rvec, rot);
Matx33d camera_rotation_vector;
Rodrigues(rot.t(), camera_rotation_vector);
Matx31d camera_translation_vector = -rot.t() * tvec;
параметризировать линию от вашего центра камеры через пиксель. параметризировать плоскость. найти параметры линии, где она попадает в плоскость. – Micka