Я пытаюсь использовать метод 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)