计算机视觉 相机标定

2023-10-30

目录

一.相机标定原理:

1.相机标定简介:

2.求解原理:

2.1.针孔相机模型:

2.2.畸变现象:

2.3.像主点偏移:

2.4.单应性矩阵H:

二.相机标定策略:

2.1.相关策略:

2.2.棋盘格标定:

 三.实验内容:

1.实验数据:

2.实验代码:

3.实验结果:


一.相机标定原理:

1.相机标定简介:  

        在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。在大多数条件下这些参数必须通过实验与计算才能得到,这个求解参数的过程就称之为相机标定(或摄像机标定)。

目的:求出相机的内、外参数,以及畸变参数。

 作用: 1.是由于每个镜头的畸变程度各不相同,通过相机标定可以校正这种镜头畸变矫正畸变,生成矫正后的图像;2.是根据获得的图像重构三维场景。

畸变校正:

2.求解原理:

2.1.针孔相机模型:

 

2.2.畸变现象:

图像径向畸变 :

透镜质量原因
光线在 远离 透镜中心的地方比靠近中心的地方更加弯曲
桶状畸变:

 枕形畸变:

2.3.像主点偏移:

 

 2.4.单应性矩阵H:

 最大似然估计

使用最大似然估计进行优化。假设拍摄了n张棋盘格图像,每张图像有m个角点。最终获得的最大似然估计公式为:

二.相机标定策略:

2.1.相关策略

同步标定内部参数和外部参数,一般包括两种策略 :
1. 光学标定 : 利用已知的几何信息 ( 如定长棋盘格 ) 实现参数求解。
2. 自标定 : 在静态场景中利用 structure from motion 估算参数。

2.2.棋盘格标定:

优点:
仅需要平面标定板,拍摄若干张图片
标定板中的模式十分灵活,可以是棋盘格,也可以是其他几何结构已知的图形
实验结果表明具有很好的标定精度
具有很强的灵活性
相关流程:
1. 打印一张棋盘格 A4 纸张(黑白间距已知),并贴在一个平板上
2. 针对棋盘格拍摄若干张图片(一般 10-20 张)
3. 在图片中检测特征点(Harris 角点)
4. 根据角点位置信息及图像中的坐标,求解Homographic 矩阵
5. 利用解析解估算方法计算出 5 个内部参数,以及6 个外部参数
6. 根据极大似然估计策略,设计优化目标并实现 参数的refinement

 三.实验内容:

1.实验数据:

2.实验代码:

import cv2
import numpy as np
import glob

# 找棋盘格角点
# 棋盘格模板规格(内角点个数,内角点是和其他格子连着的点,如11 X 8)
w = 11
h = 8

# 世界坐标系中的棋盘格点,例如(0,0,0), (1,0,0), (2,0,0) ....,(8,5,0),去掉Z坐标,记为二维矩阵
objp = np.zeros((w * h, 3), np.float32)
objp[:, :2] = np.mgrid[0:w, 0:h].T.reshape(-1, 2)

# 储存棋盘格角点的世界坐标和图像坐标对
objpoints = []  # 在世界坐标系中的三维点
imgpoints = []  # 在图像平面的二维点

# 标定所用图像(路径不能有中文)

images = glob.glob('D:\\pythonProject\\computervision4\\picture\\*.jpg')

size = tuple()
for fname in images:
    img = cv2.imread(fname)

    # 修改图像尺寸,参数依次为:输出图像,尺寸,沿x轴,y轴的缩放系数,INTER_AREA在缩小图像时效果较好
    img = cv2.resize(img, None, fx=0.1, fy=0.1, interpolation=cv2.INTER_AREA)

    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 转灰度
    size = gray.shape[::-1]  # 矩阵转置

    # 找到棋盘格角点
    # 棋盘图像(8位灰度或彩色图像)  棋盘尺寸  存放角点的位置
    ret, corners = cv2.findChessboardCorners(gray, (w, h), None)

    # 角点精确检测
    # criteria:角点精准化迭代过程的终止条件(阈值)
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)

    # 执行亚像素级角点检测
    corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)

    objpoints.append(objp)
    imgpoints.append(corners2)

    # 将角点在图像上显示
    cv2.drawChessboardCorners(img, (w, h), corners2, ret)
    cv2.imshow('findCorners', img)
    cv2.waitKey(1000)

