#python #opencv #matrix #opencv-solvepnp
Вопрос:
Я использую solvePnP()
, чтобы получить матрицу вращения фигуры в 3D, которая, согласно некоторым источникам, представляет собой матрицу 3×3. В моем случае я получаю вектор (3×1). Я делаю что-то не так или формат зависит от матрицы моей камеры, коэффициентов искажения и так далее? Я использую эту строку:
(success, rotation_vector, translation_vector) = cv2.solvePnP(model_points, image_points,camera_matrix, dist,flags=cv2.SOLVEPNP_ITERATIVE)
где я использую 5 точек изображения и точек объекта в форме ((x,y) для 2D-точек и (x,y,z) для 3D-точек, z=0, так как поверхность плоская), матрица камеры
camera_matrix = np.array([[971.11273473, 0, 326.55605087], [0, 970.7328241, 234.15076249], [0, 0, 1]])
и dist_coeffs являются
dist = np.array([[-2.80642551e-01, 4.07127806e 00, -1.23761546e-03, -1.38615834e-03, -3.75389206e 01]])
которые были определены после выполнения калибровки камеры.
Вектор rotation_vector возвращается следующим образом:
Вектор Вращения:
[[ 0.17791832]
[ 0.04932656]
[-0.05101292]]
и после преобразования с Родригесом() Я получаю
[[ 0.99748998 0.05507619 0.04450127]
[-0.04632689 0.98292368 -0.17808663]
[-0.05354968 0.17557803 0.98300803]]
Моя проблема в том, что определение матрицы вращения является произведением матриц вращения вокруг каждой оси, поэтому по определению это должна быть матрица 3×3. Может ли кто-нибудь, возможно, объяснить это или сказать мне, что я делаю не так?
Комментарии:
1. это
rvec
представление поворота под углом к оси . длина вектора кодирует угол (3,1415… 180 градусов).Rodrigues()
преобразует представление матрицы в представление угла оси. все это объясняется в официальной документации. пожалуйста, найдите его и используйте.