2016-08-03 5 views
-1

저는 OpenGL ES (IOS) 및 OpenCV와 함께 작업하고 있습니다. GLKMatrix4 카메라 위치에서 2D 픽셀 좌표를 얻는 방법이 있는지 알고 싶습니다.OpenGL ES - 카메라 위치에서 2 차원 픽셀 좌표를 얻습니다.

사실 OpenGL을 사용하여 표시된 특정 3D 개체의 크기와 카메라 포즈가 있으며이를 OpenCV 참조 좌표 즉 2D 픽셀로 변환하고 싶습니다.

더 정확하게는 IOS 앱이 있고 카메라 색상을 스트리밍합니다. 이 스트림은 내 Ipad에 OpenGL과 함께 표시됩니다. 이 디스플레이에는 3D 오브젝트 인 특정 오버레이가 있습니다. 동시에 OpenCV로 일부 탐지를 수행합니다. 이제, OpenCV에 대한 감사의 결과를 3D 오브젝트와 함께 내 프레임 (직사각형입니다)에 링크하고 싶습니다.하지만이 카메라의 위치와 크기 만 있습니다.

4x4 카메라 포즈의 내용을 알고 있지만 가능한 경우 2D 좌표로 변환 할 수있는 방법에 대한 정보를 찾지 못했습니다.

그래서 간단히 : 입력 : 2 차원 사각형 (좌표 차원에서만 얻을)와 3D 객체 (의 카메라 위치받을 만)

방법이 있나요? 저 좀 도와 주 시겠어요 ?

감사

+0

행렬로 표현되는 픽셀 또는 행렬로 곱한 벡터로 표현되는 픽셀을 얻으려고하십니까? 귀하의 의견이 정확히 무엇인지 설명하십시오. –

+0

방금 ​​내 글을 편집했습니다. 실제로 예, 내 3D 객체의 카메라 포즈 (Matrix 4x4)에서 2D 좌표 (픽셀)를 가져오고 싶습니다. Matic에게 감사드립니다. – lilouch

+0

이것은 원래 [Robotics] (http://stackoverflow.com/q/38763529/42473)에 게시되었지만 이중 게시 된 후에 마이그레이션되었습니다. –

답변

1

당신은 당신이 OpenGL을에서 사용하는 행렬을 곱해야하는 벡터의 화면 투사를 얻으려면. 세 번째 좌표는 단순히 버려지고 깊이 버퍼에만 사용됩니다 (또한 보간법이지만 실제로 여기서는 중요하지 않습니다).

OpenGL에서 행렬을 곱하면 그려지는 픽셀의 좌표는 모든 축에서 [-1,1] 범위의 좌표계로 정규화됩니다. 필요한

: 즉, 화면의 가장 왼쪽 상단에있는 픽셀/뷰는이 (-1,1), 오른쪽 위 (1,1) 센터 (0,0) ... 지금,이 값은 정규화되어야하는 버퍼의 픽셀에 대응하는 좌표가 의미 버퍼가 widthheight 인 경우 픽셀 위치는 bufferX = ((x+1)/2.0) * widthbufferY = ((y+1)/2.0) * height입니다. 결과는 부동 소수점 값이므로 정수로 반올림하거나 유형 변환해야합니다. 그래도 OpenGL에서 어떤 일을하는지 전혀 모르겠습니다.

+0

좌표가 실제로 버퍼 안에 있는지 확인하는 것을 잊지 마십시오 ... –

+0

답장을 보내 주셔서 감사합니다.하지만 제 물건의 카메라 위치 만 가지고 있습니다. 그렇다면이 카메라 위치를 분해해야합니까? – lilouch

+0

이것을 정확하게 이해한다면 0 벡터에 행렬을 곱하면됩니다. 또는 아마도 행렬의 변환 벡터 (4 번째 행)를 가져 와서 결과로 사용할 수 있습니다. –

1

이미 GLKit 유형 및 수학을 사용하고 있으므로 다른 방법이 필요한 경우 GLKMathProject 3D 모델 공간을 뷰포트 (창/픽셀 2D) 공간으로 변환하고 GLKMathUnproject 공간을 사용해보십시오. 장면을 그리기 위해 (아마도) 셰이더에 전달할 (동일한) 모델 뷰 및 투영 행렬이 필요합니다.