"""
标定、去畸变:
输入:世界坐标系里的位置 像素坐标 图像的像素尺寸大小 3*3矩阵,相机内参数矩阵 畸变矩阵
输出:标定结果 相机的内参数矩阵 畸变系数 旋转矩阵 平移向量
"""

ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, size, None, None)

# mtx:内参数矩阵
# dist:畸变系数
# rvecs:旋转向量 (外参数)
# tvecs :平移向量 (外参数)
print("ret:", ret)
print("内参数矩阵:\n", mtx, '\n')
print("畸变系数:\n", dist, '\n')
print("旋转向量(外参数):\n", rvecs, '\n')
print("平移向量(外参数):\n", tvecs, '\n')

# 去畸变
img2 = cv2.imread('D:\\pythonProject\\computervision4\\picture\\IMG_20220512_151929.jpg')
h, w = img2.shape[:2]

# 我们还可以使用cv.getOptimalNewCameraMatrix()优化内参数和畸变系数,
# 通过设定自由自由比例因子alpha。当alpha设为0的时候,
# 将会返回一个剪裁过的将去畸变后不想要的像素去掉的内参数和畸变系数;
# 当alpha设为1的时候,将会返回一个包含额外黑色像素点的内参数和畸变系数,并返回一个ROI用于将其剪裁掉
newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w, h), 0, (w, h))  # 自由比例参数

dst = cv2.undistort(img2, mtx, dist, None, newcameramtx)
# 根据前面ROI区域裁剪图片
x, y, w, h = roi
dst = dst[y:y + h, x:x + w]
cv2.imwrite('calibresult.jpg', dst)

# 反投影误差
# 通过反投影误差,我们可以来评估结果的好坏。越接近0,说明结果越理想。
total_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)
    total_error += error
print("total error: ", total_error / len(objpoints))

3.实验结果:

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算机视觉 相机标定 的相关文章

