四大坐标系转换和相机标定以及结果评估

2023-10-28

四大坐标系转换和相机标定以及结果评估

  • 四大坐标系
  • 坐标系转换
  • 相机标定(matlab和python)
  • 标定结果评估

相机成像过程涉及坐标变换

包含世界坐标系(Xw,Yw,Zw),相机坐标(Xc,Yc,Zc),平面坐标(x,y),像素坐标(u,v).
在这里插入图片描述

一:四个不同类型的坐标系

将三维物体转换成照片上的二维坐标,由四个坐标系进行转换。

1世界坐标系

世界坐标系是一个特殊坐标系,它建立了描述其他坐标系需要的参考框架。能够用世界坐标系描述其他坐标系的位置,而不能用更大的、外部的坐标系描述世界坐标系。从非技术意义上讲,世界坐标系建立的是我们所关心的最大坐标系,而不必真的是整个世界。
用(Xw, Yw, Zw)表示。

2. 相机坐标系

以相机透镜的几何中心(光心)为原点,坐标系满足右手法则,用(Xc, Yc, Zc)来表示;相机光轴为坐标系的Z轴,X轴水平,Y轴竖直。

3. 图像物理坐标系

以CCD图像的中心为原点,坐标由 ( x , y ) (x, y)(x,y) 表示,图像坐标系的单位,一般是毫米,坐标原点为相机光轴与成像平面的交点(一般情况下,这个交点是接近于图像的正中心)。
在这里插入图片描述

CCD,英文全称:Charge coupled Device,中文全称:电荷耦合元件,可以称为CCD图像传感器。
CCD是一种半导体器件,能够把光学影像转化为数字信号。 CCD上植入的微小光敏物质称作像素(Pixel)。
一块CCD上包含的像素数越多,其提供的画面分辨率也就越高。

4. 图像像素坐标系

其实,当我们提及一个图像时,通常指的是图像的像素坐标系。像素坐标系的原点在左上角,并且单位为像素。
在这里插入图片描述

将图像坐标系的原点O1​转化到以O0 为原点的坐标系中。使用的原因:

  • 如果使用图像坐标系,单位mm,其实不太好衡量具体的图像,如果按照统一的像素标准,比较容易衡量图像的质量
  • 如果使用图像坐标系,然后就有四个象限,这样会有正负数的问题,但是转换成像素坐标系后,都为整数。在后续的操作和运算中,都简化很多。

二 坐标转换

1.世界坐标 → 相机坐标(刚性变换)

在这里插入图片描述
(Xc, Yc, Zc)代表相机坐标;(Xw, Yw, Zw)代表世界坐标;R代表正交单位旋转矩阵,t代表三维平移矢量。
根据旋转角度可以分别得三个方向上的旋转矩阵,而旋转矩阵即为他们的乘积:R=RxRyRz 顺便记录一下三个旋转矩阵的公式,经常忘记。
绕X 旋转θ 度:
在这里插入图片描述
绕Y 旋转θ 度:

在这里插入图片描述

绕Z 旋转θ 度:
在这里插入图片描述
如下图( 旋转θ ):
在这里插入图片描述

2 相机坐标 → 图像坐标系(中心投影)

相机坐标系到图像坐标系是透视关系,利用相似三角形进行计算。
在这里插入图片描述
写成齐次坐标形式的矩阵相乘为:
在这里插入图片描述
其中f代表焦距,即相机坐标系和图像坐标系在Z轴上的差。此时投影点p的单位还是mm,并不是pixel,不方便进行后续运算。

3 图像坐标系 → 像素坐标系(离散化)

像素坐标系的原点在左上角,并且单位为像素。像素坐标系和图像坐标系都在成像平面上,只是各自的原点和度量单位不一样。图像坐标系的原点为相机光轴与成像平面的交点,通常情况下是成像平面的中点或者叫principal point。图像坐标系的单位是mm,属于物理单位,而像素坐标系的单位是pixel,我们平常描述一个像素点都是几行几列。所以这二者之间的转换如下:其中dx和dy表示每一列和每一行分别代表多少mm,即1pixel=dx mm

