在相机标定中通常首先需要检测出棋盘标定板上黑白格内角点的位置:
网上的一段cvFindChessboardCorners函数调用代码:
#include <iostream> #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/features2d/features2d.hpp" #include "opencv2/legacy/legacy.hpp" using namespace std; //by Huang, Haiqiao 25 Jun. 2011, [email protected] //http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=14214 int main( ) { cout<<"Draw Chess OpenCV!"<<endl; char* filename="e:/src2/chess2.bmp"; IplImage* imgRGB = cvLoadImage(filename,1); IplImage* imgGrey = cvLoadImage(filename,CV_LOAD_IMAGE_GRAYSCALE); if (imgGrey==NULL){//image validation cout<< "No valid image input."<<endl; char c=getchar(); return 1; } //-------find chessboard corners-------------- //使用的棋盘格的内角点个数,如结果图所示 int corner_row=10;//13;//interior number of row corners.(this can be countered by fingers.) int corner_col=12;//interior number of column corners. 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(//returning non-zero means sucess. imgGrey,// 8-bit single channel greyscale image. pattern_size,//how many INTERIOR corners in each row and column of the chessboard. corners,//a pointer to an array where the corner locations can be recorded. &corner_count,// optional, if non-NULL, its a point to an integer where the nuber of corners found can be recorded. CV_CALIB_CB_ADAPTIVE_THRESH|CV_CALIB_CB_FILTER_QUADS// check page 382-383. ); cout<<"corner_count = "<<corner_count; //-------Draw the corner pattern------- cvDrawChessboardCorners( imgRGB, pattern_size, corners, corner_count, found ); //to summary a bit of findings. cout<<"found="<<found<<endl; CvPoint2D32f* newCorners=new CvPoint2D32f[corner_n];//将检测出来的corner的坐标系转换成为同图像坐标系相同 int count=0; for (int c = 0; c<corner_col; c++) { cout<<endl; for (int r = 0; r<corner_row; r++) { cout<<"[x="<<corners[c*corner_row+r].x; cout<<" y="<<corners[c*corner_row+r].y<<"] "; newCorners[count++].x = corners[c*corner_row+r].x; newCorners[count++].y = corners[c*corner_row+r].x; } } //cvNamedWindow("Find and Draw ChessBoard", 0 );//窗口大小可调 cvShowImage( "Find and Draw ChessBoard", imgRGB ); cvWaitKey(0); cvReleaseImage(&imgGrey); cvReleaseImage(&imgRGB); //cvDestroyWindow("Find and Draw ChessBoard"); return 0; }
执行结果图:
检测结果存储在corner中,但是默认的顺序是从右上角红色的点开始沿着连线从右向左。
时间: 2024-11-05 18:25:01