/*对相机标定的说明:利用OpenCV对相机进行标定的过程,可参看OpenCV提供的帮助文档,非常的有用。
我在这里说明一些关键的,希望对大家有所帮助。一是本程序由于格子的实际坐标是随意给的(当然也有
一定方法),所以也就是说“世界坐标系是动的,每幅图像一个”,故每幅图像有一个外参数阵;二是
从一般标定之后的工作来说,在这步标定中所计算得到的外参数基本没用,所以我们不关心外参数;三是
我们主要关心的是内参数,只要相机的焦距不变,内参数就不变。另外,要说明一下代码大量参照了OpenCV
中文官方网上给出的相机标定的代码,但是那个代码有些问题,而且还让人不知怎么运行!这些我这里已经
做了修改;标定的所需的棋盘图片,大家可自己照,也是去http://graphics.cs.msu.su/en/research/calibration/
上去找,上面提供了三组标定用的图片*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// OpenCV
#include <cxcore.h>
#include <cv.h>
#include <highgui.h>
#include <cvaux.h>
void InitCorners3D(CvMat *Corners3D, CvSize ChessBoardSize, int Nimages, float SquareSize);
int image_width = 320;
int image_height = 240;//待标定图片的大小
const int ChessBoardSize_w = 5;
const int ChessBoardSize_h = 4;//图片中可标定的标角数
const CvSize ChessBoardSize = cvSize(ChessBoardSize_w,ChessBoardSize_h);
const int NPoints = ChessBoardSize_w*ChessBoardSize_h;
const int NImages=12;//待标定的图片数
int corner_count[NImages] = {0};
float SquareWidth = 20; //棋盘格子的边长,可任意设定,不影响内参数,只影响内参数
CvMat *intrinsics;
CvMat *distortion_coeff;
CvMat *rotation_vectors;
CvMat *translation_vectors;
CvMat *object_points;
CvMat *point_counts;
CvMat *image_po