Зачем нужна калибровка камеры?
Затем, что камера не является идеальный оптическим прибором, тем более для целей технического зрения, поэтому снятое изображение требуется сначала исправить в смысле простейших оптических искажений, прежде чем его можно будет использовать для сложных алгоритмов вроде стереозрения или motion-flow.
Далее под калибровкой камеры будем понимать определение параметров элементарных оптических искажений.
К этим параметрам относятся:
1. Фокусные расстояния по обеим координатам (fx,fy);
2. Главная точка [оптический центр] (cx,cy);
3. Коэффициенты дисторсии (k1,k2,p1,p2);
Как использовать полученные при калибровке параметры?
float _intrinsic_matrix[9];
_intrinsic_matrix[1]=0;
_intrinsic_matrix[3]=0;
_intrinsic_matrix[6]=0;
_intrinsic_matrix[7]=0;
_intrinsic_matrix[8]=1;
_intrinsic_matrix[0]=fx; // (focus_lenX)
_intrinsic_matrix[2]=cx; // (PrincipalX)
_intrinsic_matrix[4]=fy; // (focus_lenY)
_intrinsic_matrix[5]=cy; // (PrincipalY)
CvMat intrinsic_matrix=cvMat(3,3,CV_32FC1,_intrinsic_matrix);
float _distortion_coeffs[4];
_distortion_coeffs[0]=k1; // (Dist1)
_distortion_coeffs[1]=k2; // (Dist2)
_distortion_coeffs[2]=p1; // (Dist3)
_distortion_coeffs[3]=p2; // (Dist4)
CvMat distortion_coeffs=cvMat(4,1,CV_32FC1,_distortion_coeffs);
cvUndistort2(source,destination,&intrinsic_matrix,&distortion_coeffs);
ВНИМАНИЕ!!! ^^^ Это имеет смысл, если исправлять картинку один раз. Если нужно с одними и теми же параметрами обрабатывать много кадров подряд - лучше сгенерировать векторную карту для исправления дисторсии функцией InitUndistortMap и потом значительно быстрее исправлять дисторсии с помощью применения этой карты функцией cvRemap к изображениям.
Как калибровать камеру?
Пока у меня получилось сделать это просто подобрав параметры с помощью 4 трекбаров и простейшего приложения. Если подскажете нормальный способ или почему не работает описанный ниже теоретически-правильный способ - буду рад.
Получившиеся "практические" параметры моего экземпляра камеры Genius Slim 320:
Фокусные и главную точку определил вручную:
1. Фокусные расстояния по обеим координатам (fx=950,fy=950);
2. Главная точка [оптический центр] (cx=320,cy=240);
Дисторсии подобрал:
3. Коэффициенты дисторсии (k1=-3/20,k2=0,p1=-2/150,p2=0);