まずチェスボードパターンからコーナーの座標を求める。コーナーって何?ってのは下の画像参照。
チェスボード画像はOpenCV/docs/pattern.pdfというのがあるのでそれを使えばいい。この場合pattern_size = cvSize(8,6)となる。
int cvFindChessboardCorners( const void* image, CvSize pattern_size, CvPoint2D32f* corners, int* corner_count=NULL, int flags=CV_CALIB_CB_ADAPTIVE_THRESH ); const void* image //チェスボードを撮影した画像。 CvSize pattern_size //チェスボードコーナーの数。画像サイズではないことに注意。 CvPoint2D32f* corners //検出したコーナーの座標を格納する配列。サイズはコーナーの総数。 int* corner_count //検出したコーナーの数が返される int flags //とりあえずCV_CALIB_CB_ADAPTIVE_THRESHとしておけばOK.詳細はリファレンス参照。
返される値はすべてのコーナーが検出された場合は1、できなかった場合は0.
検出した座標はcvDrawChessboardCorners()を使って描画することができるので、
int found;
img = cvLoadImage(filename);
dst = cvLoadImage(filename);
found = cvFindChessboardCorners(img, pattern_size, corners, &corner_count, CV_CALIB_CB_ADAPTIVE_THRESH);
cvDrawChessboardCorners(dst, pattern_size, corners, corner_count, found);
とか書いてやれば元の画像に検出したコーナーの点を重ねた画像が出来上がる。
このように正しく検出できた場合は七色になる。検出できなかった場合はすべての点が赤で表示される。
以下のCalibrateCamera2では複数枚の画像を使うが、すべて正しくコーナーが検出できたものを使うとする。