Я использую Opencv с python 2.7.Неожиданные результаты с использованием функций приостановки камеры opencv
Я получил внутреннюю матрицу камеры и внешнюю матрицу паузы камеры, с шахматной доской:
(ret, mtx, dist, rvecs, tvecs) = cv2.calibrateCamera(objpoints, imgpoints, grayImg.shape[::-1],None,None)
[ret, rvec, tvec] = cv2.solvePnP(objp, corners, mtx, distCoeff)
Затем я вычерчиваю мир осей координат на изображении с помощью cv.projectPoints
axes = chess_board_square_sz * np.float32([[1,0,0], [0,1,0], [0,0,-1]]).reshape(-1,3)
[axes_proj, jac] = cv2.projectPoints(axes, rvec, tvec, mtx, distCoeff)
img = draw_axes(img, corners2, axes_coor)
До сих пор все работает отлично: мировые оси появляются в 3d на изображении, с расположением, расположенным на углу шахматной доски, двумя осями, параллельными стороне шахматной доски, а третий ортогонален к этому позже ,
Я также преобразовал rvec вектор в матрицу вращения:
Rmat = cv2.Rodrigues(rvec)[0] #rotation matrix of the camera pause
Теперь я хочу, чтобы визуализировать проекции осей камеры на изображении; точнее, я хочу построить проекцию точек, координаты которых в системе осей камеры равны [1,0,1], [0,1,1] и [0,0,1].
НОРМАЛЬНО: Я должен наблюдать прямоугольный треугольник, две ортогональные стороны которого параллельны сторонам изображения, так как оси координат камеры определены таким образом.
Согласно всем тем, что я прочитал, координаты мира и координаты камеры связаны с X_cam = Rmat * X_world + tvec, поэтому X_world = Rmat^-1 (X_cam - tvec). Следовательно, следующий фрагмент кода должен быть показан правый угол треугольника, с закруглением, вероятно, находится недалеко от центра изображения:
cam_axes = chess_board_square_sz * np.float32([1,0,1], [0,1,1], [0,0,1]);
world_cam_axes = n.dot(Rmat.T, (cam_axes - tvec))
[proj_cam_axes, jac] = cv2.projectPoints(world_cam_axes, rvec, tvec, mtx, dist)
img = cv2.imread(calibr_img_name)
img = cv2.line(img, tuple(rproj_cam_axes[0].ravel(), tuple(rproj_cam_axes[1].ravel()), [255,0,0], 5)
img = cv2.line(img, tuple(rproj_cam_axes[0].ravel(), tuple(rproj_cam_axes[2].ravel()), [0,255,0], 5)
img = cv2.line(img, tuple(rproj_cam_axes[1].ravel(), tuple(rproj_cam_axes[2].ravel()), [0,0,255], 5)
fig, ax2 = plt.subplot(1)
ax2.imshow(img2, interpolation = 'bicubic')
Но то, что отображается на изображении очень отличается от прямого угла треугольника (даже хотя один угол треугольника близок к центру изображения).
Может кто-нибудь объяснить мне, что здесь происходит?