Nhận diện hình ảnh _ Một số hàm Camera Calibration trong OpenCV
- 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 );
-
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!
Bài mới
- Giáo trình Robocon
- Giới thiệu các loại board Esp8266 dành cho IoT và thiết lập cơ bản cho người mới học
- Hướng dẫn sử dụng LoraEasyV1
- Tài liệu tự học Python tiếng Việt cho người mới bắt đầu
- Tương lai của kết nối IoT (Internet of Things) tiềm năng và sự đa dạng
- HƯỚNG DẪN LẤP RÁP XE MÔ HÌNH 4 BÁNH
- HƯỚNG DẪN LẮP RÁP XE CHẠY BẰNG NĂNG LƯỢNG MẶT TRỜI
Danh mục