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), что единицы реального мира. В этом случае ваш вектор перевода будет в мм.

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