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 5

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 обеспечивают вы с обратным переводом (мир - > камера). С помощью некоторой базовой геометрии вы можете рассчитать преобразование, которое ставит камера - > мир.