【计算机视觉】基于Python的相机标定项目Camera-Calibration深度解析

在这里插入图片描述

基于Python的相机标定项目Camera-Calibration深度解析

    • 1. 项目概述
      • 技术核心
    • 2. 技术原理与数学模型
      • 2.1 相机模型
      • 2.2 畸变模型
    • 3. 实战指南:项目运行与标定流程
      • 3.1 环境配置
      • 3.2 数据准备
      • 3.3 执行步骤
      • 3.4 结果验证
    • 4. 常见问题与解决方案
      • 4.1 角点检测失败
      • 4.2 标定结果异常
      • 4.3 运行时错误
    • 5. 相关论文与技术演进
      • 5.1 经典论文
      • 5.2 前沿方向
    • 6. 项目扩展建议
      • 6.1 功能增强
      • 6.2 性能优化

1. 项目概述

Camera-Calibration是一个基于Python和OpenCV实现的相机标定工具,旨在通过张正友标定法(Zhang’s Method)计算相机的内参矩阵、畸变系数和外参参数。该项目适用于计算机视觉、机器人导航、增强现实(AR)等领域,能够有效校正镜头畸变并建立图像像素坐标与真实世界坐标的映射关系。

技术核心

  • 张正友标定法:通过多视角棋盘格图像计算相机参数,具有高精度和低实现复杂度的特点。
  • OpenCV集成:利用findChessboardCorners检测棋盘格角点,通过calibrateCamera进行参数优化。
  • 非线性优化:采用Levenberg-Marquardt算法最小化重投影误差,确保标定结果的准确性。

2. 技术原理与数学模型

2.1 相机模型

相机的成像模型基于小孔成像原理,数学表达为:
s [ u v 1 ] = [ f x 0 c x 0 f y c y 0 0 1 ] [ r 11 r 12 r 13 t x r 21 r 22 r 23 t y r 31 r 32 r 33 t z ] [ X w Y w Z w 1 ] s \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} r_{11} & r_{12} & r_{13} & t_x \\ r_{21} & r_{22} & r_{23} & t_y \\ r_{31} & r_{32} & r_{33} & t_z \end{bmatrix} \begin{bmatrix} X_w \\ Y_w \\ Z_w \\ 1 \end{bmatrix} s uv1 = fx000fy0cxcy1 r11r21r31r12r22r32r13r23r33txtytz XwYwZw1
其中:

  • ( u , v ) (u, v) (u,v)为像素坐标, ( X w , Y w , Z w ) (X_w, Y_w, Z_w) (Xw,Yw,Zw)为世界坐标
  • f x , f y f_x, f_y fx,fy为焦距, ( c x , c y ) (c_x, c_y) (cx,cy)为主点坐标
  • r i j r_{ij} rij t i t_i ti构成旋转矩阵和平移向量(外参)

2.2 畸变模型

径向畸变和切向畸变的校正公式:
x c o r r e c t e d = x ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + 2 p 1 x y + p 2 ( r 2 + 2 x 2 ) y c o r r e c t e d = y ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + p 1 ( r 2 + 2 y 2 ) + 2 p 2 x y \begin{aligned} x_{corrected} &= x(1 + k_1 r^2 + k_2 r^4 + k_3 r^6) + 2p_1 xy + p_2(r^2 + 2x^2) \\ y_{corrected} &= y(1 + k_1 r^2 + k_2 r^4 + k_3 r^6) + p_1(r^2 + 2y^2) + 2p_2 xy \end{aligned} xcorrectedycorrected=x(1+k1r2+k2r4+k3r6)+2p1xy+p2(r2+2x2)=y(1+k1r2+k2r4+k3r6)+p1(r2+2y2)+2p2xy
其中 k 1 , k 2 , k 3 k_1, k_2, k_3 k1,k2,k3为径向畸变系数, p 1 , p 2 p_1, p_2 p1,p2为切向畸变系数。