随机推荐

  • 哈夫曼树以及哈夫曼编码的构造步骤

    注意 哈夫曼树并不唯一 但带权路径长度一定是相同的 第一部分 由给定结点构造哈夫曼树 1 8个结点的权值大小如下 2 从19 21 2 3 6 7 10 32中选择两个权小结点 选中2 3 同时算出这两个结点的和5 3 从19 21 6 7
  • C# Json的添加方式

    json的几种添加方式 1 只能添加JProperty类的Object 可以一次性添加多个 Add方法添加只能针对于json中的第一层 第二层添加目前还无法得知 但是有其他方法进行弥补 string json ReqCode errcode
  • 【报错】Python:WARNING: You are using pip version 21.1.3; however, version 23.0.1 is available.

    想使用pip安装Scrapy时 报了这个错误 WARNING You are using pip version 21 1 3 however version 23 0 1 is available You should consider
  • 《深入理解Java虚拟机 3》类加载机制与字节码执行引擎

    本系列是用来记录 深入理解Java虚拟机 这本书的读书笔记 方便自己查看 也方便大家查阅 欲速则不达 欲达则欲速 第六章 类文件结构 讲完了自动内存管理 我们来说说执行子系统 执行子系统讲解的是JVM如何执行程序 Class文件概述 这篇我
  • QEMU-KVM基本操作

    本文主要介绍KVM虚拟机的一些基本实践操作 对KVM虚拟机的管理操作主要是基于libvirt的命令行工具virsh进行的 一 安装与启动 1 KVM模块检查 1 查看当前Linux系统核心是否包含KVM模块 Linux内核2 6 20及以上
  • Cookie和Session

    Cookie和Session Cookie是浏览器给HTTP协议提供的一个持久化存储数据的方案 由于当前浏览器站在安全的角度考虑 不敢让页面直接来访问文件系统 Cookie是存储的键值对 不能存复杂的对象 只能存字符串 Cookie是按照域
  • [每周知识碎片] 2

    使用DistributedDataParallel 在Ctrl C 退出后留下许多僵尸进程 kill之后显卡掉了 类似情况1 2 解决方法 使用 ps aux grep python 查看python进程 然后按照顺序执行 kill 9 P
  • pycharm问题一(No module named 'selenium')

    pycharm上搭建python selenium自动化测试环境 背景 小白刚尝试摸门 明明安装了selenium pycharm中还是报No module named selenium 1 首先 竟然报没有selenium 就安装呗 cm
  • 期货开户金融市场非常残酷

    大多数交易者喜欢从零基础开始他们的交易旅程 毕竟 对于它们来说 点击鼠标确认交易真的非常简单 这个数字时代使我们易于交易 交易过程看起来非常简单 但是金融市场却非常残酷 在交易市场当中 所谓的 聪明 根本没有用 市场会一次又一次地给予你教训
  • 计算机vcruntime140.dll丢失的解决方法,重新安装教程

    vcruntime140 dll是Microsoft Visual C Redistributable文件中的一个动态链接库 DLL 这个文件是由Microsoft开发的 用于支持C 编程语言的运行环境 vcruntime140 dll是W
  • Linux的设置地区

    2023年7月21日 周五上午 本来想试试把这篇文章设置成VIP可见的 因为我挺好奇设置了VIP可见后会发生什么 但后来想想觉得这有违自己写博客的初心 于是就放弃了 我写博客的初心就是传递其他人写博客的那种无私的分享精神 为社会 中文社区和
  • python同一文件内class类的调用

    class 类名 def init self self a None self b None def 函数 self x y self x x self y y A 类名 B 类名 A 函数 10 20 print B x B y 将会输出
  • python实现二分查找的四种变体

    本文用python3实现了二分查找的四种变体 一 查找第一个值等于给定值的元素 二 查找最后一个值等于给定值的元素 三 查找第一个大于等于给定值的元素 四 查找最后一个小于等于给定值的元素 python3 一 查找第一个值等于给定值的元素
  • git rebase

    目录 一 开发分支落后于主干分支 个人修复用的分支落后于被修复分支 模拟环境 开始rebase操作 二 本地分支落后于远程分支 多人共用一个分支的情况下其他人有提交 在本地模拟环境 熟悉的可以跳过 比较啰嗦 详细步骤 开始模拟情景 解决 u
  • 【Java学习笔记(一百零七)】之字节码执行引擎,栈帧结构

    本文章由公号 开发小鸽 发布 欢迎关注 老规矩 妹妹镇楼 一 字节码执行引擎 一 概述 物理机和虚拟机都有代码执行能力 物理机的执行引擎建立在处理器 缓存机 指令集和操作系统之上 而虚拟机的执行引擎则是由软件实现的 不会受到物理条件制约地定
  • 稀疏数组(尚硅谷课程的笔记)

    2 稀疏数组 文章来自于听了尚硅谷的课自己所敲 https www bilibili com video BV1E4411H73v p 10 2 1 稀疏数组 我们来看一个实际问题 此时就需要稀疏数组来压缩 稀疏数组基本介绍 当一个数组中大
  • pycharm配置解释器

    因为没有系统学习过pycharm的使用 所以在换了新电脑之后重新配置pycharm一头雾水 查了很多资料 此文用来自己记录 1 解释器选择 virtual Enviroment 第一个是虚拟解释器 我的理解是 直接从pycharm里下载一个
  • 安徽旅游可视化

    安徽旅游可视化 此系统有详细的录屏 下面只是部分截图 需要看完整录屏联系博主 系统开发语言python 框架为django 数据库mysql 分为爬虫和可视化分析
  • 没看错!selenium自动化集成REST api实践!

    01 问题 当我们描述一个 好的自动化测试用例 时 经常出现标准是 精确 自动化测试用例应该测试一件事 只有一件事 与测试用例无关的应用程序的某个部分中的错误不应导致测试用例失败 独立 自动化测试用例不应该受测试套件中任何其他测试用例影响
  • 计算机视觉 相机标定

    目录 一 相机标定原理 1 相机标定简介 2 求解原理 2 1 针孔相机模型 2 2 畸变现象 2 3 像主点偏移 2 4 单应性矩阵H 二 相机标定策略 2 1 相关策略 2 2 棋盘格标定 三 实验内容 1 实验数据 2 实验代码 3