OpenGL de プログラミング - OpenCV::基本編11
現在地 >> メニュー >> サンプルコード::OpenCV >> OpenCV::基本編11
INDEXOpenCV::基本編10 << OpenCV::基本編11 >> OpenCV::基本編12


チェスボードのコーナー検出


OpenCVでは、カメラキャリブレーションをするためにチェスボードのコーナー検出がある。

使い方


「チェスボードのパネルの数」は、わかっている必要がある。

手順は以下の通り
  1. 検出したコーナーを格納する場所のメモリ確保
  2. コーナー検出
  3. 高精度化


[1].メモリ確保


検出するコーナーの型は「CvPoint2D32f」である。

例えばこの画像で、チェスボードのパネル数は(5×4)
なので、チェスボードの内部にあるコーナーは、
  • 横:4個
  • 縦:3個
  • 合計:4×3=12個
となる。

従って、メモリ確保は以下のようになる。

//チェスボードのパネル数と内部の点
const int ChessX = 5;
const int PinChessX = ChessX -1;
const int ChessY = 4;
const int PinChessY = ChessY -1;
... ...
//メモリ確保
CvPoint2D32f *corners = (CvPoint2D32f *) cvAlloc( sizeof (CvPoint2D32f) * (PinChessX*PinChessY) );


[2].コーナー検出


コーナー検出には、cvFindChessboardCorners()関数を使う。
なお第4,5引数は省略可能。

[例]

//チェスボードのパネル数と内部の点
const int ChessX = 5;
const int PinChessX = ChessX -1;
const int ChessY = 4;
const int PinChessY = ChessY -1;

			... ...
	//チェスボードの内部コーナー(X,Y)
	CvSize CornerXY = cvSize (PinChessX, PinChessY);
	//メモリ確保
	CvPoint2D32f *corners = (CvPoint2D32f *) cvAlloc( sizeof (CvPoint2D32f) * (PinChessX*PinChessY) );

			... ...

	int FindNum; //検出した個数を格納
	cvFindChessboardCorners(imgA,CornerXY,corners,&FindNum);  //第5引数省略



[3].高精度化


計算されるコーナーの座標は近似値なので、精度をあげる。
この時、もともとの画像の「グレイスケール画像」が必要である。

[例]

	//高精度化
	IplImage *gray = cvCreateImage (cvGetSize (imgA), IPL_DEPTH_8U, 1);
	cvCvtColor (imgA, gray, CV_BGR2GRAY);
	cvFindCornerSubPix (gray, corners, FindNum, cvSize (3, 3), cvSize (-1, -1),
		cvTermCriteria (CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, 0.03));  //20回の反復、目標精度:0.03
	cvReleaseImage(&gray);


関数リファレンス

メモ:描画


検出されたコーナーは、「CvPoint2D32f型」として格納されている。
直接描画をしてもよいし、「cvDrawChessboardCorners()関数」を使ってもよい。




サンプルコード >> OpenCV::基本編11まとめ