/*---------------------------------------------------------------- * 函数功能:获得图片的角点并存放在image_point中 * 输入: CvSize board_size --- 标定的图片区域大小 * int number_of_board --- 要标定的图片数目 * string distorted_base_path --- 畸变图片的路径 * string undistorted_base_path--- 非畸变图片的路径 * CvMat*& object_points --- 存储世界坐标系的点 * CvMat*& image_points --- 存储图片坐标系的点 * CvMat*& point_counts --- 每幅图的角点个数 * int image_start_base --- 图片的基址 ------------------------------------------------------------------*/ void GetCorners(CvSize board_size, //要标定的区域大小 int number_of_board, //总共要标定的图片 string distorted_base_path, //畸变图片的路径 string undistorted_base_path, //非畸变图片的路径 CvMat*& object_points, //存储世界坐标系的点 CvMat*& image_points, //存储图片坐标系的点 CvMat*& point_counts, int image_start_base = 1 ); { int board_w = board_size.width; int board_h = board_size.height; int board_n = board_w * board_h; int successes = 0; int i,j; char image_name[255]; char window_name[255] = "front"; int image_name_temp = image_start_base; sprintf_s(image_name, "%d", image_name_temp); sprintf_s(window_name, "%d", image_name_temp); IplImage* src_img = cvLoadImage((distorted_base_path+image_name+".bmp").c_str(),1); cvNamedWindow(window_name); mouse_callback: cvSetMouseCallback(window_name, MyMouseCallback, (void*)src_img); cvNamedWindow(window_name); //if we get the number of corners is enough ,add it to our data while ((successes + image_start_base - 1)< number_of_board) { while (true) { cvShowImage(window_name,src_img); if(cvWaitKey(15)==27) { cout << "=================================================\n"; cout << "mouse_click_count: " << mouse_click_cnt << endl; cout << "=================================================" << endl; // Get Subpixel accuracy on those corners //Draw it on the image cvDrawChessboardCorners(src_img, board_size, corner_get_by_mouse, (mouse_click_cnt-1), 1); cvShowImage(window_name, src_img); // cvSaveImage("E:\\1_corner.bmp", src_img); cvWaitKey(0); cvDestroyWindow(window_name); break; } } if ( mouse_click_cnt == board_n ) { int step = successes * board_n; for (i = step, j = 0; j < board_n; ++i, ++j) { CV_MAT_ELEM(*image_points, float, i, 0) = corner_get_by_mouse[j].x; CV_MAT_ELEM(*image_points, float, i, 1) = corner_get_by_mouse[j].y; CV_MAT_ELEM(*object_points, float, i, 0) = j % board_w; //x CV_MAT_ELEM(*object_points, float, i, 1) = j / board_w; //y CV_MAT_ELEM(*object_points, float, i, 2) = 0.0f; //z } CV_MAT_ELEM(*point_counts, int, successes, 0) = board_n; successes ++; mouse_click_cnt = 0; //load another picture if (successes < number_of_board) { image_name_temp ++; sprintf_s(image_name, "%d", image_name_temp); sprintf_s(window_name, "%d", image_name_temp); src_img = cvLoadImage((distorted_base_path+image_name+".bmp").c_str(),1); cvNamedWindow(window_name); } } //标定的点有错,重新标定该幅图片 if (mouse_click_cnt != board_n) { mouse_click_cnt = 0; sprintf_s(image_name, "%d", image_name_temp); sprintf_s(window_name, "%d", image_name_temp); src_img = cvLoadImage((distorted_base_path+image_name+".bmp").c_str(),1); cvNamedWindow(window_name); } goto mouse_callback; } cvReleaseImage(&src_img); cvDestroyWindow(window_name); }