Camera Calibration
- 카메라마다 camera matrix (intrinsic matrix) 와 distortion coefficient 가 다르고 왜곡이 있기 때문에 camera calibration을 통해 왜곡을 제거해주어야 한다
- calibration 결과 camera matrix와 distortion coefficient를 얻을 수 있고 이를 활용하여 획득한 카메라 이미지에 이를 적용하면 왜곡을 제거할 수 있다
- 추후에 object의 거리를 추정하기 위해 depth를 계산해야하는데 이때 이미지에 왜곡이 있으면 depth를 추정하기 어렵다. 따라서 calibration을 수행해주어야한다
calibration 방법
1. calibraion pattern을 사용하여 이미지 획득
- calibration pattern 중에 chess board를 사용했다
- 필수 조건
- grid cell의 크기 : 한칸의 길이가 가로, 세로 모두 27.7mm
- grid의 사이즈 : 5x6으로 설정 (짝수, 홀수로 구성되어야 한다)
- 다양한 각도와 거리에서 이미지 데이터를 획득한다
2. calibration matrix 구하기 (GML C++ camera calibration)
- opencv의
cv.findChessboardCorner
와 cv.calibrateCamera
를 통해서도 camera intrinsic matrix와 distortion coefficient를 계산할 수 있다
- 하지만 이번에는 GML C++ camera calibration이라는 tool을 사용하여 계산하였다
- 이 tool은 획득한 이미지들과 grid cell의 정보를 넣으면 알아서 결과를 반환해준다
- https://github.com/natowi/CameraCalibTools 여기에서 GML camera calibration tool를 다운받아서 사용할 수 있다
3. calibration 적용
- 이때 initUndistortRectifyMap은 처음 시작할 때 한번만 수행하면 된다
- 이후에는 remap만 수행하여 왜곡된 이미지를 펴주기만 하면 된다
// Camera matrix: focal length, principal point
static inline const cv::Mat mtx = (cv::Mat_<double>(3, 3) <<
343.353, 0, 340.519,
0, 344.648, 231.522,
0, 0, 1
);
// distortion
static inline const cv::Mat dist = (cv::Mat_<double>(1, 4) <<
-0.334698, 0.129289, -0.001919, 0.000753
);
//Calibration
cv::initUndistortRectifyMap(mtx, dist, cv::Mat(), cv::Mat(), cv::Size(640, 480), CV_32FC1, mapx, mapy);
cv::remap(mFrame, mFrame, mapx, mapy, cv::INTER_LINEAR);
4. calibration 결과