OpenCV: блоки solvePnP tvec и направления осей
Я пытаюсь найти относительное положение камеры к шахматной доске ( или наоборот) - я чувствую себя хорошо с преобразованием между различными системами координат, например, как предложено здесь. Я решил использовать шахматную доску не только для калибровки, но и для определения фактического положения на данном этапе, поскольку я могу использовать findChessboardCorners
для получения imagePoints
(и это работает нормально).
Я много читал на эту тему и чувствую, что понимаю результаты solvePnP
(даже если я совершенно новый для openCV
и компьютерного зрения в целом). К сожалению, результаты, которые я получаю из solvePnP
и физически измеряя установку теста, различны: перевод в z-направлении выключен приблизительно на 10%. 25%. x
и y
направления совершенно неправильные - на несколько порядков больше и отличаются от того, что я прочитал, чтобы быть системой координат камеры (x, указывающий вверх изображение, y вправо, z от камеры). Разница сохраняется, если я преобразую tvec
и rvec
в позу камеры в мировых координатах.
Мои вопросы таковы:
- каковы направления осей камеры и мировых систем координат?
- выводит ли
solvePnP
перевод в тех же единицах, в которых я указываюobjectPoints
?
Я указал Происхождение мира как первый из
objectPoints
(один из углов шахматной доски). Это нормально и является ли tvec
переводом именно в эту точку из координат камеры?
Это мой код (я прилагаю его pro forma как он не выбрасывает никаких исключений и т. д.). Я использовал изображения в оттенках серого, чтобы получить внутреннюю матрицу камеры и коэффициенты искажения во время калибровки, поэтому решил выполнить локализацию в оттенках серого. chessCoordinates
- это список точек шахматной доски, расположенных в мм относительно начала координат (одной из угловых точек). camMatrix
и distCoefficients
исходят из калибровки (выполненной с использованием одной и той же шахматной доски и objectPoints
).
camCapture=cv2.VideoCapture(0) # Take a picture of the target to get the imagePoints
tempImg=camCapture.read()
imgPts=[]
tgtPts=[]
tempImg=cv2.cvtColor(tempImg[1], cv2.COLOR_BGR2GRAY)
found_all, corners = cv2.findChessboardCorners(tempImg, chessboardDim )
imgPts.append(corners.reshape(-1, 2))
tgtPts.append(np.array(chessCoordinates, dtype=np.float32))
retval,myRvec,myTvec=cv2.solvePnP(objectPoints=np.array(tgtPts), imagePoints=np.array(imgPts), cameraMatrix=camMatrix, distCoeffs=distCoefficients)
2 ответа:
Координаты камеры совпадают с координатами изображения. Таким образом, у вас есть X-топор, направленный в правую сторону от камеры, y-топор, направленный вниз, а z-в направлении камеры. Это система топоров по часовой стрелке, и то же самое относится к шахматной доске, поэтому, если вы указали начало координат, скажем, в верхнем правом углу шахматной доски, X топор идет вдоль длинной стороны вправо, а y вдоль короткой стороны шахматной доски, Z топор будет направлен вниз, к центру шахматной доски. земля.
Решение PnP выводит преобразование в тех же единицах, что и единицы, в которых вы указали длину полей шахматной доски, но оно также может использовать единицы, указанные в калибровке камеры, так как оно использует матрицу камеры.
Tvec указывает на начало координат мира, в котором вы разместили объект калибровки. Таким образом, если вы разместили первую точку объекта в (0,0), то именно туда будет указывать tvec.
Каковы направления осей камеры и мировых систем координат?
Угол 0,0,0 на досках расположен таким образом, что оси X и Y направлены к остальным угловым точкам. Ось Z всегда направлена в сторону от доски. Это означает, что он обычно направлен несколько в сторону камеры.Выводит ли solvePnP перевод в тех же единицах, в которых я указываю точки объекта?
Да
Я указал Происхождение мира как первая из точек объекта (один из углов шахматной доски). Это нормально и является ли tvec переводом именно в эту точку из координат камеры?
Да, это довольно распространенное явление. В большинстве случаев первый угол кулачка устанавливается равным 0,0,0, а последующие углы устанавливаются в плоскости z=0 (например, (1,0,0), (0,1,0) и т. д.).
Tvec, совмещенный с вращением, указывает к этой точке от рамки координат доски к камере. Короче говоря; tvec & rvec обеспечивают вы с обратным переводом (мир - > камера). С помощью некоторой базовой геометрии вы можете рассчитать преобразование, которое ставит камера - > мир.