在这里插入图片描述

4、最终得到坐标系转化公式

通过上面四个坐标系的转换可以得到一个点从世界坐标系如何转到像素坐标系,如下图所示,这里有我们熟悉的内参和外参矩阵。
在这里插入图片描述
在这里插入图片描述

相机的内参和外参

  • 外参:摄像机的旋转平移属于外参,用于描述相机在静态场景下相机的运动,或者在相机固定时,运动物体的刚性运动。因此,在图像拼接或者三维重建中,就需要使用外参来求几幅图像之间的相对运动,从而将其注册到同一个坐标系下面来.

  • 内参:下面给出了内参矩阵,需要注意的是,真实的镜头还会有径向和切向畸变,而这些畸变是属于相机的内参的。由前面步骤已知像素坐标系到世界坐标系映射关系:
    所以:
    在这里插入图片描述

其中,fx=f/dx,fy=f/dy,f是相机的焦距。RT是外参,矩阵K是内参,包含5个未知数,标定的时候,如果物体距离相机不同位置,那么我们必须在不同位置对相机坐标定。简单理解就是当物体离相机近的时候成像效果大,实际代表尺寸就小。因此每一个位置都要去标定。

三 相机标定

matlab标定

实验步骤:

1.打印一张棋盘格A4纸张(黑白间距已知),并贴在一个平板上

2.针对棋盘格拍摄若干张图片(一般10-20张)

3.在图片中检测特征点(Harris特征)

4.利用解析解估算方法计算出5个内部参数,以及6个外部参数

5.根据极大似然估计策略,设计优化目标并实现参数的refinement

1 打开Matlab.界面如下图1所示。

在这里插入图片描述

2 点击上方“APP”功能,进入如下界面,红色部分为相机标定功能(上方为弹单目相机标定功能,下方是双目相机标定)

在这里插入图片描述

3 点击单目相机标定,进入如下标定界面,点击红色部分的**“下三角”**选择“From file”,选择文件夹,选择照片。

4 选择照片后,进入如下界面,选择标定板的大小(单位 mm),我的设置为25mm。

在这里插入图片描述

5 点击**“Calibrate”**开始标定。

在这里插入图片描述

6.标定参数误差。如图6中的红色部分是标定误差,标定误差平均值小于0.3个像素,相机参数可用。(从标定误差中可以看出每张照片的误差,如果某张照片误差过大,可以在左侧图片列表中将其删除,重新标定)。

在这里插入图片描述

7.点击图7中的红色部分进行参数保存。会出现图8的命令框,点击确定即可。

在这里插入图片描述
结果:
其中,“RadiaDistortion”即为相机的畸变矩阵,“IntrinsicMatrix”即为内参矩阵。
在这里插入图片描述
在这里插入图片描述

python标定

借助opencv工具包

import numpy as np
import cv2
import os
from PIL import Image

# 遍历照片
def read_images_from_folder(folder_path):
    images = []
    for filename in os.listdir(folder_path):
        if filename.endswith(".jpg") or filename.endswith(".png"):
            image_path = os.path.join(folder_path, filename)
            try:
                image = Image.open(image_path)
                images.append(image_path)
            except IOError:
                print("Cannot open image: ", filename)
    return images

# 标定板格点数量和大小
pattern_size = (9, 6)  # 内部角点数量
square_size = 25  # 棋盘格方块大小(毫米)

# 存储棋盘格角点的3D坐标
obj_points = []
# 存储棋盘格对应的图像点坐标
img_points = []

# 准备棋盘格的3D坐标
objp = np.zeros((pattern_size[0] * pattern_size[1], 3), dtype=np.float32)
objp[:, :2] = np.mgrid[0:pattern_size[0], 0:pattern_size[1]].T.reshape(-1, 2) * square_size

# 指定文件夹路径
folder_path = "G:/实习/image/2"
# 调用函数读取图片
images = read_images_from_folder(folder_path)

