#python #numpy #opencv #grid #camera-calibration
#python #numpy #opencv #сетка #камера-калибровка
Вопрос:
Я работаю над проектом, в котором мне нужно выполнить калибровку для камер. Как вы знаете, нужно определить точки плоской сетки в 3D-мире и найти их соответствия на плоскости изображения. Таким образом, первая камера имеет следующие точки 3D_grid:
mport cv2 as cv
import numpy as np
WPoints_cam1 = np.zeros((9*3,3), np.float64)
WPoints_cam1[:,:2] = np.mgrid[0:9,0:3].T.reshape(-1,2)*0.4
print(WPoints_cam1)
[[0. 0. 0. ]# world coordinate center
[0.4 0. 0. ]
[0.8 0. 0. ]
[1.2 0. 0. ]
[1.6 0. 0. ]
[2. 0. 0. ]
[2.4 0. 0. ]
[2.8 0. 0. ]
[3.2 0. 0. ]
[0. 0.4 0. ]
[0.4 0.4 0. ]
[0.8 0.4 0. ]
[1.2 0.4 0. ]
[1.6 0.4 0. ]
[2. 0.4 0. ]
[2.4 0.4 0. ]
[2.8 0.4 0. ]
[3.2 0.4 0. ]
[0. 0.8 0. ]
[0.4 0.8 0. ]
[0.8 0.8 0. ]
[1.2 0.8 0. ]
[1.6 0.8 0. ]
[2. 0.8 0. ]
[2.4 0.8 0. ]
[2.8 0.8 0. ]
[3.2 0.8 0. ]]
Как видно выше, первая сетка (для первой камеры) начинается с определенной опорной 3D-точки (0,0,0) и заканчивается точкой (3,2,0,8 0) с постоянным смещением 0,4 и размером 9×3
Обратите внимание, что всем координатам Z было присвоено значение Z = 0 (калибровка Zhengyou Zhang)
Теперь мой вопрос в том, поскольку мне нужно определить вторую сетку (для второй камеры), которая также ссылается на определенный центр 3D_coordinate (0,0,0), мне нужно определить сетку, которая начинается с (3,6, 0,0) и заканчивается (6,8, 0,8, 0) с тем же смещением 0,4 и имеет размер 9×3
Я считаю, что это легко сделать. Однако я не могу думать нестандартно из-за моего начального уровня опыта.
Был бы признателен за некоторую помощь и заранее благодарен.
Ответ №1:
Вы можете масштабировать каждый столбец следующим образом:
np.mgrid[0:8, 0:3].T.reshape(-1,2) * np.array([(7.8 - 3.6) / 7, 0.4]) np.array([3.6, 0])
или объедините это в масштабирующую матрицу, подобную этой (а затем добавьте вектор для перевода)
np.mgrid[0:8, 0:3].T.reshape(-1,2) @ np.array([[(7.8 - 3.6) / 7, 0], [0, 0.4]]).T np.array([3.6, 0])
что касается того, откуда (7.8 - 3.6) / 7
берется, числитель должен быть самоочевидным. Знаменатель тот же, но для ваших исходных размеров. С 0:8
значением max это 7
, а min — это 0
, так что знаменатель становится 7 - 0
.
Комментарии:
1. Спасибо за вашу помощь. Это действительно работает, за исключением того, что шаг равен 0.6, который должен быть 0.4.@Dan
2. @k.jbaili как шаг может быть равен 0.4, если он состоит из 8 строк и варьируется от 3.6 до 7.8? Это невозможно. Если вы устанавливаете свой диапазон, то вы можете либо задать размер шагов, либо задать количество строк. Если вы устанавливаете размер шага, то это тривиально
np.mgrid[3.6:77.8 0.4:0.4, 0:1.2:0.4]
. Но в вашем вопросе вы указали 8 строк, поэтому, следовательно, шаг равен 0.6.3. Мне так жаль, что я допустил огромную ошибку. Вторая сетка должна быть 0: 9 для измерения x и 0: 3 для измерения y и, таким образом, находится в диапазоне от 3.6 до 6.8. Я исправлю вопрос. @Dan
4. Однако это ничего не изменит — просто измените
7.8
в моем ответе на6.8
и измените0:8
на0:9
, если вам нужна дополнительная строка. Это даст вам то, что вам нужно.5. вы пишете. это ничем не отличается. Я должен был уточнить, что я хочу, чтобы размер шага был равен 0,4. Спасибо, я действительно ценю это. @Dan