Ramiz 0 Жалоба Опубликовано April 9, 2010 Нужно откалибровать камеру. Есть некоторое количество кадров с сеткой 9x9, использую функцию cvCalibrateCamera2, флаги не указываю. В результате в матрице внутренней калибровки камеры получаются очень большие фокусные расстояния (и, соответственно, такие же ошибки репроекции) порядка 10e+9..10e+10. В чём может быть дело - плохие калибровочные данные или, например, ошибки конвертации типов? Вот кусок кода: #typedef float FL; // MarkerGrid - просто матрица 9x9 из проекций точек сетки на экран void RunCalibration(const std::vector<MarkerGrid>& grid_list, int board_width, int board_height, FL square_size, int img_width, int img_height) { size_t N = grid_list.size(); // image count int M = board_height * board_width; // point count CvMat* image_points = cvCreateMat( 1, N*M, CV_32FC2 ); CvMat* object_points = cvCreateMat( 1, N*M, CV_32FC3 ); CvMat* point_counts = cvCreateMat( 1, N, CV_32SC1 ); for (size_t i = 0; i < N; i++) { const MarkerGrid& grid = grid_list; CvPoint2D32f* dst_img_pt = ((CvPoint2D32f*)image_points->data.fl) + i*M; CvPoint3D32f* obj_pt = ((CvPoint3D32f*)object_points->data.fl) + i*M; for(int j = 0; j < board_height; j++ ) { for(int k = 0; k < board_width; k++ ) { *obj_pt++ = cvPoint3D32f(k*square_size, j*square_size, 0); *dst_img_pt++ = cvPoint2D32f(grid.X(k, j), grid.Y(k, j)); } } } cvSet( point_counts, cvScalar(M) ); CvMat rot_vects, trans_vects; CvMat* extr_params = cvCreateMat( N, 6, CV_32FC1 ); cvGetCols( extr_params, &rot_vects, 0, 3 ); cvGetCols( extr_params, &trans_vects, 3, 6 ); double _camera[9], _dist_coeffs[4]; CvMat camera_matrix = cvMat( 3, 3, CV_64F, _camera ); CvMat dist_coeffs = cvMat( 1, 4, CV_64F, _dist_coeffs ); cvZero( &camera_matrix ); cvZero( &dist_coeffs ); cvCalibrateCamera2( object_points, image_points, point_counts, cvSize(img_width, img_height), &camera_matrix, &dist_coeffs, rot_vects, &trans_vects, 0); CvMat* reproj_errs = cvCreateMat( 1, N, CV_64FC1 ); double avg_reproj_err = compute_reprojection_error( object_points, &rot_vects, &trans_vects, &camera_matrix, &dist_coeffs, image_points, point_counts, reproj_errs ); printf("Average reprojection error: %.5Lf\n", avg_reproj_err); printf("Reprojection errors:\n"); for (size_t q = 0; q < N; q++) { printf("%.5Lf ", reproj_errs->data.db[q]); } printf("\n"); cvReleaseMat( &reproj_errs ); cvReleaseMat( &object_points ); cvReleaseMat( &image_points ); cvReleaseMat( &point_counts ); } Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Ramiz 0 Жалоба Опубликовано April 10, 2010 Больше не актуально. Разобрался. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах