저는 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 을 사용하는 것입니다. ...
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;
설정 실현하지 viewportpixelheight
및 viewportpixelwidth
은 정수이므로 정수 나누기를 수행하므로 1 또는 (교환 할 때) 0에서
그럴 수는 없습니다.OpenGL의 경우 fx와 fy에서 계산 된 시야각을 제공합니다. 종횡비는 fx와 fy에서도 계산됩니다. 또한이 두 값의 보정이 매우 부정확하기 때문에 수동으로 cx 및 cy를 정확한 이미지 센터로 설정했습니다. 가로 모드에서 카메라를 보정 한 다음 세로 모드에서 프레임을 캡처하면 어떻게됩니까? 나는 fxy와 aspect ratio를 결정하기 때문에 fx와 fy의 크기를 조정해야한다고 느낀다 ... – user1378489
추가 정보 : fov와 종횡비는 OpenCV 방법으로 계산된다. calibrationMatrixValues – user1378489
@ user1378489 혼란을 가져 오니 죄송합니다. 편집을 참조하십시오. ? – Hammer