# 遍历所有标定图像
for image_path in images:
    # 读取图像并将其转换为灰度图
    image = cv2.imread(image_path)
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    # 查找棋盘格角点
    ret, corners = cv2.findChessboardCorners(gray, pattern_size, None)

    # 如果找到棋盘格角点则存储对应的3D和2D坐标
    if ret:
        obj_points.append(objp)
        img_points.append(corners)

        # 在图像上绘制棋盘格角点
        cv2.drawChessboardCorners(image, pattern_size, corners, ret)
        cv2.imshow('Chessboard Corners', image)
        cv2.waitKey(500)

# 进行相机内参标定
ret, camera_matrix, dist_coeffs, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, gray.shape[::-1], None, None)

# 打印相机内参和畸变系数
print("Camera Matrix:\n", camera_matrix)
print("\nDistortion Coefficients:\n", dist_coeffs)
np.savetxt('camera_matrix.txt', camera_matrix)
np.savetxt('dist_coeffs.txt', dist_coeffs)

标定结果为两个txt文件,分别是相机内参和畸变系数。在这里插入图片描述

四 重投影误差分析

其结果数据越小,标定效果越好

import cv2
import numpy as np
from PIL import Image
import os

def read_images_from_folder(folder_path):
    images = []
    for filename in os.listdir(folder_path):
        if filename.endswith(".jpg") or filename.endswith(".png"):
            image_path = os.path.join(folder_path, filename)
            try:
                image = Image.open(image_path)
                images.append(image_path)
            except IOError:
                print("Cannot open image: ", filename)
    return images
# 加载标定结果
camera_matrix = np.loadtxt('camera_matrix.txt')
dist_coeffs = np.loadtxt('dist_coeffs.txt')

# 指定文件夹路径
folder_path = "G:/实习/image/2"
# 调用函数读取图片
images = read_images_from_folder(folder_path)
# 加载用于评估的图像
#images = ['image1.jpg', 'image2.jpg', 'image3.jpg']  # 替换为你自己的图像文件名

# 计算评估指标
reprojection_errors = []
for image_file in images:
    # 加载图像
    image = cv2.imread(image_file)
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    # 检测角点
    ret, corners = cv2.findChessboardCorners(gray, (9, 6), None)

    # 如果检测到角点,则进行评估
    if ret:
        # 畸变校正
        undistorted_corners = cv2.undistortPoints(corners, camera_matrix, dist_coeffs)

        # 计算重投影误差
        mean_error = np.sqrt(np.mean(np.square(undistorted_corners - corners)))
        reprojection_errors.append(mean_error)

# 计算平均重投影误差
mean_reprojection_error = np.mean(reprojection_errors)
# 打印结果
print("mean_reprojection_error:\n", mean_reprojection_error)
#np.savetxt('mean_reprojection_error.txt', mean_reprojection_error.astype(float).flatten())
np.savetxt('mean_reprojection_error.txt', mean_reprojection_error.flatten())

在这里插入图片描述

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

