#python #opencv #opengl #augmented-reality
#питон #opencv #opengl #дополненная реальность
Вопрос:
У меня есть программа, в которой я хотел бы спроецировать 3d-модель на сцену, используя OpenCV и OpenGL. Для этого я сначала получаю матрицу гомографии 3×3 с использованием cv2.findHomography()
, а затем cv2.decomposeHomographyMat()
возвращаю вектор вращения и перемещения для меня. Он возвращает четыре возможных массива для каждого поворота и преобразования. После попытки с четырьмя массивами, каждый из них не сильно изменился в проекционной точке и был почти таким же.
Затем я вычисляю матрицу вида модели (для проекции OpenGL) по вектору поворота и перемещения, который я получаю в результате разложения гомографии, но оказывается, что проецируемое положение неверно. Я сомневаюсь, что преобразование от поворота и перевода к матрице представления модели неверно, пожалуйста, помогите взглянуть на это. Пожалуйста, предложите лучший метод преобразования, если он есть, заранее спасибо.
*Для неправильной позиции я имею в виду, что она не проецировалась прямо на нужную позицию, а проецировалась на другую позицию.
Вот код:
... homography_matrix, _ = cv2.findHomography(set_point1, set_point2,cv2.RANSAC,5) # homography matrix value [[ 6.49469641e-01 3.05514095e-02 2.22136754e 02] [-1.44896635e-02 5.80832563e-01 1.22989887e 02] [ 9.15442047e-05 -6.03875028e-05 1.00000000e 00]] # compute model view matrix num, rvec, tvec, _ = cv2.decomposeHomographyMat(homography_matrix, calibration_matrix) rmtx = np.array(rvec) tmtx = np.array(tvec) # rotation vector (array([[ 0.9975257 , 0.06259469, -0.03200593], [-0.0590899 , 0.99316086, 0.10069705], [ 0.03809014, -0.09855667, 0.99440219]]), array([[ 0.9975257 , 0.06259469, -0.03200593], [-0.0590899 , 0.99316086, 0.10069705], [ 0.03809014, -0.09855667, 0.99440219]]), array([[ 0.97572152, 0.09882652, 0.19545034], [-0.08918155, 0.99435029, -0.05756872], [-0.20003542, 0.03874048, 0.97902248]]), array([[ 0.97572152, 0.09882652, 0.19545034], [-0.08918155, 0.99435029, -0.05756872], [-0.20003542, 0.03874048, 0.97902248]])) # translation vector (array([[ 0.33814957], [-0.10127911], [ 0.6865044 ]]), array([[-0.33814957], [ 0.10127911], [-0.6865044 ]]), array([[0.11881547], [0.0624517 ], [0.76017995]]), array([[-0.11881547], [-0.0624517 ], [-0.76017995]])) view_matrix = np.array([[rmtx[0][0][0],rmtx[0][0][1],rmtx[0][0][2], tmtx[0][0]], [rmtx[0][1][0],rmtx[0][1][1],rmtx[0][1][2], tmtx[0][1]], [rmtx[0][2][0],rmtx[0][2][1],rmtx[0][2][2], tmtx[0][2]], [0.0 ,0.0 ,0.0 ,1.0 ]]) view_matrix = np.transpose(view_matrix) ... glMatrixMode(GL_PROJECTION) glLoadIdentity() gluPerspective(45, (width / height), 0.1, 50.0) glMatrixMode(GL_MODELVIEW) glLoadIdentity() glTranslatef(0.0,0.0,-10.0) glMultMatrixd(view_matrix) glRotatef(angle,0,1,0)
Комментарии:
1. было бы полезно увидеть все значения всех переменных… и несколько фотографий, на которых изображены «странные» вещи
2. Конечно, я отредактировал вопрос и добавил значение. Что касается фотографии, то из-за некоторых проблем с конфиденциальностью я не могу это показать. Под странным я подразумеваю, что он не проецировался прямо в нужное положение.
3. вы заметили, что decomposeHomographyMat возвращает четыре разных решения, и он не может сказать, какое из них правильное. попробуйте их все.
4. Да, я перепробовал их все, как упоминалось в вопросе. Но все же ни один из них не является правильным.
5. хммм, ладно, я это пропустил. какая управляемость используется в системах координат OpenGL? OpenCV правша, x справа, y внизу, z далеко, как правило. — вы делаете это не с отдельными изображениями, а с видео, верно? как ведет себя эта штука? вы заметили закономерность?