最終更新: mikk_ni3_92 2008年10月19日(日) 16:41:16履歴
現在地 >> メニュー >> サンプルコード::OpenCV >> OpenCV::基本編11 >> OpenCV::基本編11まとめ
以下の画像を読み込んで、チェスボードのコーナー検出を行え。
以下の画像を読み込んで、チェスボードのコーナー検出を行え。
#include <iostream> #include <string> #include <cv.h> #include <highgui.h> //------------ 各種外部変数 --------------// //ファイル名 std::string filename = "image01.png"; //チェスボードのパネル数と内部の点 const int ChessX = 5; const int PinChessX = ChessX -1; const int ChessY = 4; const int PinChessY = ChessY -1; //----------- プロトタイプ宣言 -----------------// void CalcPecision(IplImage *imgA,CvPoint2D32f *corners,int FindNum); //---------- メイン関数 ------------// int main( int argc, char **argv) { IplImage *imgA = cvLoadImage( filename.c_str(), CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); if(imgA ==NULL){ std::cerr<<"Can't Load Image .\n"; return -1; } //チェスボードの内部コーナー(X,Y) CvSize CornerXY = cvSize (PinChessX, PinChessY); //メモリ確保 CvPoint2D32f *corners = (CvPoint2D32f *) cvAlloc( sizeof (CvPoint2D32f) * (PinChessX*PinChessY) ); //コーナー検出 int FindNum; cvFindChessboardCorners(imgA,CornerXY,corners,&FindNum); std::cout << FindNum << " Corners 見つけました。\n"; //高精度化 CalcPecision(imgA,corners,FindNum); //描画 cvDrawChessboardCorners(imgA,CornerXY,corners,FindNum,1); //0のときFindNumが使われる cvNamedWindow(filename.c_str(),CV_WINDOW_AUTOSIZE); cvShowImage(filename.c_str(),imgA); cvWaitKey(0); cvFree(&corners); cvReleaseImage( &imgA ); cvDestroyWindow(filename.c_str()); return 0; } //----------- ここから各種関数 ---------------// void CalcPecision(IplImage *imgA,CvPoint2D32f *corners,int FindNum) { 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); }