3. 实战指南:项目运行与标定流程

3.1 环境配置

# 依赖安装
pip install opencv-python numpy matplotlib

3.2 数据准备

  1. 标定板要求
    • 使用棋盘格(如9×6内角点),打印时需保证1:1比例且平整
    • 每个方格的物理尺寸需精确测量(例如25mm×25mm)
  2. 图像采集
    • 在不同角度、距离下拍摄15-20张图像(覆盖画面中心与边缘)
    • 示例代码自动检测有效图像:
      images = glob.glob('calib_images/*.jpg')
      

3.3 执行步骤

import cv2
import numpy as np# 初始化参数
CHECKERBOARD = (9, 6)  # 内角点行列数
objpoints = []  # 3D点
imgpoints = []  # 2D点# 生成世界坐标系点
objp = np.zeros((CHECKERBOARD[0]*CHECKERBOARD[1], 3), np.float32)
objp[:, :2] = np.mgrid[0:CHECKERBOARD[0], 0:CHECKERBOARD[1]].T.reshape(-1, 2)for fname in images:img = cv2.imread(fname)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)ret, corners = cv2.findChessboardCorners(gray, CHECKERBOARD, None)if ret:objpoints.append(objp)corners_refined = cv2.cornerSubPix(gray, corners, (11,11), (-1,-1), (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001))imgpoints.append(corners_refined)# 标定相机
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)

3.4 结果验证

# 校正测试图像
img = cv2.imread('test.jpg')
h, w = img.shape[:2]
newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w,h), 1, (w,h))
dst = cv2.undistort(img, mtx, dist, None, newcameramtx)# 计算重投影误差
mean_error = 0
for i in range(len(objpoints)):imgpoints2, _ = cv2.projectPoints(objpoints[i], rvecs[i], tvecs[i], mtx, dist)error = cv2.norm(imgpoints[i], imgpoints2, cv2.NORM_L2)/len(imgpoints2)mean_error += error
print(f"重投影误差: {mean_error/len(objpoints):.2f} 像素")

合格标准:误差应小于1.0像素,理想值在0.5像素以下。


4. 常见问题与解决方案

4.1 角点检测失败

  • 现象findChessboardCorners返回False
  • 原因与解决
    1. 棋盘格尺寸错误:确认CHECKERBOARD设置为内角点数(实际方格数-1)
    2. 图像模糊/反光:调整光照,确保棋盘格清晰可见
    3. 边缘未完全显示:至少需完整显示全部内角点

4.2 标定结果异常

  • 焦距值过大(如fx=42880):
    • 检查物理尺寸单位是否错误(例如将毫米误设为米)
    • 增加图像多样性,覆盖不同视角
  • 畸变校正无效
    • 确认dist系数已正确应用
    • 尝试启用CALIB_RATIONAL_MODEL以支持高阶畸变模型

4.3 运行时错误

# 错误:Assertion failed (dims == 2 && ...)
# 解决:检查objpoints和imgpoints维度一致性
assert len(objpoints) == len(imgpoints), "数据对数量不匹配"

5. 相关论文与技术演进

5.1 经典论文

  1. 张正友标定法(2000):

    • 提出基于平面模板的灵活标定方法,成为OpenCV实现的基础
    • 论文标题:A Flexible New Technique for Camera Calibration
  2. 多传感器标定(2019):

    • 悉尼大学ACFR实验室改进VOQ策略,提升标定鲁棒性

5.2 前沿方向

  • 在线标定:通过SLAM实时更新相机参数
  • 深度学习标定:使用CNN直接估计畸变参数(如DeepCalib)
  • 多相机协同标定:适用于自动驾驶多视角系统

6. 项目扩展建议

6.1 功能增强

  • 自动化数据筛选:根据角点检测质量自动过滤低质量图像
  • GUI交互界面:集成PyQt实现参数可视化调整
  • ROS支持:与camera_calibration包对接,实现标定结果实时发布

