2017-11-21 9 views
1

solvepnp를 사용하여 캠 프레임과 월드 프레임의 (0,0,0) 회전 및 변환을 찾을 수 있습니다.solvePnP를 ​​사용하여 4 개의 꼭지점의 실제 위치를 찾을 수 있습니까?

mtx = np.array([ 
[463.889 ,  0  , 320], 
[0   ,  463.889,  240], 
[0   ,  0 ,   1 ], 
]) 
dist = np.array([0.0,0,0,0,0]) 


objp = np.zeros((4,3), np.float32) 
objp[:,:2] = np.mgrid[0:2,0:2].T.reshape(-1,2) 

#objp = array([[ 0., 0., 0.], 
# [ 1., 0., 0.], 
# [ 0., 1., 0.], 
# [ 1., 1., 0.]], dtype=float32) 
# let assume the square len is 1cm. 

corners2 = np.float32([ [[498,136]] , [[558,138]], [[505,184]], [[569,186]]]) 
retval, rvecs, tvecs = cv2.solvePnP(objp, corners2, mtx, dist) 

imgpts, jac = cv2.projectPoints(axis, rvecs, tvecs, mtx, dist) 

tvecs는 카메라 프레임에서 (0,0,0)의 위치에 해당합니까?

다른 3 점의 번역은 어떻게 찾을 수 있습니까?

다른 말로하면, 나는 모든 실제 위치를 얻을 수 있는가? ([1., 0., 0.], [0., 1., 0.] 코너 2에있는 포인트?

+0

는과'tvec', 당신이 표현 된 3 차원 점을 변환 할 수있는'3x4' 변환 행렬을 구축 할 수 있습니다 ('로드리게스()'회전 회전 벡터의 행렬을 얻을 수 있습니다) 대상 프레임을 카메라 프레임에 넣습니다.'P_cam = [R | t] P_obj'. 변환 행렬, 동질 변환 행렬 항목을 참조하십시오. – Catree

답변

1

tvecs는 카메라 프레임에서 (0,0,0)의 위치에 해당합니까?

OpenCV 설명서에서 이에 대한 답변을 찾을 수 있습니다.

  • rvec - 출력 회전 벡터 즉, 함께 tvec로, 모델에서 포인트 좌표계 카메라 좌표계를 제공합니다 (로드 리 게스()를 참조).
  • tvec - 출력 번역 벡터. 여기

그것이 모델에서 포인트 카메라 하나에 좌표계 제공 있음을 알려줍니다,이, 그것은으로 이동하는 데 필요한 번역 및 회전을 발견 할 것이다 당신이 당신의 포인트가 좌표계 무엇을 의미 이미지 평면에 투영되어 2D 이미지를 생성 할 수있는 위치.

귀하의 질문에 따라 달라질 수 있습니다 ... 귀하의 포인트가 카메라를보고 카메라를 통해 (0,0,0)으로 생성 된 것으로 가정하면 그렇습니다. 원점이 점의 중간에 있고 카메라가 2D 점을 얻은 이미지를 생성하는 것을 의미하면이 tvecs는이 카메라에 대한 원점입니다.

다른 3 점의 번역은 어떻게 찾을 수 있습니까? ([1., 0., 0.], [0., 1., 0.])

아주 쉽게, 전이를 만들 필요가 있습니다. rvecs와 tvecs에서 행렬. rvecs가 Rodrigues에 있고이 함수를 사용하여 회전 행렬 (3x3)을 구할 수 있습니다. 번역 행렬 (3x3)을 얻기 위해 다음과 같이 열 벡터 옆에 번역을 입력하고 아래에 las 위치에 0과 1 행을 넣으십시오.

    R11 R12 R13 T1 

변환 = R21 R22 R23 T2는

    R31 R32 R33 T3 

       0 0 0 1 

이제 그런 다음 당신이 그것을 곱하면됩니다. 균질 기본적으로 좌표 (여분의 행의 아래에 1 점을 넣어.

P = 1 
    0 
    0 
    1 

Transformation * P 

을 당신이 할 수있는 원하는 모든 포인트가있는이 :) 당신의 3D 점을 나타내는 4x1 벡터를 줄 것이며 마지막 부분 (이 경우)은 1이 될 것이고 3D 점으로 돌아가려면 제거 할 수 있습니다. 다른 경우에는 마지막 구성 요소가 다른 구성 요소를 나눕니다 (1로 만들기 위해) 또한 제거됩니다.

마지막으로 카메라의 포즈를 얻을 수도 있습니다. 이렇게하면 계속 추적 할 수 있습니다.

이 정보가 도움이되기를 바랍니다.

0

그래서이게 뭡니까? 고마워. rvec``와

rotMat,_ = cv2.Rodrigues(rvecs) 
T0 = np.zeros((4, 4)) 
T0[:3,:3] = rotMat 
T0[:4,3] = [0, 0, 0, 1] 
T0[:3,3] = np.transpose(tvecs) 

p0 = np.array([0, 0, 0, 1]) 
z0 = np.dot(T0, p0); 

p1 = np.array([0, 1, 0, 1]) 
z1 = np.dot(T0, p1); 

p2 = np.array([1, 0, 0, 1]) 
z2 = np.dot(T0, p2); 

p3 = np.array([1, 1, 0, 1]) 
z3 = np.dot(T0, p3); 
+0

올바른 코드가 될 것이라고 생각합니다. 예상 답변을 제공합니까? BTW, 귀하의 질문에 대한 자세한 정보를 추가하려면 버튼을, 아니 답변 버튼을 사용하십시오 :) 나는이 하나를 삭제하는 것이 좋습니다, 다른 사람들을 혼동하지 말고 귀하의 질문의 일부로 추가하십시오. 또한, 코멘트를 남겨 두는 편이 낫습니다. 저는 오늘 여기에 우연히 여기에 입장했습니다. 그러나 대부분은 입력하지 않았지만 의견이 있으면 알려줍니다. – api55