2015-12-07 2 views
2

У меня есть камера, обращенная к эквиваленту шахматной доски. Я знаю мирное расположение точек, а также 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; 
+0

параметризировать линию от вашего центра камеры через пиксель. параметризировать плоскость. найти параметры линии, где она попадает в плоскость. – Micka

ответ

1

Этот вопрос является дубликатом другого вопроса, связанного с использованием Stackoverflow, в котором искательница прекрасно представляет решение. Вот ссылка: Ответ здесь: Computing x,y coordinate (3D) from image point