最終更新: mikk_ni3_92 2008年10月19日(日) 16:05:25履歴
現在地 >> メニュー >> サンプルコード::OpenCV >> OpenCV::基本編11
INDEX: OpenCV::基本編10 << OpenCV::基本編11 >> OpenCV::基本編12
検出するコーナーの型は「CvPoint2D32f」である。
例えばこの画像で、チェスボードのパネル数は(5×4)
なので、チェスボードの内部にあるコーナーは、
従って、メモリ確保は以下のようになる。
コーナー検出には、cvFindChessboardCorners()関数を使う。
なお第4,5引数は省略可能。
[例]
計算されるコーナーの座標は近似値なので、精度をあげる。
この時、もともとの画像の「グレイスケール画像」が必要である。
[例]
関数リファレンス
検出されたコーナーは、「CvPoint2D32f型」として格納されている。
直接描画をしてもよいし、「cvDrawChessboardCorners()関数」を使ってもよい。
サンプルコード >> OpenCV::基本編11まとめ
INDEX: OpenCV::基本編10 << OpenCV::基本編11 >> OpenCV::基本編12
検出するコーナーの型は「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) );
コーナー検出には、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引数省略
計算されるコーナーの座標は近似値なので、精度をあげる。
この時、もともとの画像の「グレイスケール画像」が必要である。
[例]
//高精度化 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まとめ