[객체인식 & Depth Estimation 프로젝트] 5. Camera Calibration (GML camera calibration)

happy_quokka·2024년 1월 29일
0

자율주행 프로젝트

목록 보기
11/15

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.findChessboardCornercv.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 결과

  • 왜곡이 제거된 것을 확인할 수 있다

0개의 댓글