2014-08-29 3 views
0

저는 최근에 OpenCV가 새롭기 때문에 카메라 보정에 어려움을 겪고 있습니다. 연구를 며칠 후에 나는 그것의 기본적인 이해를했습니다. 그러나 나는 여전히 몇 가지 기본적인 점을 이해하지 못하고있다.카메라 보정 OpenCV

1) objectpoint 매트릭스의 초기화, 왜 우리는 보드 예를 들어 3D 세계에 어디 0,0

Mat a = new MatOfPoint3f(); 
     for(int y=0; y<SIZE_Y; ++y) 
     { 
      for(int x=0; x<SIZE_X; ++x) 
      { 
       points = new MatOfPoint3f(new Point3(x*distance_Board , y*distance_Board , 0)); 
       a.push_back(points); 
      } 
     } 

에서이 행렬은 그것을 초기화 더 많은 이해가되지 않을까요 초기화 않는다

Mat a = new MatOfPoint3f(); 
     for(int y=1; y<=SIZE_Y; ++y) 
     { 
      for(int x=1; x<=SIZE_X; ++x) 
      { 
       points = new MatOfPoint3f(new Point3(x*distance_Board + FirstPoint.x, y*distance_Board + FirstPoint.y, 0)); 
       a.push_back(points); 
      } 
     } 

2) 나는

를 사용하여 내 카메라를 교정하려

나는 15 개 이상의 이미지를 시도했지만 결과는 여전히 매우 열악하다. 왜냐하면 나는 이미지를위한 rvec와 tvec의 중요성을 이해하지 못하기 때문에 (나는 논리를 이해한다. 번역은 다르다) 그러나 다른 점/다른 심상을 가진 저희를 어떻게 도울 것이다. 나는

내가

 Calib3d.projectPoints(objectPoints, rvecs.get(i), tvecs.get(i), cameraMatrix, distCoeffs, imagePoints); 

을 실행할 때 정말 어떤 rvecs을 알고하지 않는 이유 그 .. 교정이 전체 장면에서 2D 점으로 3 차원 점을 변환하는 공정한 좋은 방법으로 우리를 한 것으로 생각 tvecs는 .I이 this을 시도) 3D (실제 세계에 2D (imagePoints)에서 변환하는 방법이 있나요

3)

을 선택하지만 결과 때문에 교정의 잘못된 매개 변수에 잘못된 나는 또한

x ̃ = x * (1 + k1 * r^2 + k2 * r^4) + [ 2 p1 * x * y + p2 * (r^2 + 2 * x^2) ] 

y ̃ = y * (1 + k1 * r^2 + k2 * r^4 ] + [ 2 p2 * x * y + p2 * (r^2 + 2 * y^2) ], 

A) 그러나 r은 무엇을 따를 때 2D에서 3D로 변환 할 시도

4)? r = sqrt (x^2 + y^2)? 그리고 x = (x 좌표 픽셀) - (카메라 중심은 픽셀 단위)?

b) 카메라 중심은 카메라 매트릭스의 픽셀 = cx = 매개 변수입니까?

c) x 좌표 픽셀 = u = 이미지 포인트입니까? 누군가가 나에게 카메라 보정 또는 지점의 좋은 설명을 줄 수 있다면

이 많은 정보가 온라인하지만 난 선택의 여지가 실행 한 100 % 신뢰할 수있는 원본

을 발견하지 않은, 정말 뵙죠 것 나는 올바른 방향으로 (종이 등).

은 이미 opnecv 교정하여 문제를 해결하는 경우 나도 몰라하지만 어쨌든 당신에게 몇 가지 힌트를 줄 것이다 사전

답변

0

에 감사드립니다. 우선 교정에 대한 Zhang의 논문 (http://research.microsoft.com/en-us/um/people/zhang/Papers/TR98-71.pdf)을 읽어 보시기 바랍니다. Opencv 방법은 Zhang의 작업을 기반으로하므로이를 이해하는 것이 최우선 과제입니다. 카메라 보정은 카메라 2D 좌표계 (카메라 이미지의 왼쪽 상단에 원점이있는 픽셀 단위)와 외부 세계의 3D 좌표계 (예 : 미터) 간의 관계를 결정하는 것을 의미합니다. 알려진 평면 캘리브레이션 객체를 카메라 앞에 놓으면 시스템은 3D 이미지와 2D 이미지 사이의 동질적인 변환을 계산해야합니다 (즉, "rvecs.get (i), tvecs.get (i) "너는 말하고있다). 이미지 좌표는 항상 픽셀 단위이며 내장 교정 행렬은 픽셀 단위로 표시됩니다. 2D 이미지 좌표에서 3D 세계 좌표로 "변환"할 수는 없지만 적절한 변형을 계산할 수 있습니다. intrinc 교정 행렬과 회전 번역 행렬로 구성됩니다. 제발이 문서도 봐 http://research.microsoft.com/en-us/um/people/zhang/Papers/Camera%20Calibration%20-%20book%20chapter.pdf 희망이 도움이!

1

왜 두 눈을 가지고 있는지 궁금한가요? 가장 원시적 인 의미에서 두 눈으로 만 객체가 얼마나 멀리 떨어져 있는지를 알 수 있기 때문입니다. 3D 정보를 회복해야하는 일부 응용 프로그램에서는 두 개의 카메라를 사용하여이를 수행합니다.이를 입체경 (stereoscopy)이라고합니다 (http://en.wikipedia.org/wiki/Stereoscopy). 단일 카메라를 사용하여 3D 정보를 묘사하려는 경우 불일치가 발생할 수 있습니다.이 경우 호모 그래피 (http://en.wikipedia.org/wiki/Homography)라는 변환이 필요합니다. 원근감 모델링을 시도하기위한 마지막 단계입니다. 개체가 있습니다). 대부분의 경우 단일 카메라를 보정하려고 할 때 카메라의 렌즈 (http://en.wikipedia.org/wiki/Distortion_%28optics%29)에서 생성 된 방사상 왜곡을 제거하려고합니다. Opencv는이 프로세스를 수행 할 수있는 도구를 제공합니다. 대부분의 경우이 프로세스를 돕기 위해 체스 보드가 필요합니다. 좀 더 구체적 임에도 불구하고 이것을 확인할 수 있습니다 : http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html, 함수 cvFindChessboardCorners. 영어가 유감스럽고 원어민이 아니 어서 유익한 도움이되기를 바랍니다.

관련 문제