Python OpenCV Стерео Калибровка точек объекта
Мне действительно трудно понять это, я только начинающий в Python, и я не могу найти объяснение этому коду.
# prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0)
objp = np.zeros((6*9,3), np.float32)
objp[:,:2] = np.mgrid[0:9,0:6].T.reshape(-1,2)
оригинал - то, что 9 - 7. Я предположил, что 9 и 6 - внутренние углы столбцов и рядов шахматной доски соответственно. (так что моя шахматная доска действительно 10х7)
Теперь я знаю размер квадрата на шахматной доске, и я не могу понять, где его поставить.
Как и каждая итерация на каждом изображении, код, который я нашел, просто делает это:
objpoints.append(objp)
И я вижу, что это всегда толкает один и тот же объект снова и снова.
Два вопроса: как objpoints.append(objp)
на каждой итерации иметь значение?
Как я могу указать в коде, размер квадрата? где я должен положить это?
Я знаю, что объектные точки - это 3d-точки каждого квадрата на шахматной доске, поэтому я очень озадачен тем, что им даже не манипулируют в каждой итерации.
Спасибо!
РЕДАКТИРОВАТЬ: мой код для стереокалибра: http://pastebin.com/pw5n3pme
(Это просто модифицированная версия индивидуальной калибровки камеры)
2 ответа
Я предполагаю, что вы работаете с этим кодом или похожим.
Первый вопрос
Как objpoints.append(objp) на каждой итерации имеет значение? Это не так. Из строки, которую вы разместили, посмотрите на это
objp[:,:2] = np.mgrid[0:9,0:6].T.reshape(-1,2)
Здесь он рассчитывает расположение углов шахматной доски, которые в определенной шахматной доске всегда одинаковы. Каждую итерацию вы находите в своей камере разные imgpoints для одинаковых точек на шахматной доске.
Если бы не были одинаковые точки, вы не могли бы выполнить калибровку
Второй вопрос
Как я могу указать в коде, размер квадрата? где я должен положить это?
в уроке, который я разместил, для Python и OpenCV не следует указывать размер квадрата. Это монокалибровка, поэтому размер квадрата связан только с масштабным коэффициентом, (совершенно) бесполезным для монокамеры. Вы получите правильную матрицу камеры с неопределенным (или, возможно, равным 1) масштабным коэффициентом.
Если у вас есть другой код (например, стереокалибровка), опубликуйте его, и я постараюсь найти, куда нужно поместить квадратное измерение.
Я также делаю калибровку стереокамеры в Python и OpenCV, и я знаю ответ на ваш второй вопрос (поскольку 1-й уже ответил).
Как я могу указать в коде, размер квадрата? где я должен положить это?
Здесь, если ваш квадрат имеет размер 30 мм, умножьте это значение на objp[:,:2]
, Как это
objp[:,:2] = np.mgrid[0:9,0:6].T.reshape(-1,2)*30 # 30 mm size of square
Как objp[:,:2]
представляет собой набор точек углов шахматной доски, заданных как (0,0),(0,1), (0,2) ....(8,5). (0,0) точка - левый верхний квадратный угол и (8,5) - правый нижний квадратный угол. В этом случае эти точки не имеют единицы измерения, но если мы умножим эти значения на квадратный размер (например, 30 мм), то они станут (0,0),(0,30), .....(240,150), что единицы реального мира. В этом случае ваш вектор перевода будет в мм.