OpenCV solvePnP: идеальные координаты с Blender не корректно трансформируются - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь использовать метод solvePnPRansac от OpenCV, чтобы определить местоположение камеры вокруг 3D-модели, загруженной в Blender.Тем не менее, ручная установка точек дает мне неправильный вектор t / r, а cv2.projectPoints неверно определяет координаты изображения, поэтому я подозреваю, что что-то не так с вводом.

Я вручную выбрал 10 точек на 3D-моделив произвольных единицах Блендера, и использовал их в качестве мировых координат.Я нашел соответствующие местоположения этих точек на визуализированном изображении 960x540, и это мои входные 2D координаты (в пикселях).

Фокусное расстояние и размер датчика камеры установлены на фокусное расстояние 40 мм и датчик 40x18 мм, и с тех порэто мм. Я вручную измерил их как приблизительную длину в пикселях, равную примерно 916 пикселям, так и 412 пикселей - однако оба этих набора значений дают мне полностью отключенные координаты.

Выходные данные для projectPoints для меня являются координатамиэтот диапазон варьируется от -13000 до 20000.Я думаю, что мои входные значения неверны, но как мне это исправить?

size = (960, 540)
image_points = np.array([
                        (315, 279), # 1
                        (440, 273), # 2
                        (407, 386), # 3
                        (369, 372), # 4
                        (440, 317), # 5
                        (457, 373), # 6
                        (439, 385), # 7
                        (369, 337), # 8
                        (407, 358), # 9
                        (313, 291), # 10
                    ], dtype="double")

model_points = np.array([
                            (0.77644, -0.63806, 2.55822), # stripe of adidas 1/3 down
                            (0.75437, 0.49247, 2.75569), # first curve up on the logo
                            (0.82970, 0.17763, 1.58873), # lower right part of hole in a
                            (0.82900, -0.16946, 1.68983), # 1/3 down left side of i
                            (0.84466, 0.52011, 2.37269), # bottom of gold circle left of F
                            (0.67476, 0.59525, 1.68853), # left side of thick top 's'
                            (0.74288, 0.46100, 1.58926), # inwards (left) of right below e joint
                            (0.82560, -0.14537, 2.07217), # middle of f top bar, left of upwards
                            (0.83161, 0.17382, 1.88820), # middle line of a near bottom of Y
                            (0.78115, -0.66043, 2.46363) # 1/4 up 2nd d circle in adidas
                        ], dtype = "double")

f = 916.8
sx = 916.8
sy = 412.56

width, height = (size[1], size[0])

camera_matrix = np.array([
                [width*f/sx, 0, width/2],
                [0, height*f/sy, height/2],
                [0, 0, 1]
                ], dtype = "double")

dist_coeffs = np.zeros((4,1))
s,t,r, i = cv2.solvePnPRansac(model_points, image_points, camera_matrix, dist_coeffs)

img, x = cv2.projectPoints(model_points, r, t, camera_matrix, dist_coeffs)
print(img)           
...