0

카메라 이미지에 그래픽을 오버레이하는 증강 현실 애플리케이션을 개발 중입니다. OpenCV Pose Estimator와 장치 자체의 Intrinsic Camera Parameters를 사용하여 꽤 좋은 OpenCV Camera Matrix와 OpenGL Perspective Matrix를 생성 할 수 있습니다.OpenGL 원근감 매트릭스에 내장 카메라 매개 변수 : 파 파라메터 근처?

그러나 내 솔루션 및이 포럼 및 기타 인터넷 위치에서 검토 한 모든 유사한 솔루션은 원근감 매트릭스 근방 및 원거리 매개 변수에 대해 다소 임의의 값 (일반적으로 1.0 및 100)을 사용합니다.

그러나 관심 대상 개체가 너무 가깝지 않은 경우 일반적으로 문제는 아니지만 개체가 시점에 가까울수록 더 부정확 해지고 왜곡되는 원인이됩니다.

효과적으로 두 매개 변수 (근처, 멀리)를 조정하면 원근감의 소실점이 변경됩니다.

누구도 사용할 수있는 데이터에서 근거리 및 원거리 매개 변수를 유도하는 데 더 건전한 방법이 있습니까?

+0

렌더링 중에 가짜 렌즈 왜곡을 적용합니까? – Micka

답변

3

근거리 및 원거리 평면은 원근법에 영향을주지 않습니다. 전면 및 후면 자르기 평면이 배치되는 위치 만 바뀝니다.

일반적인 투영 행렬을 살펴보면 이러한 경우임을 확신 할 수 있습니다. 정의 사용 :

  • asp : 종횡비.
  • t2 : 반 시야각의 접선.
  • n : 가까운 거리.
  • f : 원거리.

투영 행렬은 다음이다 : 벡터 등이 적용

[ 1/(asp * t2) 0  0     0     ] 
P = [ 0    1/t2 0     0     ] 
    [ 0    0  (n + f)/(n - f) 2 * n * f/(n - f) ] 
    [ 0    0  -1     0     ] 

준다 :

[ x ] [ x/(asp * t2)      ] 
P * [ y ] = [ y/t2        ] 
    [ z ] [ (z * (n + f) + 2 * n * f)/(n - f) ] 
    [ 1 ] [ -z         ] 

관점 분할 한 후, 벡터이다

[ x/(-z * asp * t2)     ] 
[ y/(-z * t2)      ] 
[ -(n + f + (2 * n * f)/z)/(n - f) ] 
[ 1         ] 

하면 같이 x 및을 볼 수 있습니다.창 (또는보다 정확하게는 NDC 공간)에서 정점의 위치를 ​​결정하는 결과 벡터의 구성 요소는 근거리 및 원거리의 값에 의존하지 않습니다. 근거리 및 원거리 값은 시각 공간의 z 좌표와 NDC 공간의 z (깊이) 값의 매핑 만 제어합니다.

+1

근방과 원거리 간의 거리는 깊이 버퍼링의 정밀도에 영향을줍니다! 따라서 '근접'매개 변수가 감소되면 '파'평면 근처의 정점 픽셀이 잘못 렌더링 될 수 있습니다. – Micka

+0

안녕하세요 레트로 : 당신의 훌륭한 의견을 가져 주셔서 감사합니다. 네, 저는 틀렸고 당신이 맞습니다 : near-far 매개 변수는 이미지 관점 (또는 소실점의 위치)에서 역할을하지 않습니다. 나는 나의 상황에 대한 이미지를 여기에 놓았다 : http://i.stack.imgur.com/VnLB6.png. X, Y, Z 변환 및 회전에 적용되는 수정 사항에 상관없이 제 OpenGL 큐브는 실제로 실제 Rubik 큐브를 오버레이하지 않습니다. 나는 여전히 그것이 원근법 문제라고 믿는다. 그러나 지금은 근본적인 경우가 뷰 앵글 내재 카메라 교정 데이터의 필드에 있다고 생각하고있다. 도와 주셔서 감사합니다. –

0

위의 설명에 게시 한 이미지에서 일반적으로 내재 카메라 매개 변수와 특히 시야가 올바르지 않은 것으로 나타납니다. 카메라 매개 변수를 추정하는 몇 가지 수치 적 방법이 있습니다. 그러나 정확도는 복잡성이 증가함에 따라 감소합니다.

시야각을 알고 싶다면 3x3 필드가 작고 균일 한 점으로 된 대상을 만들어 계산할 수 있습니다. 대상은 작업 할 범위에서 대부분의 이미지를 채울만큼 커야합니다. 작은 대상이있는 경우 초점이 맞으면 카메라를 가까이에 이동할 수 있습니다. 점들은 상대적으로 작아서 수동으로 수행하는 경우 정확하게 위치를 추정 할 수 있어야합니다.컴퓨터 프로그램을 사용하여 위치를 추정 할 경우 더 큰 점을 사용해야합니다.

대부분의 점은 정렬 용입니다. 수평 시야는 중앙 수평선에서 가장 넓은 공간의 점들로부터 계산 될 수있다. 수직 시야는 유사한 방식으로 계산 될 수있다. 중앙과 모서리에있는 도트를 사용하여 카메라 이미지 평면이 중심에 있고 타겟에 평행한지 확인해야합니다. (이미지의 행과 열에 도트를 맞추기가 어렵다면 더 복잡한 카메라 모델이 필요할 수 있습니다.)

일단 대상이 설정되면 수평 시야는 계획된.

  • Z = 목표 범위 (m).
  • D = 수평 점 사이의 거리를 미터로 둡니다.
  • w = 이미지의 너비를 픽셀 단위로 표시합니다.
  • x = 수평 점 사이의 거리를 픽셀로 표시합니다. 이어서

,

HFOV = 2 * 아크 탄젠트 ((D * (X)/2)/Z/w).

비슷한 계산이 수직 시야에 적용됩니다.

우리는 90 년대 DARPA 무인 지상 차량 프로젝트에서 카메라를 보정하기 위해이 간단한 방법을 사용했는데 꽤 잘 작동했습니다.

희망이 있습니다.