6.2 性能优化

  • GPU加速:使用CUDA加速角点检测与图像校正
  • 多线程处理:并行处理图像加载与角点细化

通过本项目实践,开发者不仅能掌握相机标定的核心算法,还能深入理解计算机视觉系统的几何建模原理。结合重投影误差分析与参数优化策略,可进一步提升视觉应用的精度与鲁棒性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/79969.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多光谱影像:解锁遥感奥秘的 “彩色钥匙”

在遥感领域,多光谱影像犹如一把神奇的 “彩色钥匙”,为我们开启洞察地球表面与大气层的全新视角。 图片来源于星图云开放平台 多光谱影像,顾名思义,就是利用遥感平台上的多光谱传感器,同时对地球目标地物在多个不同光谱…

【ROS2】ROS节点启动崩溃:rclcpp::exceptions::RCLInvalidArgument

1、问题描述 启动ROS节点时,直接崩溃,打印信息如下: terminate called after throwing an instance of rclcpp::exceptions::RCLInvalidArgumentwhat(): failed to create guard condition: context argument is null, at ./src/rcl/guard_condition.c:65 [ros2run]: Abo…

MinerU安装(pdf转markdown、json)

在Windows上安装MinerU,参考以下几个文章,可以成功安装,并使用GPU解析。 整体安装教程: MinerU本地化部署教程——一款AI知识库建站的必备工具 其中安装conda的教程: 一步步教你在 Windows 上轻松安装 Anaconda以及使…

aws 实践创建policy + Role

今天Cyber 通过image 来创建EC2 的时候,要添加policy, 虽然是administrator 的role, 参考Cyber 提供的link: Imageshttps://docs.cyberark.com/pam-self-hosted/14.2/en/content/pas%20cloud/images.htm#Bring 1 Step1:

【ROS2】编译Qt实现的库,然后链接该库时,报错:/usr/bin/ld: XXX undefined reference to `vtable for

1、问题描述 在ROS2工程中,编译使用Qt实现的库,在其它ROS2包链接该库时,报错: /usr/bin/ld: XXX undefined reference to `vtable for2、原因分析 查看链接失败的几个函数接口都是,信号函数(signals 标记的函数)。因为信号函数都只有定义,没有实现,在执行ROS2 colc…

数据库--处理模型(Processing Model)(二)

