2015-10-30 2 views
0

Я использую 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') 

Но то, что отображается на изображении очень отличается от прямого угла треугольника (даже хотя один угол треугольника близок к центру изображения).
Может кто-нибудь объяснить мне, что здесь происходит?

ответ

0

Это просто проблема входного аргумента cv.projectPoints: это должно быть

[proj_cam_axes, JAC] = cv2.projectPoints (world_cam_axes.T, rvec, tvec, MTX, distCoeffs)

для преобразования матрицы world_cam_axes в точки объекта (по словам opencv)