四大坐标系转换和相机标定以及结果评估 的相关文章

  • (linux系统下)MMCV及MMClassification教程及安装问题解决

    说一下依托关系 MMCV是面向计算机视觉的一个基础库 它支持OpenMMLab的各个模块包括MMClassification图像分类 MMDetectionm目标检测 MMOCR文字检测识别等等 本文主要详细介绍一下mmcv和mmcls的安
  • Halcon模板匹配

    Halcon模板匹配 Halcon模板匹配的方法 模板匹配的流程 基于形状的模板匹配的思路 原理 Halcon模板匹配的方法 模板匹配的流程 基于形状的模板匹配的思路 读取图像 转灰度图 dev close window dev open
  • QueryDet:级联稀疏query加速高分辨率下的小目标检测

    论文 https arxiv org abs 2103 09136 代码 已开源 https github com ChenhongyiYang QueryDet PyTorch 计算机视觉研究院专栏 作者 Edison G 虽然深度学习的
  • OpenCV入门【C++版】

    OpenCV基础入门 C 语言 Chapter1 读取图片 视频 摄像头 从文件读取图片 从文件读取视频 读摄像头 Chapter2 基础函数 Chapter3 调整和剪裁 Chapter4 绘制形状和文字 Chapter5 透视变换 Ch
  • 【Python-利用动态二维码传输文件(二)】实现文件二进制读取、利用base64编码把文件拆分成多张二维码、重组拆分后的文件并验证。

    为了使用二维码传输文件 上一篇文章已经实现了获取信息存入二维码并打印 由于单个二维码存储的信息量是有限的 而且文件一般也比较大 所以必须把文件先进行拆分 拆分后一块一块信息存入多张二维码中 最后通过图像识别 把所有二维码信息准确读取后再重新
  • 图像处理神器 ImageMagick 命令介绍

    安装完 ImageMagick 打开命令行 输入相应命令即可处理图像 所有命令前面都要加 magick 网上的教程都没说 也可能是我自己环境没配置吧 说明 内的命令表示是可选的 内表示是示例或者代号而已 magick convert sou
  • 【DETR】3、Conditional DETR

    文章目录 一 Conditional DETR 是怎么被提出来的 二 Conditional DETR 的具体实现 2 1 框架结构 2 2 DETR 的 cross attention 和 Conditional DETR 的 cross
  • 2021全国电设(F题)openmv的图像识别之数字识别

    基于openmv的图像识别 通过参加全国电子设计大赛F题总结出openmv4的数字识别 其它版本暂时没试过 欢迎交流 openmv简介 OpenMV是一个开源 低成本 功能强大的机器视觉模块 以STM32F427CPU为核心 集成了OV77
  • 【python-opencv】硬币检测

    使用 python3 8 x opencv 硬币检测 问题描述 设计思路1 使用简单特征识别 具体操作 部分代码 设计思路2 模板匹配 源码 模板制作 完整代码 问题描述 使用图像处理技术 从照片中识别硬币的个数 并判断总价值 设计思路1
  • 《Pyramid Scene Parsing Network》

    Pytorch代码 1 研究问题 目前基于FCN的语义分割网络缺乏利用不同尺度全局上下文信息的能力 对于复杂图像的语义分割 如ADE20K数据集 存在问题 注 感受野的大小可以粗略表示为使用上下文信息的程度 2 研究方法 提出了金字塔场景理
  • SimMIM:一种更简单的MIM方法

    自从何恺明的MAE 点击蓝字查看文章详情 出来之后 基于MIM Masked Image Modeling 的无监督学习方法越来越受到关注 这里介绍一篇和MAE同期的工作 SimMIM A Simple Framework for Mask
  • STM32f103增加ESP8266模块,通过Wifi用手机TCP服务端远程与STM32通信

    STM32f103增加ESP8266模块 通过Wifi用手机TCP服务端远程与STM32通信 提示 esp8266开启透传模式 连上路由器Wifi 电脑热点 接入STM32串口引脚 另外手机TCP服务端是手机IP地址 串口号 大于8000滴
  • 图像处理——我理解的傅里叶变换

    1 傅里叶变换的理解 傅里叶变换的相关数学公式目前还没有搞懂 先不整那个东西 我们主要是研究傅里叶变换的一些思想和应用 这个思想起源于牛顿研究那个三棱镜 白光透过棱镜之后会被分解为七种颜色的光 这些光叠加又能形成白光 所以说可以把一种事物分
  • 【pytorch目标检测】创新之作:Fast R-CNN算法解读

    背景 2015年 提出了Fast RCNN算法 训练步骤实现端到端 CNN 基于VGG6 Fast R CNN是基于R CNN和SPPnets进行的改进 成果 训练速度比RCNN块9倍 测试速度快乐23倍 准确率68 4 SPPnets网络
  • 目标检测算法改进系列之添加SCConv空间和通道重构卷积

    SCConv 空间和通道重构卷积 SCConv 空间和通道重构卷积 的高效卷积模块 以减少卷积神经网络 CNN 中的空间和通道冗余 SCConv旨在通过优化特征提取过程 减少计算资源消耗并提高网络性能 该模块包括两个单元 1 空间重构单元
  • 人工智能超分辨率重建:揭秘图像的高清奇迹

    导言 人工智能超分辨率重建技术 作为图像处理领域的一项重要创新 旨在通过智能算法提升图像的分辨率 带来更为清晰和细致的视觉体验 本文将深入研究人工智能在超分辨率重建方面的原理 应用以及技术挑战 1 超分辨率重建的基本原理 单图超分辨率 利用
  • 深度学习目标检测全连接层什么意思

    在深度学习目标检测中 通常我们使用卷积神经网络 Convolutional Neural Network CNN 进行特征提取 CNN 的主要结构包括卷积层和池化层 用于从输入图像中提取特征 然而 为了最终输出目标的类别和位置信息 通常在网
  • 多目标跟踪使用较多的数据集

    MOT change网站 MOT Challenge
  • 【图像配准】

    非配对配准 Non rigid registration 和配对配准 Rigid registration 是医学图像配准中常用的两种方法 它们有着不同的含义和应用 非配对配准 Non rigid registration 非配对配准是指将
  • 图像分割-Grabcut法

    版权声明 本文为博主原创文章 转载请在显著位置标明本文出处以及作者网名 未经作者允许不得用于商业目的 本文的C 版本请访问 图像分割 Grabcut法 C CSDN博客 GrabCut是一种基于图像分割的技术 它可以用于将图像中的前景和背景

