OpenGL de プログラミング - OpenCV::基本編11まとめ
現在地 >> メニュー >> サンプルコード::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);
}