2017-01-17 11 views
1

Мне действительно трудно понять эту вещь, я всего лишь новичок в python, и я не могу найти объяснения этому коду.Python OpenCV Stereo Calibrate Object Points

# 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 представляют собой внутренние углы столбцов и строк в шахматном порядке, соответственно. (так что моя шахматная доска действительно 10x7)

Теперь, я знаю размер квадрата на шахматной доске, что я не могу понять, где его поставить.

В каждой итерации на каждом изображении, код, который я нашел только сделать это:

objpoints.append(objp) 

И я могу видеть, это всегда снова и снова толкая и тот же объект.

Два вопроса: как objpoints.append(objp) на каждой итерации внести изменения?

Как я могу указать в коде квадратный размер? где я должен это поставить?

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

Спасибо!

EDIT: Мой код stereocalib: http://pastebin.com/pw5n3pme

(Это просто модифицированная версия индивидуальной калибровки камеры)

+0

Вы должны связать весь код, если хотите получить полный ответ и понять, что он делает. Я все равно попытаюсь ответить. – marcoresk

ответ

1

Я предполагаю, что вы работаете с this code или схожий.

Первый вопрос

как же objpoints.append (objp) на каждой итерации разница? Это не так. От линии вы в курсе, посмотрите на эту

objp[:,:2] = np.mgrid[0:9,0:6].T.reshape(-1,2) 

Здесь он вычисляет расположение шахматной доски углов, которые в определенной шахматной доске, всегда то же самое. На каждой итерации вы находите разные imgpoints в своей камере для тех же точек в шахматной доске.

Если не были одни и те же точки, вы не могли бы выполнить калибровку

Второй вопрос

как я могу указать в коде, квадратный размер? где я должен это поставить?

В учебнике, которое я разместил для Python и OpenCV, вы не должны указывать квадратный размер. Это монокалибровка, поэтому квадратный размер связан только с масштабным коэффициентом (совершенно) бесполезным в монокамере. Вы получите правильную матрицу камеры с неопределенным (или, может быть, равным 1) масштабным коэффициентом.

Если у вас есть другой код (например, стерео калибровка), отправьте его, и я попытаюсь найти место, где должно быть задано квадратное измерение.

+0

Благодарим вас за ответ @marcoresk. Здесь находится пастажина моей стереокалибровки. http://pastebin.com/pw5n3pme Там я использовал индивидуально откалиброванные матрицы для левой и правой камер. он работал для меня, а не для калибровки двух камер одновременно. – Wreigh

+0

в стереокалибе, я просто скопировал код, который вы связали, и сделал это для двух камер одновременно и просто использовал метод stereoCalibrate вместо камеры calibrate – Wreigh

+0

@WreighChristianSantos, этот код был только учебным пособием. Чтобы вставить размер квадратов, вы должны использовать его с objp. Прочитайте [этот другой ответ] (http://stackoverflow.com/questions/37310210/camera-calibration-with-opencv-how-to-adjust-chess-square-size) – marcoresk

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 

As objp[:,:2] представляет собой набор точек checkboard углов даны как (0,0), (0,1), (0,2) .... (8,5). (0,0) - левый верхний квадратный угол, а (8,5) - правый нижний квадратный угол. В этом случае эти точки не имеют единицы, но если мы умножим эти значения на квадратный размер (например, 30 мм), то они станут (0,0), (0,30), ..... (240,150), которые являются единицами реального мира. Ваш переводный вектор будет в мм единицах в этом случае.

 Смежные вопросы

  • Нет связанных вопросов^_^