Я вычисляю необходимое аффинное преобразование из нескольких точек в трехмерном пространстве и использую для этого numpy.linalg.lstsq. Тем не менее, результаты, которые я получаю, хотя и не так уж далеки друг от друга, недостаточно точны даже в тривиально простых примерах:
m = 100
xy = np.array([[0, 0, 0],
[m, 0, 0],
[m, m, 0],
[0, m, 0],
[0, 0, m],
[m, 0, m],
[m, m, m],
[0, m, m]])
uv = np.array([[0.5, 0, 0],
[m + 0.5, 0, 0],
[m+ 0.5, m, 0],
[0.5, m, 0],
[0.5, 0, m],
[m+ 0.5, 0, m],
[m+ 0.5, m, m],
[0.5, m, m]])
pts_a = np.hstack([uv, np.ones((uv.shape[0], 1))])
pts_b = np.hstack([xy, np.ones((xy.shape[0], 1))])
solution_1 = np.linalg.lstsq(pts_a, pts_b, rcond=None)[0]
Результат, который я ожидаю от приведенного выше кода:
[[1, 0, 0, -0.5],
[0, 1, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1]])
В результате я получаю:
[[ 1.00000000e+00 3.49047642e-16 3.60109527e-16 -5.00000000e-01]
[ 1.77081442e-16 1.00000000e+00 -3.93150475e-16 1.80460546e-15]
[ 2.21351803e-16 -3.11848610e-16 1.00000000e+00 -6.28251374e-15]
[ 2.76689754e-18 1.06035619e-17 -1.19061095e-17 1.00000000e+00]]
Эти небольшие различия существенно повлияли на мои результаты. Есть идеи, как это решить? ПРИМЕЧАНИЕ: я могу использовать ТОЛЬКО numpy и math для своего проекта, поэтому использование другой библиотеки, к сожалению, невозможно! Спасибо!

На самом деле разница не малая, а довольно большая - у вас неправильный знак для solution[0,3].
Проблема в том, что вы рассчитали не желаемое преобразование T, а преобразование, обратное этому преобразованию, то есть T^-1.
Давайте посчитаем:
T*X=U, with X - original vectors
U - transformed vectors
transposing it =>
X^t * T^t = U^t
| | |
\|/ \|/ \|/
A * x = b
В вашей программе A=pts_b и b=pts_a это означает преобразование T (вам нужно поменять местами pts_b и pts_b и транспонировать результат, чтобы получить правильную матрицу):
T = np.linalg.lstsq(pts_b, pts_a)[0].T
и вуаля:
>>> T
array([[ 1.00000000e+00, -8.15320034e-17, -6.59194921e-17, 5.00000000e-01],
[ -4.97379910e-16, 1.00000000e+00, 7.77156117e-16, -1.02678283e-14],
[ -2.13162819e-16, 4.44089210e-16, 1.00000000e+00, 1.91513472e-15],
[ -4.44089205e-18, -8.84708973e-17, 9.88792381e-17, 1.00000000e+00]])
PS: Вы решили уравнение:
X^t = U^t * (T^t)^(-1)
| | |
\|/ \|/ \|/
b = A * x
Спасибо за ответ! Однако это была всего лишь опечатка с моей стороны. Должно было быть -0,5! Похоже, как сказал Вуда, дело в точности станка. Но я ценю помощь!
Не сообщая нам, что вы используете эти результаты для, я не подозреваю, что мы можем вам еще больше помочь. Мне это кажется правильным и находится в пределах машинной точности аналитического решения. Ваш алгоритм отслеживания вполне может быть численно нестабильным, но мы могли бы помочь с этим.