Выходные данные решения solvePnP не соответствуют projectPoints

Я получаю странные данные от solvePnP, поэтому я попытался проверить их с помощью projectPoints:

retval, rvec, tvec=cv2.solvePnP(opts, ipts, mtx, dist, flags=cv2.SOLVEPNP_ITERATIVE)
print(retval,rvec,tvec)
proj, jac = cv2.projectPoints(opts, rvec, tvec, mtx, dist)
print(proj,ipts)

здесь опции - это 3d точки с z=0, обнаруженные на этой картинке:

И ipts взяты из этой картинки (только часть изображения здесь):

Я сам проверил точки (определяется с помощью SIFT, точки определяются правильно и спариваются правильно).

Теперь я хочу проверить, верны ли rvec и tvec, найденные SolvePnP, поэтому я вызываю cv2.projectPoint, чтобы проверить, проецируются ли трехмерные точки на точки изображения. И вот что у меня есть:

Итак, я вижу, что спроецированные точки лежат за пределами изображения, имея y<0.

(возвращение из solvePnP верно)

Это матрица искажений dist:

1.6324642475694839e+02 -2.1480843988631259e+04 -3.4969507980045117e-01 7.9693609309756430e-01 -4.0684056606034986e+01

Это MTX:

6.4154558230601404e+04 0. 1.2973531562160772e+03
0. 9.8908265814965678e+04 9.5760834379036123e+02
0. 0. 1.

Это вариант:

[[ 1708.74987793  1138.92041016     0.        ]
 [ 1708.74987793  1138.92041016     0.        ]
 [ 1708.74987793  1138.92041016     0.        ]
 [ 1708.74987793  1138.92041016     0.        ]
 [ 1708.74987793  1138.92041016     0.        ]
 [ 1708.74987793  1138.92041016     0.        ]
 [ 1708.74987793  1138.92041016     0.        ]
 [ 1984.09973145  1069.31677246     0.        ]
 [ 1984.09973145  1069.31677246     0.        ]
 [ 1908.19396973  1200.05529785     0.        ]
 [ 1994.56677246  1286.16516113     0.        ]
 [ 1994.56677246  1286.16516113     0.        ]
 [ 1806.82177734  1058.06872559     0.        ]
 [ 1925.55639648  1077.33703613     0.        ]
 [ 1998.30627441  1115.51647949     0.        ]
 [ 1998.30627441  1115.51647949     0.        ]
 [ 1998.30627441  1115.51647949     0.        ]
 [ 2013.79003906  1168.08728027     0.        ]
 [ 1972.93457031  1234.92614746     0.        ]
 [ 2029.11364746  1220.234375       0.        ]]

Это ipts:

[[  71.6125946    11.61344719]
 [ 116.60684967   71.6068573 ]
 [ 116.60684967   71.6068573 ]
 [ 101.60684967   86.60684967]
 [ 101.60684967   86.60684967]
 [ 116.60684967  101.6068573 ]
 [ 116.60684967  101.6068573 ]
 [ 112.37421417   53.40462112]
 [ 112.37421417   53.40462112]
 [  83.76233673   84.36077118]
 [  98.45358276  112.38414764]
 [  98.45358276  112.38414764]
 [  67.2594223    38.04878998]
 [  96.85155487   51.85028076]
 [ 112.26165009   67.25630188]
 [ 112.26165009   67.25630188]
 [ 112.26165009   67.25630188]
 [ 112.24694061   82.24401855]
 [  96.82528687   97.66513824]
 [ 112.2511673    97.25905609]]

rvec = [[-0.21890167] [-0.86241377] [ 0.96051463]]
tvec = [[  239.04461181] [-2165.99539286] [-1700.61539107]]

Также я попытался следовать одному из комментариев и умножить каждый y из опций на -1, но это дало мне еще более сумасшедшие координаты вне картинки, как 10^13.

1 ответ

Решение

Матрица камеры (мтс) неверна. Fx и Fy очень разные (Fx=6,4154558230601404e+04 Fy=9,8908265814965678e + 04) и очень большие. Согласно комментарию в функции OpenCV calibrateCamera () эта проблема обычно возникает, потому что вы, вероятно, использовали patternSize = cvSize (строки, столбцы) вместо использования patternSize = cvSize (столбцы, строки) в findChessboardCorners.

Другие вопросы по тегам