2012-11-02 5 views
1

저는 OpenCV와 OpenGL 구성 요소 사이를왔다 갔다했습니다. 두 부분 중 어느 부분을 수정해야하는지 잘 모르겠습니다.카메라 보정 : 이미지 종횡비와 다른 종횡비. 어떻게 수정합니까?

OpenCV 카메라 보정을 사용하면 정사각형 크기의 이미지에 해당하는 종횡비가 약 1 인 fx, fy가됩니다. 내 보정 출력 :

... 
image_width: 640 
image_height: 480 
board_width: 6 
board_height: 9 
square_size: 5. 
flags: 0 
camera_matrix: !!opencv-matrix 
    rows: 3 
    cols: 3 
    dt: d 
    data: [ 6.6244874649105122e+02, 0., 3.4060477796553954e+02, 
     0., 6.4821741696313484e+02, 2.5815418044786418e+02, 
     0., 0., 1. ] 
distortion_coefficients: !!opencv-matrix 
    rows: 5 
    cols: 1 
    dt: d 
    data: [ -1.1832005538154940e-01, 1.2254891816651683e+00, 3.8133468645674677e-02, 1.3073747832019200e-02, -3.9497162757084490e+00 ] 

그러나 보정 결과에서 알 수 있듯이 이미지 폭은 640x480입니다.

바둑판을 프레임에서 감지하여 OpenGL로 바둑판을 그릴 때 OpenGL에서 높이를 렌더링하지만 너비 방향으로 늘어나서 실제로 위치하는 바둑판에 맞지 않습니다. 확실하게 해결하는 것은 480/640으로 보정의 fx 구성 요소를 곱하는 것입니다. 그러나 이것이 이것이가는 길인지는 확실하지 않습니다.

어떻게 수정하나요? 이미지 크기로 보정 값을 조정하거나 OpenGL에서 수정하려면 무엇인가합니까?

편집

캡처 및 표시의 차이가있다. I 캡쳐 된 스마트 폰으로 이미지를 캡쳐하고 스마트 폰이 640x480의 이미지를 출력합니다.

체스 판을 찾으려면 위에 나와있는 내장 함수를 사용합니다.이 함수는 보정되었습니다.

그럼 내가 어떤 OpenGL에 어떤 종횡비를 주 었는지에 상관없이 fx/fy, 640/480 또는 fx/fy * 640/480으로합시다. 잘못된 것입니다. OpenGL에서 다시 투영되는 체스 판은 OpenGL이 다시 투사하는 방식으로 폭 방향으로 늘어납니다.

OpenGL에서 정확하게 보이는 유일한 방법은 체스 보드을 찾기 위해 fx = 640, fy = 480 을 사용하는 것입니다. ... enter image description here

Edit2가 내가 상관없이 내가 gluPerspective에 전달 화면 비율을 설정하는 방법을 의미하지

, 그렇지 않은 지금은 완전히 카메라 내장을 무시하고 있기 때문에 그 잘못은 물론이다 오른쪽으로 나오십시오.

gluPerspective(/* field of view in degree */ m_fovy, 
    /* aspect ratio */ 1.0/m_aspect_ratio, 
    /* Z near */ 1.0, /* Z far */ 1000.0); 

나는 m_aspect_ratio의 값을 시도했다 : OpenCV의의 calibrationMatrixValues의

  • 출력 화면 비율
  • FX/회계 연도
  • 480분의 640
  • FX/회계 연도 * 640/480
  • calibrationMatrixValues의 출력 * 640/480

모두 너비가 너무 좁은 것 같습니다. 체스 판의 기원은 내 스크린 샷의 이미지에서 가장 안쪽의 코너입니다. 올바르게 배치되고 이미지의 가장 아래쪽 안쪽 모서리도 마찬가지입니다. 스케일링 문제입니다.

EDIT3 그것은 정말, 정말 멍청한 짓이었다

.. 내가 그렇게 같은 OpenGL을위한 화면 비율 설정되었습니다

gluPerspective(/* field of view in degree */ m_fovy, 
    /* aspect ratio */ 1.0/m_aspect_ratio, 
    /* Z near */ 1.0, /* Z far */ 1000.0); 

m_aspect_ratio = viewportpixelheight/viewportpixelwidth; 

