Atlas Robotics
CameraTrung bình

Hiệu chuẩn Camera (Camera Calibration): vì sao ảnh cần "nắn" lại

Atlasbot · 18/8/2026 · 11 phút đọc

Hiệu chuẩn Camera (Camera Calibration): vì sao ảnh cần "nắn" lại
Hiệu chuẩn camera dùng bàn cờ để tìm tham số méo ống kính

Ảnh chụp qua ống kính không bao giờ hoàn toàn "thẳng" — đường thẳng trong thực tế có thể hơi cong trên ảnh, đặc biệt ở camera góc rộng. Với ứng dụng chỉ cần nhận diện vật thể, sai lệch nhỏ này thường không đáng kể. Nhưng khi cần đo khoảng cách hoặc kích thước thật từ ảnh (stereo vision, AR marker, SLAM bằng camera), sai lệch này phải được hiệu chỉnh — đó là mục đích của Camera Calibration.

Khái niệm chính

Quá trình hiệu chuẩn tính ra 2 nhóm tham số:

  • Ma trận nội tại (intrinsic matrix) — tiêu cự (focal length) và tâm quang học (optical center) của chính ống kính, đặc trưng riêng cho từng camera
  • Hệ số méo (distortion coefficients) — mô tả độ cong do ống kính gây ra (méo hình thùng/gối thường gặp ở camera góc rộng), dùng để "nắn" ảnh về đúng hình học thật

Có tham số này, phần mềm có thể chuyển đổi qua lại giữa toạ độ pixel trên ảnh và toạ độ thực trong không gian — nền tảng bắt buộc cho stereo vision (ước lượng độ sâu từ 2 camera, đã học tương tự ở bài Camera trong AMR) hay các thuật toán SLAM dùng camera.

Nguyên lý hoạt động

Cách phổ biến nhất là in một bàn cờ (checkerboard) kích thước ô vuông đã biết trước, chụp nó từ nhiều góc độ khác nhau, rồi để công cụ tự tính toán tham số dựa trên các góc bàn cờ phát hiện được trên từng ảnh.

ros2 run camera_calibration cameracalibrator \
  --size 8x6 --square 0.024 \
  --ros-args -r image:=/camera/image_raw

--size 8x6 là số góc trong (không phải số ô vuông) theo chiều ngang×dọc của bàn cờ; --square 0.024 là kích thước cạnh mỗi ô vuông tính bằng mét, phải đo chính xác bằng thước. Công cụ sẽ yêu cầu di chuyển bàn cờ qua nhiều vị trí/góc nghiêng khác nhau trong khung hình cho đến khi đủ dữ liệu, sau đó xuất ra file YAML chứa ma trận nội tại và hệ số méo — file này được nạp lại mỗi lần khởi động node camera để tự động nắn ảnh.

Kiến thức kỹ thuật

Công thức

Ma trận nội tại có dạng chuẩn, tiêu cự tính bằng đơn vị pixel liên hệ trực tiếp với tiêu cự vật lý và kích thước cảm biến:

Ma trận nội tại K:
| fx  0   cx |
| 0   fy  cy |
| 0   0   1  |

fx, fy = tiêu cự theo trục x, y (pixel)
cx, cy = toạ độ tâm quang học (thường gần giữa ảnh)

Liên hệ tiêu cự pixel với tiêu cự vật lý:
fx (pixel) = f (mm) × (Chiều_rộng_ảnh_pixel / Chiều_rộng_cảm_biến_mm)

VD: tiêu cự vật lý 4mm, cảm biến rộng 5mm, ảnh 640 pixel rộng
fx ≈ 4 × (640/5) = 512 pixel

Chuyển đổi từ toạ độ pixel sang toạ độ thực tế (dùng cho stereo vision, đã học công thức Z = f×B/d ở bài Camera trong AMR) đều dựa trên các tham số fx, fy, cx, cy này.

Thông số

Tình huốngCần hiệu chuẩn?
Chỉ nhận diện vật thể (object detection/tracking)Không bắt buộc
Stereo camera tính độ sâuBắt buộc
AR marker định vịBắt buộc
Visual SLAMBắt buộc

Ứng dụng thực tế

Nếu chỉ dùng camera để nhận diện vật thể (object detection) hoặc theo dõi (tracking) mà không cần đo khoảng cách/kích thước chính xác, có thể bỏ qua bước này. Hiệu chuẩn trở nên cần thiết khi: dùng stereo camera để tính độ sâu (áp dụng trực tiếp công thức Z = f×B/d đã học ở bài Camera trong AMR, trong đó f chính là tiêu cự pixel tính từ hiệu chuẩn), dùng AR marker để định vị, hoặc chạy visual SLAM.

Ví dụ thực tế

import numpy as np
import cv2

# Sau khi hieu chuan, doc lai file yaml chua tham so
camera_matrix = np.array([[512.0, 0, 320.0],
                            [0, 512.0, 240.0],
                            [0, 0, 1]])
dist_coeffs = np.array([0.05, -0.1, 0, 0, 0])  # tham so meo (vi du)

frame = cv2.imread("raw_frame.jpg")
undistorted = cv2.undistort(frame, camera_matrix, dist_coeffs)

cv2.imwrite("undistorted_frame.jpg", undistorted)
print("Da nan anh, luu ket qua")
Ảnh trước hiệu chuẩn (raw_frame.jpg): đường thẳng thực tế (VD: cạnh cửa,
kệ hàng thẳng) hiện hơi cong ở gần rìa khung hình

Ảnh sau hiệu chuẩn (undistorted_frame.jpg): đường thẳng giữ đúng thẳng
trên toàn bộ khung hình, sẵn sàng cho các phép đo khoảng cách chính xác

Lỗi thường gặp

  • Bỏ qua hiệu chuẩn khi triển khai stereo vision hoặc visual SLAM — như bảng Thông số, đây là bước bắt buộc, thiếu nó khiến mọi phép đo khoảng cách/kích thước sai lệch có hệ thống.
  • Đo sai kích thước ô vuông bàn cờ khi hiệu chuẩn — tham số --square sai trực tiếp làm sai toàn bộ ma trận nội tại tính ra, ảnh hưởng dây chuyền tới mọi phép đo sau này.
  • Chụp bàn cờ chỉ từ một góc/khoảng cách duy nhất — không đủ đa dạng dữ liệu để công cụ ước lượng chính xác hệ số méo, đặc biệt ở vùng rìa khung hình nơi méo rõ rệt nhất.
  • Hiệu chuẩn lại mỗi lần khởi động thay vì lưu và tái sử dụng — hiệu chuẩn là bước chuẩn bị một lần cho mỗi camera (trừ khi thay đổi zoom/tiêu cự vật lý), không cần lặp lại mỗi phiên chạy.

Kết luận

Camera Calibration là bước chuẩn bị một lần cho mỗi camera, không phải làm lại mỗi lần chạy — nhưng bắt buộc phải có nếu ứng dụng cần suy ra khoảng cách hoặc kích thước thật từ ảnh, thay vì chỉ nhận diện "có vật gì đó trong khung hình". Tham số tiêu cự tính ra từ hiệu chuẩn chính là đầu vào trực tiếp cho công thức stereo vision đã học ở bài Camera trong AMR. Đây là bài cuối của chuyên mục Camera — chuyên mục IMU tiếp theo đi vào cảm biến quán tính, một mảnh ghép cảm biến khác của AMR.

Hiệu chuẩn Camera (Camera Calibration): vì sao ảnh cần "nắn" lại — Atlasbot