Перейти к содержимому
Compvision.ru
Ramiz

cvCalibrateCamera2 - Проблема

Recommended Posts

Нужно откалибровать камеру.

Есть некоторое количество кадров с сеткой 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 );

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×