随机推荐

  • jumpserver安装搭建

    全过程只需要用一台机子装 所以尽量给高配 本人是3G 4核 https blog csdn net kadwf123 article details 98971021 https docs jumpserver org zh master
  • python 模拟鼠标键盘_如何用 python 模拟鼠标和键盘的操作

    前言 不论是模拟鼠标操作还是键盘操作 实际上我们都使用了pywinauto这个库里面的内容 模拟鼠标操作 我们直接调用pywinauto mouse这个模块里面的各个方法即可 而模拟键盘输入 我们则需要用到pywinauto keyboar
  • vim 删除所有行:到每行末尾的字符

    s g 删除所有行的指定字符到每行末尾的字符 zipp 3 5 0 zope event 4 5 0 zope interface 5 4 0 linuxfd 1 5 termcolor 1 1 0 删除后 zipp zope event
  • python写的小程序--构造大量测试数据

    1 构造大量数据用于测试 构造从10000个用户 用户名不相同的 以10为例 coding utf 8 x 1 while x lt 11 print js d x 数字强制转换成字符a d x a就是数字X转换成的字符串 print自带一
  • Shader基础:5、表面着色器Surface Shader

    表面着色器是通过Unity给我们制定好的一套标准 计算出需要填充输入什么 输出什么等相关信息 并产生真实的顶点 vertex 像素 pixel 着色器 以及把渲染路径传递到正向或延时渲染路径 输出结构 struct SurfaceOutpu
  • 在linux下挂载ISO镜像文件

    挂接命令 mount 首先 介绍一下挂接 mount 命令的使用方法 mount命令参数非常多 这里主要讲一下今天我们要用到的 命令格式 mount t vfstype o options device dir 其中 1 t vfstype
  • 软件版本号的意义

    RC Release Candidate 含义是 发布候选版 它不是最终的版本 而是最终版 RTM Release To Manufacture 之前的最后一个版本 广义上对测试有三个传统的称呼 alpha beta gamma 用来标识测
  • vscode软件设置头文件路径目录

    1 设置头文件路径原因 在使用 vscode 软件进行 C 开发过程中 有些 c 文件引用的头文件 提示会找不到头文件路径 因此 vscode 软件需要设置头文件路径 2 vscode设置头文件路径 在 vscode 软件打开的情况下 默认
  • VS2019+PCL1.11.1+VTK8.2.0+Qt5.14.2配置

    一 编译VTK8 2 0 网上教程一大堆 自己瞎编吧 二 安装Qt5 14 2 网上教程满天飞 自己随便安吧 安装完新建Qt工程 二 QVTK8 2 0配置 1 配置环境变量 配完之后关机重启 2 在Qt工程目录中添加PCL和QVTK8 2
  • 用CMake管理自己的程序(四)

    前言 用CMake管理自己的程序 一 用CMake管理自己的程序 二 用CMake管理自己的程序 三 通过之前的文章 我们已经可以做到最基本的工程管理了 这篇文章 我们将对之前的工作做一个完善 让我们对程序的管理更加的合理 target开头
  • Http调用第三方接口的两种方式实例《超详细!!!》***

    Http调用第三方接口的两种方式 超详细 最近在公司做一些调用第三方接口的工作 查阅了一部分的资料和向前辈以及朋友请教 完成了第三方接口的调用 其实主要是通过第三方提供的文档 完成完成签名档的设计 连接请求 以及响应数据 这里提供两种方式
  • unity3D hw_4

    Unity3D设计 Homework 4 一 基本操作演练 1 下载Fantasy Skybox FREE 构建自己的游戏场景 选window框框下的 Asset Store的选项 在这里插入图片描述 https img blog csdn
  • RuntimeError: Could not infer dtype of NoneType

    RuntimeError Could not infer dtype of NoneType 出错原因 dataloader在dataset中一个一个读取数据的时候遇到了脏数据 空值之类的 导致在网络推理的时候出现了错误 解决方法 方法一
  • (休息几天)读曼昆之微观经济学——税收归宿

    当政府对某商品征税时 谁是税收的真正承担者 是买方还是卖方承担了税收 或者是买卖双方分摊了税收负担 如果是 决定税收分摊比例的因素是什么 政府规定税收在买卖双方中的分摊比例 比如本例中的镇长建议的 是否可行 这些问题的回答需要使用到一个叫作
  • 区块链技术在应用过程中的安全问题主要体现哪些方面?

    区块链技术在快速应用的同时 其安全隐患也不容忽视 中企通宝区块链技术研究负责人认为 区块链在应用过程中的安全问题主要体现在三个方面 一是区块链系统本身的安全问题 包括智能合约的安全漏洞以及区块链平台的安全漏洞问题 二是网络资产的基础安全问题
  • Vijava 学习笔记之 HostSystem(内存总大小、内存已使用容量和CPU个数)

    package com vmware util import com vmware vim25 mo ServiceInstance import java net URL Created by vixuan 008 on 2015 4 1
  • STM32读取RS485传感器数据,但接收到的数据开头总是多一个字节或少一个一字节,有人能告诉我哪里出问题了吗

    STM32读取RS485传感器数据 但接收到的数据开头总是多一个字节或少一个一字节 有人能告诉我哪里出问题了吗
  • windows server 2012 防火墙 安全策略 限制ip远程及访问mysql

    今天在服务器上设置安全策略 有个奇葩的设置试了很多次 仍然不太理解 但按照以下方法是起作用的 目标 开启防火墙 限制服务器A上的MySQL数据库只能通过B访问 实现 1 首先设置A上的入站规则 添加更改后远程端口可访问 然后开启防火墙 如果
  • uniapp表单数据为“多级结构”,如何做校验

    开发项目的时候使用uniapp的表单 表单数据为多级结构 也就是对象里面嵌套对象 如何做校验 其实针对 多级结构数据 可以使用 动态表单校验 给单个uni forms item添加rule 给name绑定数组形式 代码如下
  • 四大坐标系转换和相机标定以及结果评估

    四大坐标系转换和相机标定以及结果评估 四大坐标系 坐标系转换 相机标定 matlab和python 标定结果评估 相机成像过程涉及坐标变换 包含世界坐标系 Xw Yw Zw 相机坐标 Xc Yc Zc 平面坐标 x y 像素坐标 u v 一