2011-12-22 2 views
2

Я работал по калибровке камеры в течение недели знает .. Примеры, которые я видел в Интернете статьи и блог использует веб-камеру для захвата изображения ..Калибровка камеры с цифровой камерой

Но для моего сценария Я использую цифровую камеру, а именно Casio Exilim EX-Z77 .. Я добавляю изображения в заданные аргументы программы и получаю их индивидуально, используя цикл for. Таким образом, я смог имитировать работу веб-камеры.

Возможно ли, чтобы у меня были правильные искажения и внутренности? Поправьте меня, если я ошибаюсь, или с недопонимание ..

Спасибо и привет всем ..

Я новичок в программировании, так пожалуйста, голые со мной .. here является статья я на основе моего код .. Приведенный ниже код является то, что я был в состоянии сделать ..

 int n_boards = 0; 
    int board_w; 
    int board_h; 
    using namespace std; 
    int main(int argc, char *argv[]) 
    { 
board_w = 5; // Board width in squares 
board_h = 8; // Board height 
n_boards = 16; // Number of boards 
int board_n = board_w * board_h; 
CvSize board_sz = cvSize(board_w, board_h); 

CvMat* image_points  = cvCreateMat(n_boards*board_n, 2, CV_32FC1); 
CvMat* object_points  = cvCreateMat(n_boards*board_n, 3, CV_32FC1); 
CvMat* point_counts   = cvCreateMat(n_boards, 1, CV_32SC1); 
CvMat* intrinsic_matrix  = cvCreateMat(3, 3, CV_32FC1); 
CvMat* distortion_coeffs = cvCreateMat(5, 1, CV_32FC1); 

CvPoint2D32f* corners = new CvPoint2D32f[ board_n ]; 
int corner_count; 
int successes = 0; 
int step; 

     int a; 
     for(a =1; a<=n_boards; a++){ 

    while(successes < n_boards){ 

     IplImage *image = cvLoadImage(argv[a]); 
     IplImage *gray_image = cvCreateImage(cvGetSize(image), 8, 1); 

     int found = cvFindChessboardCorners(image, board_sz, corners, 
      &corner_count, CV_CALIB_CB_ADAPTIVE_THRESH |   CV_CALIB_CB_FILTER_QUADS); 

     // Get subpixel accuracy on those corners 
     cvCvtColor(image, gray_image, CV_BGR2GRAY); 
     cvFindCornerSubPix(gray_image, corners, corner_count, cvSize(11, 11), 
      cvSize(-1, -1), cvTermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 30, 0.1)); 

     // Draw it 
     cvDrawChessboardCorners(image, board_sz, corners, corner_count, found); 
     //cvShowImage("Calibration", image); 

     // If we got a good board, add it to our data 
     if(corner_count == board_n){ 
      step = successes*board_n; 
      for(int i=step, j=0; j < board_n; ++i, ++j){ 
       CV_MAT_ELEM(*image_points, float, i, 0) = corners[j].x; 
       CV_MAT_ELEM(*image_points, float, i, 1) = corners[j].y; 
       CV_MAT_ELEM(*object_points, float, i, 0) = j/board_w; 
       CV_MAT_ELEM(*object_points, float, i, 1) = j%board_w; 
       CV_MAT_ELEM(*object_points, float, i, 2) = 0.0f; 
      } 
      CV_MAT_ELEM(*point_counts, int, successes, 0) = board_n; 
      successes++; 
     } 

} 
    IplImage *image1 = cvLoadImage(argv[1]); 
CvMat* object_points2 = cvCreateMat(successes*board_n, 3, CV_32FC1); 
CvMat* image_points2 = cvCreateMat(successes*board_n, 2, CV_32FC1); 
CvMat* point_counts2 = cvCreateMat(successes, 1, CV_32SC1); 


// Transfer the points into the correct size matrices 
for(int i = 0; i < successes*board_n; ++i){ 
    CV_MAT_ELEM(*image_points2, float, i, 0) = CV_MAT_ELEM(*image_points, float, i, 0); 
    CV_MAT_ELEM(*image_points2, float, i, 1) = CV_MAT_ELEM(*image_points, float, i, 1); 
    CV_MAT_ELEM(*object_points2, float, i, 0) = CV_MAT_ELEM(*object_points, float, i, 0); 
    CV_MAT_ELEM(*object_points2, float, i, 1) = CV_MAT_ELEM(*object_points, float, i, 1); 
    CV_MAT_ELEM(*object_points2, float, i, 2) = CV_MAT_ELEM(*object_points, float, i, 2); 
} 

for(int i=0; i < successes; ++i){ 
    CV_MAT_ELEM(*point_counts2, int, i, 0) = CV_MAT_ELEM(*point_counts, int, i, 0); 
} 
cvReleaseMat(&object_points); 
cvReleaseMat(&image_points); 
cvReleaseMat(&point_counts); 

CV_MAT_ELEM(*intrinsic_matrix, float, 0, 0) = 1.0; 
CV_MAT_ELEM(*intrinsic_matrix, float, 1, 1) = 1.0; 

cvCalibrateCamera2(object_points2, image_points2, point_counts2, cvGetSize(image1), 
    intrinsic_matrix, distortion_coeffs, NULL, NULL, CV_CALIB_FIX_ASPECT_RATIO); 

cvSave("Intrinsics.xml", intrinsic_matrix); 
cvSave("Distortion.xml", distortion_coeffs); 

// Example of loading these matrices back in 
CvMat *intrinsic = (CvMat*)cvLoad("Intrinsics.xml"); 
CvMat *distortion = (CvMat*)cvLoad("Distortion.xml"); 

IplImage* mapx = cvCreateImage(cvGetSize(image1), IPL_DEPTH_32F, 1); 
IplImage* mapy = cvCreateImage(cvGetSize(image1), IPL_DEPTH_32F, 1); 
cvInitUndistortMap(intrinsic, distortion, mapx, mapy); 

cvNamedWindow("Undistort"); 

while(image1){ 
    IplImage *t = cvCloneImage(image1); 
    cvShowImage("Calibration", image); // Show raw image 
    cvRemap(t, image1, mapx, mapy); // undistort image 
    cvReleaseImage(&t); 
    cvShowImage("Undistort", image1); // Show corrected image 

    } 
} 

