Как определить матрицу преобразования, имеющую пары координат? - PullRequest
0 голосов
/ 28 мая 2018

Итак.У меня есть 4 набора координатных пар.Одна в мировых координатах и ​​другая в координатах камеры.

+-----+-----+-----+-----+-----+
| Xw  | Yw  | Zw  | Xc  | Yc  |
+-----+-----+-----+-----+-----+
| 0,0 | 0,0 | 0,0 | 582 | 344 |
| 7,0 | 0,0 | 0,0 | 834 | 338 |
| 0,0 | 5,0 | 0,0 | 586 | 529 |
| 7,0 | 5,0 | 0,0 | 841 | 522 |
+-----+-----+-----+-----+-----+

Xw, Yw, Zw - Мировые координаты
Xc, Yc - Координаты камеры
Zw - всегда 0

Теперь мне нужно вычислить матрицу преобразования для этого.Таким образом, имея Xw и Yw, я могу получить Xc, Yc.

Также у меня есть камера 2. А затем, используя некоторую позицию точки из камеры 2, мне нужно вычислить ту же точку в первых координатах камеры.

+-------+-------+-------+-------+
| Xc2   | Yc2   | Xс1   | Yс1   |
+-------+-------+-------+-------+
|  1250 |   433 |   209 |   771 |
|   528 |   452 |  1277 |   730 |
+-------+-------+-------+-------+
# `Xc1` and `Yc1` just estimated for example - need to be calculated

Также у нас есть данные калибровки камеры 2 от OpenCV.

Спасибо.

Ps Буду очень признателен, если вы опишите, как это сделать с помощью python + numpy

Pss А также, если вы опишите это как для резиновой утки ( wenk ):)

1 Ответ

0 голосов
/ 28 мая 2018

Возможно, вам придется тщательно изучить геометрию вашей сцены, однако линейная алгебра может дать вам разумные результаты.

Если мы возьмем ваши мировые координаты , чтобы соответствовать общей форме aX + bY +c тогда мы можем подобрать метод наименьших квадратов, используя функцию nstsy * ltsq .

world = numpy.array([
    [0,0,0],
    [7,0,0],
    [0,5,0],
    [7,4,0]])
    
camera = numpy.array([
    [582,344],
    [834,338],
    [586,529],
    [841,522]])
    
#Lose Z axis
world = world[:,0:2]

#Make a square matrix
A = numpy.vstack([world.T, numpy.ones(4)]).T

#perform the least squares method
x, res, rank, s = numpy.linalg.lstsq(A, camera, rcond=None)

#test results
print(numpy.dot(A,x))
...