cvCalibrateCamera2 その2

cornersもobjectsと同じようにCvMatに変換する。

IplImage* img[NUM_OF_IMAGES];
CvPoint2D32f _corners[TOTAL_CORNER];
CvMat corners;

(画像読み込み)

for(int i=0;i<NUM_OF_IMAGES;i++){
    cvFindChessboardCorners(img[i],pattern_size,&_corners[i*CHESS_SIZE]
            ,&corner_count,CV_CALIB_CB_ADAPTIVE_THRESH);
}

cvInitMatHeader(&corners, TOTAL_CORNER, 1, CV_32FC2, _corners, CV_AUTOSTEP);

point_countsも同様。found=1の画像だけを使うので上のループにでも混ぜ込んでおくと楽。

CvMat point_counts;
for(int i=0;i<NUM_OF_IMAGES;i++){
    _point_counts[i] = CHESS_SIZE;
}

cvInitMatHeader(&point_counts, NUM_OF_IMAGES, 1, CV_32SC1, _point_counts, CV_AUTOSTEP);

戻り値も領域の確保が必要。

intrinsic = cvCreateMat(3, 3, CV_32FC1);
distortion = cvCreateMat(1, 4, CV_32FC1);

で、やっと引数が出揃ったところで

cvCalibrateCamera2(objects,corners,&point_counts,cvSize(img->width,img->height),intrinsic,distortion,NULL,NULL,0);

でintrinsicとdistortionが求まる。