설정 실현하지 viewportpixelheightviewportpixelwidth은 정수이므로 정수 나누기를 수행하므로 1 또는 (교환 할 때) 0에서

답변

1

카메라 보정 매트릭스는 세계 좌표를 이미지 좌표에 매핑합니다. OpenGL은 이미지 좌표를 화면 좌표에 매핑합니다. 이미지가 표시되는 방식에 문제가있는 경우 OpenGL에서 처리해야합니다.

혼란스럽게 생각합니다. 내가하려는 것은 이미지를 캡처하고 표시하는 것입니다. 실제 카메라의 종횡비를 초점 거리에서 계산할 수 있다는 것이 맞습니다. 초점 거리와 종횡비는 카메라의 하드웨어로 고정됩니다. 이미지를 캡처 한 후에는 OpenGL을 사용하여 선택한 종횡비로 자유롭게 표시 할 수 있습니다. 이미지를 자르고 스트레치하여 표시되는 것의 종횡비를 변경할 수 있습니다. 카메라의 종횡비가 화면의 종횡비와 일치하는 것은 아닙니다. OpenCV는 실제 카메라의 직접 원시 측정을 사용하여 카메라 보정 행렬을 계산합니다. 정확하고 일정하다고 가정하면 (둘 다 확대/축소가 없다면 합리적인 것처럼 보임), 종횡비에 대한 추가 변경은 OpenGL의 책임입니다. 나가 fx를 말하고 fy는 종횡비를 결정하지 않는다 나는 전혀 미안하다 전혀 명확하지 않은 전시 된 종횡비를 언급하고 있었다.

또한 초점 거리에서 가로 세로 비율을 계산할 수있는 이유는 촛점 거리가 픽셀 단위로 표시되고 그 단위가 x 축과 y 축에서 다를 수 있다는 점입니다. 간단한 설명을 찾을 수 있습니다 here

카메라 매트릭스의 초점 길이에 대한 가장 좋은 설명은 Camera intrinsics 섹션의 Computer Vision Algorithms and Applications에 나와 있습니다. pdf에서 그것은 책에서 페이지 72, 페이지 50에서 시작됩니다. 1.0의 비율이 정사각형 이미지를 표시하지 않는

+0

그럴 수는 없습니다.OpenGL의 경우 fx와 fy에서 계산 된 시야각을 제공합니다. 종횡비는 fx와 fy에서도 계산됩니다. 또한이 두 값의 보정이 매우 부정확하기 때문에 수동으로 cx 및 cy를 정확한 이미지 센터로 설정했습니다. 가로 모드에서 카메라를 보정 한 다음 세로 모드에서 프레임을 캡처하면 어떻게됩니까? 나는 fxy와 aspect ratio를 결정하기 때문에 fx와 fy의 크기를 조정해야한다고 느낀다 ... – user1378489

+0

추가 정보 : fov와 종횡비는 OpenCV 방법으로 계산된다. calibrationMatrixValues ​​ – user1378489

+0

@ user1378489 혼란을 가져 오니 죄송합니다. 편집을 참조하십시오. ? – Hammer

0

, 그것은 (거의 항상 1.0의 이유를 설명하는, 정사각형이 아닌 픽셀 카메라를 제외하고 anamorphic format에서 캡처 상대적으로 드물다) 정사각형 픽셀을 나타냅니다. 카메라 행렬에는 절대 이미지 크기 또는 실제 카메라 크기에 대한 정보가 없습니다.

한편, gluPerspective의 종횡비는 입니다.은 이미지 크기를 나타냅니다. 하나의 종횡비를 다른 종횡비와 혼동하지 않는 것이 중요합니다.

gluPerspective를 사용하려는 경우 가능하지만 gluPerspective를 사용하면 모든 내장 카메라 매개 변수 (즉, 축 비뚤어 짐 및 주점 오프셋)를 모델링 할 수 없습니다. 나는 정확하게 가로 세로 비율과 fovy를 설정하는 방법을 설명합니다 in this article.

그러나 gluFrustum (0이 아닌 주 포인트 오프셋을 허용) 또는 glLoadMatrix (0이 아닌 축 스큐 허용)를 직접 사용하는 것이 좋습니다. 두 방법 모두 this article에 설명되어 있습니다.

관련 문제