2015-10-30 40 views
0

我使用Python 2.7的Opencv。使用opencv的相機暫停功能意外的結果

我已獲得固有照相機矩陣,並且相機暫停外在矩陣,具有棋盤:

(ret, mtx, dist, rvecs, tvecs) = cv2.calibrateCamera(objpoints, imgpoints, grayImg.shape[::-1],None,None) 

[ret, rvec, tvec] = cv2.solvePnP(objp, corners, mtx, distCoeff) 

然後,我ploted使用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的形式)