今天看了好多别人的程序,蒙圈的要命,书上的例子也长的吓人,后来就得不能蛮干,就找到一精简的程序研究起来,最后还是有模有样的运行出来了。现在奉献给像我一样苦苦探求的人。
#include <cv.h>
#include <highgui.h>
using namespace std;
int main()
{
cout <<"CheckBoard Calibration !"<<endl;
IplImage* img= cvLoadImage("ge.jpg",CV_LOAD_IMAGE_GRAYSCALE);//读取图像的灰度格式
if (img==NULL)
{
cout << "No valid image input."<<endl;
return 0;
}
int corner_row=8;//表示一行中黑白格总和减一
int corner_col=11; //表示一列中黑白格总和减一
int corner_n=corner_row*corner_col;//总共的角点
CvSize pattern_size=cvSize(corner_row,corner_col); //角点数
CvPoint2D32f* corners = new CvPoint2D32f[corner_n];//存储角点的数组
int corner_count; //用来标识是否找到所有的角点
//第一个大函数
int found=cvFindChessboardCorners(img,pattern_size,corners,&corner_count,
CV_CALIB_CB_ADAPTIVE_THRESH|CV_CALIB_CB_FILTER_QUADS);
int half_win_size=3;//the window size will be 3+1+3=7
int iteration=20;
double epislon=0.1;
//第二个大函数
cvFindCornerSubPix(img,corners,corner_count,cvSize(half_win_size,half_win_size),cvSize(-1,-1),
cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS,iteration,epislon));
//第三个大函数
cvDrawChessboardCorners(img,pattern_size,corners,corner_count,found);
cout<<"found="<<found<<endl;
for (int i = 0; i < corner_n; i++){//显示所有角点的坐标,共11*8个
cout << "NO. "<<i<<": x=" << corners[i].x;
cout << "y=" << corners[i].y << endl;
}
cvNamedWindow("Draw", CV_WINDOW_AUTOSIZE );
cvShowImage( "Draw", img);
cvWaitKey(0);
cvReleaseImage(&img);
cvDestroyWindow("Draw");
return 0;
}