Nhận diện hình ảnh _ Một số hàm Camera Calibration trong OpenCV

No Comments

Nhận diện hình ảnh _ Một số hàm Camera Calibration trong OpenCV

  1. Một số hàm Camera Calibration trong OpenCV Sử dụng bàn cờ như sau:

–    Hàm xác định vị trí các góc của bàn cờ:

int cvFindChessboardCorners(

const void* image,

CvSize patternSize, CvPoint2D32f* corners, int* cornerCount=NULL,

int flags=CV_CALIB_CB_ADAPTIVE_THRESH)

–    Vẽ các góc trên bàn cờ:

void cvDrawChessboardCorners(

CvArr*      image,

CvSize        pattern_size,

CvPoint2D32f* corners,

int              count,

int          pattern_was_found);

–    Tính các tham số intrinsic và extrinsic của camera:

void cvCalibrateCamera2( CvMat*

object_points, CvMat*

image_points, int*

point_counts, CvSize

image_size, CvMat*

intrinsic_matrix,

CvMat*   distortion_coeffs,

CvMat*   rotation_vectors   = NULL,

CvMat*   translation_vectors = NULL,

int      flags              = 0);

–    Tính undistortion map:

void cvInitUndistortMap(

const CvMat* cameraMatrix,

const CvMat* distCoeffs, CvArr* map1,

CvArr* map2);

2.  Tính các tham số intrinsic và extrinsic của camera Cho tập ảnh bàn cờ sau:

(http://courses.fit.hcmus.edu.vn/file.php/1893/Checkerboard.rar)

2.1.   Xác định các điểm góc trên ảnh bàn cờ:

while(done!=-1)
{
char path[200];
strcpy(path, search_dir);
strcat(path, fileinfo.name);

//Load image from folder
image = cvLoadImage(path, 1);
cvShowImage("Original Image",image);
gray_image = cvCreateImage( cvGetSize( image ), 8, 1 );

// Find chessboard corners: 

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

30, 0.1 ));
 
// 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, 

// 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++;
}
cvWaitKey(500);
done = _findnext( handle, &fileinfo );
}

Đoạn code sẽ lần lượt load các ảnh trong thư mục có đường dẫn là

search_dir. Với mỗi ảnh sẽ tiến hành tìm các điểm góc.

2.2.  Tìm các tham số intrinsic và extrinsic

// Calibrate the camera
cvCalibrateCamera2( object_points2, image_points2, point_counts2,
cvGetSize( image ), intrinsic_matrix, distortion_coeffs, NULL, NULL, CV_CALIB_FIX_ASPECT_RATIO );

// Save the intrinsics and distortions
cvSave( "Intrinsics.xml", intrinsic_matrix );
cvSave( "Distortion.xml", distortion_coeffs );
  1. Bài tập

–    Từ tập các ảnh bàn cờ (http://courses.fit.hcmus.edu.vn/file.php/1893/Checkerboard.rar ) tìm các điểm góc và tính các tham số intrinsic và extrinsic.

–    Hiển thị ảnh Undistort.

Sản phẩm được quan tâm

Nhận bài viết mới

Các bài viết chia sẻ đến cộng đồng rất chât lượng, mang lại rất nhiều kiến thức mới. Đừng bỏ lỡ bất kỳ bài viết nào của chung tối, hãy đăng ký để nhận bài viết mới qua Mail của bạn

Đăng ký để không bỏ lỡ bài viết nào!

Fields marked with an * are required

Danh mục




More from our blog

See all posts
No Comments
 

Leave a Comment