2017-04-09 64 views
1

opencv 및 Aruco를 처음 사용했습니다. 저는 두 개의 서로 다른 Aruco 마커의 축 각도의 차이점을 알아 내려고했습니다. 예를 들어 각도 차이 b/w는 실제 세계에서 마커의 두 (1, 0, 0) 벡터입니다. 내 이해에서 변형은 로컬 좌표 -> 카메라 좌표 -> 월드 좌표 순서로 발생합니다. 그리고 두 개의 aruco 마커의 각도 차이는 이제 같은 세계 좌표로 나타납니다. 누군가이 과정이 어떻게 이루어 졌는지 설명 할 수 있습니까? 아니면 각도 차이를 찾는 더 좋은 방법이 있습니까? aruco 모듈세계 좌표계에서 Aruco 마커의 축 - 천사의 차이점을 얻는 방법은 무엇입니까?

  1. 변환 및 회전 벡터 (× 3) estimatePoseSingleMarkers() 함수 : I 파이썬과 OpenCV의 알려진

    코딩하고있다. (회전 및 평행 이동 벡터는로드 리 게스()를 사용하여 행렬 (3x3)로 변환 할 수 있습니다.

  2. 카메라 카메라 보정을 통한 매트릭스 (3x3) 및 dist_coefs 매트릭스 (1x5).
  3. 사용 6x6_250 aruco 마커

Upate :

  1. 세계 = 카메라가
  2. 다음은 aruco의 XYZ 구성 요소를 그리는 기능입니다 좌표 좌표입니다. 원점 또는 카메라가 (0, 0, 0) 인 것 같습니다. aruco 마커의 변환 및 회전 행렬을 원점의 x, y, z 구성 요소에 적용하여 aruco 마커의 x, y, z 구성 요소를 얻습니다. 그게 맞습니까?

/** */

void drawAxis(InputOutputArray _image, InputArray _cameraMatrix, InputArray _distCoeffs, 
      InputArray _rvec, InputArray _tvec, float length) { 

CV_Assert(_image.getMat().total() != 0 && 
      (_image.getMat().channels() == 1 || _image.getMat().channels() == 3)); 
CV_Assert(length > 0); 

// project axis points 
vector<Point3f> axisPoints; 
axisPoints.push_back(Point3f(0, 0, 0)); 
axisPoints.push_back(Point3f(length, 0, 0)); 
axisPoints.push_back(Point3f(0, length, 0)); 
axisPoints.push_back(Point3f(0, 0, length)); 
vector<Point2f> imagePoints; 
projectPoints(axisPoints, _rvec, _tvec, _cameraMatrix, _distCoeffs, imagePoints); 

// draw axis lines 
line(_image, imagePoints[0], imagePoints[1], Scalar(0, 0, 255), 3); 
line(_image, imagePoints[0], imagePoints[2], Scalar(0, 255, 0), 3); 
line(_image, imagePoints[0], imagePoints[3], Scalar(255, 0, 0), 3); 

}

답변

0

기술적으로 내 질문에 주위에 작업입니다. 그래서 저는 ARUCO 라이브러리가 3D objectPoints를 2D imagePoints로 매핑하는 projectPoints라는이 함수를 가지고 있다고 생각했습니다.

imagePoints [0] 및 imagePoints [1]은 (길이, 0, 0)의 2D 투영을 제공합니다. arccos (np.dot (v1, v2))를 사용하면 두 마커의 x 축 각도 차이를 얻을 수 있습니다.