How to Calibrate a Camera with OpenCV?

How to Calibrate a Camera with OpenCV: A Complete Guide

Welcome to our tutorial on camera calibration using OpenCV, a powerful tool in computer vision applications, particularly in the fields of robotics and augmented reality. In this blog, we will walk through the process of extracting frames from a video, detecting checkerboard patterns (used for calibration), and finally, calibrating the camera.

What is Camera Calibration?

Camera calibration is the process of estimating the parameters of the lens and the image sensor of a camera to improve the accuracy of capturing images. These parameters can be used to correct lens distortion, measure the size of an object in the world units, or determine the location of the camera in the scene.

The Code Breakdown

Our Python script uses OpenCV to perform camera calibration with the following steps:

  1. Extract Frames from a Video
  2. Find Checkerboard Corners
  3. Calibrate the Camera
1. Extract Frames from a Video

The function extract_frames reads a video file and extracts frames at a specified interval (skip_frames).

python 复制代码
def extract_frames(video_path, skip_frames=30):
    cap = cv2.VideoCapture(video_path)
    frames = []
    idx = 0
    
    while True:
        ret, frame = cap.read()
        if not ret:
            break
        if idx % skip_frames == 0:
            frames.append(frame)
        idx += 1
    
    cap.release()
    return frames
2. Find Checkerboard Corners

We use the find_checkerboard_corners function to detect the corners of a checkerboard pattern in each frame. This pattern is crucial for calibration as it provides a known geometry to compare against.

python 复制代码
def find_checkerboard_corners(frames, checkerboard_size=(9, 13)):
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
    objpoints = []
    imgpoints = []
    
    objp = np.zeros((checkerboard_size[0] * checkerboard_size[1], 3), np.float32)
    objp[:, :2] = np.mgrid[0:checkerboard_size[0], 0:checkerboard_size[1]].T.reshape(-1, 2)

    for _, frame in enumerate(tqdm(frames)):
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        ret, corners = cv2.findChessboardCorners(gray, checkerboard_size, None)
        
        if ret:
            objpoints.append(objp)
            corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
            imgpoints.append(corners2)
    
    return objpoints, imgpoints, gray.shape[::-1]
3. Calibrate the Camera

With the object and image points obtained from the checkerboard, the calibrate_camera function estimates the camera parameters.

python 复制代码
def calibrate_camera(objpoints, imgpoints, frame_shape):
    ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, frame_shape, None, None)
    return mtx, dist

Conclusion

Once the calibration is done, the camera matrix and distortion coefficients are printed. These parameters allow you to correct images taken from this camera, enhance accuracy in measurement applications, and perform numerous other computer vision tasks.

Camera calibration is a fundamental step in any serious computer vision work. By accurately determining the camera's intrinsic and extrinsic parameters, one can significantly improve the output and accuracy of their vision algorithms. Whether you're developing a robot's vision system or creating a 3D model from images, understanding how to calibrate a camera is essential.

Feel free to use this code as a starting point for your camera calibration needs and adapt it to different patterns or calibration methods as required.

Sample Code

python 复制代码
import cv2
import numpy as np
from tqdm import tqdm

def extract_frames(video_path, skip_frames=30):
    """ Extract frames from a video file """
    cap = cv2.VideoCapture(video_path)
    frames = []
    idx = 0
    
    while True:
        ret, frame = cap.read()
        if not ret:
            break
        if idx % skip_frames == 0:
            frames.append(frame)
        idx += 1
    
    cap.release()
    return frames

def find_checkerboard_corners(frames, checkerboard_size=(9, 13)):
    """ Find and refine checkerboard corners in a list of frames """
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
    objpoints = []  # 3D points in real world space
    imgpoints = []  # 2D points in image plane
    
    objp = np.zeros((checkerboard_size[0] * checkerboard_size[1], 3), np.float32)
    objp[:, :2] = np.mgrid[0:checkerboard_size[0], 0:checkerboard_size[1]].T.reshape(-1, 2)

    for _,frame in enumerate(tqdm(frames)):
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        ret, corners = cv2.findChessboardCorners(gray, checkerboard_size, None)
        
        if ret:
            objpoints.append(objp)
            corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
            imgpoints.append(corners2)
    
    return objpoints, imgpoints, gray.shape[::-1]

def calibrate_camera(objpoints, imgpoints, frame_shape):
    """ Calibrate the camera given object points, image points, and the shape of the frames """
    ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, frame_shape, None, None)
    return mtx, dist

# Path to your video file
video_path = '20240509_155345.mp4'

# Extract frames from the video
frames = extract_frames(video_path, skip_frames=10)
print("frames: ",len(frames))

# Find checkerboard corners
objpoints, imgpoints, frame_shape = find_checkerboard_corners(frames)
print('valid frames: ', len(objpoints))

# Calibrate the camera
camera_matrix, dist_coeffs = calibrate_camera(objpoints, imgpoints, frame_shape)

# camera_matrix = np.round(camera_matrix,8)
# dist_coeffs = np.round(dist_coeffs, 8)
print("Camera matrix:")
print(camera_matrix)
print("Distortion coefficients:")
print(dist_coeffs)

cal_param=f'''
Camera1.fx: {camera_matrix[0,0]:.8f}
Camera1.fy: {camera_matrix[1,1]:.8f}
Camera1.cx: {camera_matrix[0,2]:.8f}
Camera1.cy: {camera_matrix[1,2]:.8f}

Camera1.k1: {dist_coeffs[0,0]:.8f}
Camera1.k2: {dist_coeffs[0,1]:.8f}
Camera1.p1: {dist_coeffs[0,2]:.8f}
Camera1.p2: {dist_coeffs[0,3]:.8f}
Camera1.k3: {dist_coeffs[0,4]:.8f}
'''
print(cal_param)

Checkerboards Download

https://markhedleyjones.com/projects/calibration-checkerboard-collection

相关推荐
小白巨白几秒前
玫瑰花园管理系统:AI识病+3D可视化,一套面向中小型玫瑰种植园的数字化管理工具
css·人工智能·计算机视觉·html5
延凡科技22 分钟前
多场景落地复盘:端边云架构无人机智能巡检系统设计与实践
大数据·数据结构·人工智能·科技·架构·无人机·能源
科技圈观察30 分钟前
壹沓科技WAIC全球首发小沓OS与小沓KE,重塑供应链AI基础设施
人工智能·科技
CV-Climber1 小时前
检索技术的实际应用
人工智能·算法
颜酱1 小时前
01 | 骨架搭建:FastAPI + Vue 跑通第一个 SSE 流式问答
前端·人工智能·后端
龙腾AI白云1 小时前
世界模型被视为破局关键
人工智能·virtualenv·知识图谱·pygame
新知图书1 小时前
10.1 项目背景与需求分析(智能客服智能体开发)
人工智能·agent·ai agent·智能体·扣子
ifenxi爱分析1 小时前
爱分析最新报告解读:AI数据基础设施与数据中台的区别
大数据·人工智能
hhzz1 小时前
Tiger AI Platform平台中增加人脸识别功能
图像处理·人工智能·算法·计算机视觉·大模型
阿里云大数据AI技术2 小时前
Search Lake:ES x Paimon 让湖上多模态数据可搜可用
人工智能·elasticsearch·搜索引擎