执行查询的方法有很多,接下来将介绍以更高效和更有效率的方式执行分析工作负载(在OLAP系统中)的不同技术,包括以下内容: 执行并行性(Execution Parallelism)执行引擎(Execution Engines)执行操作符输出(Execution Operator Output)中间数据表示(Intermediate Data …

PostgreSQL pgrowlocks 扩展详解

一、简介 pgrowlocks 是 PostgreSQL 官方提供的扩展模块,用于查看指定表中每一行当前的行级锁(Row Lock)信息。它非常适用于: 并发冲突排查行级锁等待分析死锁前兆探测热点数据行分析 二、安装与启用 1. 安装前提(…

关于xammp数据库打开不了,但是日志没错误的问题解决以及其数据库的备份

这里参考了两篇文章 解决Xampp中mysql无法启动的问题_xampp里面mysql的stop启动不起来-CSDN博客 mysqli_real_connect(): (HY000/1045): Access denied for user ‘root‘‘localhost‘ (using password: YES-CSDN博客 相信很多和我一样,很久没登xammp突然数据库…

在UI 原型设计中,交互规则有哪些核心要素?

在UI 原型设计中,交互规则主要有三个核心要素,分别为重要性、原则与实践,具体表现在: 一、交互规则在 UI 原型设计中的重要性 明确交互逻辑:设计阶段制定交互规则,清晰定义界面元素操作响应。 如社交应用…

BFD与VRRP联动

一、概述 在前面的文章我们学习了VRRP与BFD协议,VRRP(虚拟路由冗余协议)的主要特点是当Master(主)设备出现故障时,Backup(备用)设备能够快速接替Master的转发工作,尽量缩短数据流的中断时间。 在没有采用BFD与VRRP联动机制前,当Master出现故障时,VRRP依靠Backup设置的超时时间来…

Protobuf3协议关键字详解与应用实例

一、核心语法与基础关键字 syntax 声明协议版本,必须为文件的第一行非空、非注释内容。 syntax "proto3"; // 显式指定proto3语法,否则编译器默认使用proto2message 定义消息类型,包含一组结构化字段。支持嵌套消息定义&#xff…

如何在线免费压缩PDF文档?

PDF文件太大,通常是因为内部嵌入字体和图片。怎么才能将文件大小减减肥呢,主要有降低图片清晰度和去除相关字体两个方向来实现文档效果。接下来介绍三个免费压缩PDF实用工具。 (一)iLoveOFD在线转换工具 iLoveOFD在线转换工具&a…

NSSCTF [GFCTF 2021]where_is_shell

889.[GFCTF 2021]where_is_shell(system($0)64位) [GFCTF 2021]where_is_shell (1) 1.准备 motalymotaly-VMware-Virtual-Platform:~$ file shell shell: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.s…

深度学习中的提示词优化:梯度下降全解析

深度学习中的提示词优化:梯度下降全解析 在您的代码中,提示词的更新方向是通过梯度下降算法确定的,这是深度学习中最基本的优化方法。 一、梯度下降与更新方向 1. 核心公式 对于可训练参数 θ \theta θ(这里是提示词嵌入向量),梯度下降的更新公式为:

win10电脑无法访问局域网内其他共享电脑文件的问题

一、启用本地计算机guest来宾账户 操作步骤 点击桌面上的“此电脑”图标,再点击“管理” 在“计算机管理”界面依次点击“系统工具”“本地用户和组”“用户” 再点击右侧的“Guest”,在弹出的对话框中点击“属性” 在“Guest属性”界面取消勾选“账户已…

会计要素+借贷分录+会计科目+账户,几个银行会计的重要概念

1.借贷分录还是借贷分路 正确表述是“借贷分录”。 “分录”即会计分录,它是指预先确定每笔经济业务所涉及的账户名称,以及计入账户的方向和金额的一种记录,简称分录。 在借贷记账法下,会计分录通过“借”和“贷”来表示记账方向…

AI日报 · 2025年5月15日|GPT-4.1 登陆 ChatGPT

AI日报 2025年5月15日|GPT-4.1 登陆 ChatGPT 1、OpenAI 在 ChatGPT 全面开放 GPT-4.1 与 GPT-4.1 mini 北京时间 5 月 14 日晚,OpenAI 在官方 Release Notes 中宣布:专为复杂代码与精细指令场景打造的 GPT-4.1 正式加入 ChatGPT&#xff0…

π0: A Vision-Language-Action Flow Model for General Robot Control

TL;DR 2024 年 Physical Intelligence 发布的 VLA 模型 π0,基于 transformer 流匹配(flow matching)架构,当前开源领域最强的 VLA 模型之一。 Paper name π0: A Vision-Language-Action Flow Model for General Robot Contr…

Java详解LeetCode 热题 100(17):LeetCode 41. 缺失的第一个正数(First Missing Positive)详解

文章目录 1. 题目描述2. 理解题目3. 解法一:排序法(不满足题目要求)3.1 思路3.2 Java代码实现3.3 代码详解3.4 复杂度分析3.5 不足之处 4. 解法二:哈希表法4.1 思路4.2 Java代码实现4.3 代码详解4.4 复杂度分析4.5 不足之处 5. 解…

第九讲 | 模板进阶

模板进阶 一、非类型模板参数1、模板参数的分类2、应用场景3、array4、注意 二、模板的特化1、概念2、函数模板特化3、类模板特化(1)、全特化:全部模板参数都特化成具体的类型(2)、偏/半特化:部分模板参数特…