используя aruco для оценки мирового положения камеры - PullRequest
0 голосов
/ 16 октября 2018

В OpenCV я использую плату Charuco, откалибровал камеру и использую оценку для получения rvec и tvec.(похоже на пример кода).Я использую стационарную доску, с камерой движется.Я новичок в этом, поэтому, пожалуйста, потерпите меня, если я упускаю что-то простое.

Я понимаю, что могу использовать Rodrigues (), чтобы получить матрицу вращения 3x3 для ориентации доски от rvec,и что я могу преобразовать значение tvec в мировые координаты, используя worldPos = -Rt () * tvec (в python), чтобы получить положение камеры

Кажется, что я получил все, что мне нужно, однако, если я повернукамера физически, WorldPos также сильно меняется!Я уверен, что это не потому, что камера была перемещена, так как я пытался много раз.

Я не знаю, в чем проблема, спасибо за ваше предложение.

А код ниже (на python).

self.retval, self.rvec, self.tvec =   aruco.estimatePoseBoard(self.corners, self.ids, board, self.cameraMatrix, self.distanceCoefficients)
self.dst, jacobian = cv2.Rodrigues(self.rvec)
self.rvec_trs = self.dst.transpose()
self.worldPos = - self.rvec_trs * self.tvec
self.worldPos = [self.worldPos[0][0],self.worldPos[1][1], self.worldPos[2][2]]

1 Ответ

0 голосов
/ 17 октября 2018

Наконец я решил это с помощью @Micka.Код ниже (на python), надеюсь, он может помочь другим, у кого такая же проблема.

self.retval, self.rvec, self.tvec = aruco.estimatePoseBoard(self.corners, self.ids, board, self.cameraMatrix, self.distanceCoefficients
self.dst, jacobian = cv2.Rodrigues(self.rvec)
self.extristics = np.matrix([[self.dst[0][0],self.dst[0][1],self.dst[0][2],self.tvec[0][0]],
                             [self.dst[1][0],self.dst[1][1],self.dst[1][2],self.tvec[1][0]],
                             [self.dst[2][0],self.dst[2][1],self.dst[2][2],self.tvec[2][0]],
                             [0.0, 0.0, 0.0, 1.0]
                ])
self.extristics_I = self.extristics.I  # inverse matrix
self.worldPos = [self.extristics_I[0,3],self.extristics_I[1,3],self.extristics_I[2,3]]

Но я до сих пор не знаю, почему worldPos = -Rt () * tvec не может получить правильный ответ,Надеюсь, кто-то может сказать мне.Спасибо!

...