return 0; 

}

Я использую код блоков 10,05 и OpenCV 2.3.0, Mingw GNU GCC компилятор ..

ответ

1

Цифровые камеры, такие как Casio Exilim EX-Z77, обычно выполняют определенное количество коррекции изображения в камере.

Что касается нескольких изображений, которые вы используете, на практике вам нужно только один, чтобы найти искажения. Для получения дополнительной информации об этой процедуре с помощью проверки OpenCV this answer.

EDIT:

Поскольку вы упомянули сшивание изображения, OpenCV started to support this feature on version 2.2:

OpenCV 2.2 выпущен! тизеры уже далеко вдоль после этого выпуска: Панорамная Строчка

На эту тему, это interesting post акции некоторых source code.

+0

В зависимости от того, что вы пытаетесь сделать с параметрами, не имеет значения, исправлено ли уже исправление. Вам просто нужно подумать, что вы определяете параметры для всей камеры, а не только для ее оптики. Прошло некоторое время с тех пор, как я коснулся OpenCV в университете, но я всегда использовал более одного шахматного изображения для калибровки. Просто было намного более точно таким образом, особенно. без прекрасного освещения и прочее. – Mario

+0

Благодарим вас за немедленный ответ .. на самом деле я думал о том же ... что цифровые камеры предварительно откалиброваны перед продажей на рынок. , Но проблема в том, что я работаю над проектом. Это строчка изображения. Пример в списке рассылки opencv требует, чтобы камера была откалибрована, чтобы выполнить успешное изображение изображения. Надеюсь, вы получите то, что я говорю. – njm

+0

Вам нужно только калибровать камеру с помощью OpenCV, если захваченное изображение искажено. Это явно не так с вашей камерой. Но тот, кто опубликовал этот пример, должен был решить эту проблему. Вам не нужно делать этот шаг. – karlphillip

Смежные вопросы