相机投影矩阵的计算

2023-05-16

摄像机标定(Camera calibration)中存在的一个关键问题:如何求解投影矩阵有了投影矩阵,我们便可以把世界坐标系变化到图像坐标系。
一、最小二乘法
已知条件
n个三维世界坐标点(保存在dat文件中)
n个二维图像坐标点(保存在dat文件中)
使用工具:
环境:windows10+python3.7+pycharm2019
第三方库:numpy

代码如下:
1. 读取dat文件
其中文件每一行都是一个三维坐标或二维坐标,因此按行读取,按列存储

# 三维
x3, y3, z3 = [], [], []
with open("data_3.dat") as f:
    for line in f:
        tmp3 = line.split()
        if tmp3:  # 防止文件空行
            x3.append(float(tmp3[0]))
            y3.append(float(tmp3[1]))
            z3.append(float(tmp3[2]))


# 二维
x2, y2 = [], []
with open("data_2.dat") as f:
    for line in f:
        tmp2 = ine.split()
        if tmp2:
            x2.append(float(tmp2[0]))
            y2.append(float(tmp2[1]))

2. 表示矩阵K(矩阵K见论文,大小为2n*11)

# 表示矩阵K
k = np.zeros((len(x3)*2, 11), dtype=int)
for i in range(len(x3)):
    k[2 * i][0], k[2 * i][1], k[2 * i][2], k[2 * i][3] = x3[i], y3[i], z3[i], 1
    k[2 * i][4], k[2 * i][5], k[2 * i][6], k[2 * i][7] = 0, 0, 0, 0
    k[2 * i][8], k[2 * i][9], k[2 * i][10] = -x2[i]*x3[i], -x2[i]*y3[i], -x2[i]*z3[i]
    k[2 * i + 1][0], k[2 * i + 1][1], k[2 * i + 1][2], k[2 * i + 1][3] = 0, 0, 0, 0
    k[2 * i + 1][4], k[2 * i + 1][5], k[2 * i + 1][6], k[2 * i + 1][7] = x3[i], y3[i], z3[i], 1
    k[2 * i + 1][8], k[2 * i + 1][9], k[2 * i + 1][10] = -y2[i] * x3[i], -y2[i] * y3[i], -y2[i] * z3[i]

3. 表示矩阵U(矩阵U见论文,大小为11*1)

U = np.zeros((len(x3)*2, 1), dtype=int)
for i in range(len(x3)):
    U[2 * i] = x2[i]
    U[2 * i + 1] = y2[i]

4.根据最小二乘法可知投影矩阵m为:
在这里插入图片描述

# 计算投影矩阵
m = np.matmul(np.matmul(np.linalg.inv(np.matmul(k.T, k)), k.T), U)

由于此时得到的m为11维向量,而投影矩阵大小为(3,4).根据论文中指出m(3,4)=1
因此需将1添加到m中并变换矩阵m的尺寸为3*4

list_m = []
for i in range(11):
    list_m.append(m[i][0])

list_m.append(1)
m_matrix = np.array(list_m).reshape(3, 4)

5. 验证投影矩阵m是否正确
方法:将投影矩阵与某一个三维世界坐标进行矩阵乘法运算,看看结果是否得到对应的二维图像坐标,若是,则得到正确的投影矩阵m。
由于每个人的坐标数据不一样,因此这一步可自行编写相关代码进行验证。

二、特征向量法
1. 读取dat文件
其中文件每一行都是一个三维坐标或二维坐标,因此按行读取,按列存储

# 三维
x3, y3, z3 = [], [], []
with open("data_3.dat") as f:
    for line in f:
        tmp3 = line.split()
        if tmp3:  # 防止文件空行
            x3.append(float(tmp3[0]))
            y3.append(float(tmp3[1]))
            z3.append(float(tmp3[2]))


# 二维
x2, y2 = [], []
with open("data_2.dat") as f:
    for line in f:
        tmp2 = ine.split()
        if tmp2:
            x2.append(float(tmp2[0]))
            y2.append(float(tmp2[1]))

2. 表示矩阵A(矩阵A见论文,大小为2n*12)

# 表示矩阵A(下面的k即为矩阵A)
k = np.zeros((len(x3)*2, 12), dtype=int)
for i in range(len(x3)):
    k[2 * i][0], k[2 * i][1], k[2 * i][2], k[2 * i][3] = x3[i], y3[i], z3[i], 1
    k[2 * i][4], k[2 * i][5], k[2 * i][6], k[2 * i][7] = 0, 0, 0, 0
    k[2 * i][8], k[2 * i][9], k[2 * i][10], k[2 * i][11] = -x2[i]*x3[i], -x2[i]*y3[i], -x2[i]*z3[i], -x2[i]
    k[2 * i + 1][0], k[2 * i + 1][1], k[2 * i + 1][2], k[2 * i + 1][3] = 0, 0, 0, 0
    k[2 * i + 1][4], k[2 * i + 1][5], k[2 * i + 1][6], k[2 * i + 1][7] = x3[i], y3[i], z3[i], 1
    k[2 * i + 1][8], k[2 * i + 1][9], k[2 * i + 1][10],  k[2 * i + 1][11] \
        = -y2[i] * x3[i], -y2[i] * y3[i], -y2[i] * z3[i], -y2[i]

3.计算ATA的特征值与特征向量:

# 计算ATA的特征值与特征向量
eigenvalue, featurevector = np.linalg.eig(np.matmul(k.T, k))

4.获得最小特征值的索引:

index = np.argmin(eigenvalue)

6. m(3, 4)元素归一化
由于此时得到的特征向量中的m(3, 4)并不为1,参考另一篇博文得知m(3, 4)元素值为1,因此,将m(3, 4)元素归一化(对投影矩阵操作)

m_matrix = m_matrix / m_matrix[-1, -1]

7. 验证投影矩阵m是否正确
方法:将投影矩阵与某一个三维世界坐标进行矩阵乘法运算,看看结果是否得到对应的二维图像坐标,若是,则得到正确的投影矩阵m。
由于每个人的坐标数据不一样,因此这一步可自行编写相关代码进行验证。

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

相机投影矩阵的计算 的相关文章

  • QQ新版表情序号及对应

    在学习QQ机器人发送消息接口时遇到了新版表情发送问题 xff0c 以及QQ新版表情序号跟面板中不是完全对应的 xff0c 于是遍历了0 500号表情 xff0c 作一一输出 xff0c 得到了大部分表情的序号及对照如下 xff1a 表情使用
  • Java判断String字符串是否相等时容易出现的问题

    在程序设计中 xff0c 我们经常需要判断字符串是否相等 xff0c 如if a 61 61 b xff0c 但在java中 xff0c a和b两个字符串值相等 xff0c 但有时会判断出不相等的情况 例如 xff1a span class
  • ALDS1_2_C:Stable Sort

    题目链接 xff1a ALDS1 2 C Stable Sort 题目概要 xff1a 扑克牌中存在数字相同而花色不同的情况 xff0c 该题需要利用扑克牌这一特性来比较两种排序 xff1a 冒泡排序 选择排序 xff08 题中给出伪代码
  • jupyter notebook 安装nbextension不显示问题

    2023年4月18日 更新 评论区一位老哥的方法 xff0c 不用下载mark js xff0c 复制一份源目录里的文件改名即可 xff0c 经测试 xff0c 有效 xff0c 评论已置顶 首先放一下安装nbextensions的步骤 如
  • Python对象序列化性能比较:pickle、json、msgpack

    目录 前言三种工具介绍PickleJsonMsgpack性能参考 xff08 由ChatGPT给出 xff09 实际测试测试条件测试结果 前言 最近在做毕设 xff0c 需要读取处理大量的数据 xff0c txt中文文本 xff0c 大概有
  • IRQL_NOT_LESS_OR_EUQAL,间歇性蓝屏,4800h笔记本,暗影精灵6,解决办法,蓝屏问题排查

    目录 前言机器配置蓝屏情况已测试方法及思路前期准备使用WinDbg分析蓝屏文件软件 系统排查 xff1a 驱动排查 xff1a 系统排查 硬件排查硬件检测硬件替换 送修 已知解决办法总结 前言 本文章所列出解决方法适用于AMD Ryzen
  • 单片机PWM输出原理与实践

    一 什么是PWM xff1f PWM xff08 Pulse Width Modulation xff09 脉冲宽度调制 xff0c 它是通过对一系列脉冲的宽度进行调制 xff0c 等效出所需要的波形 xff08 包含形状以及幅值 xff0
  • 数字IC/FPGA面试笔试准备(自用填坑中)

    文章目录 前言常见的IC问题数字电路基础问题Verilog amp SV 跨时钟域信号处理类CRG 同步与异步复位综合与时序分析类低功耗方法STA 静态时序分析 DC综合RTL设计 包含手撕代码 总线问题AXIAPBAHB 体系结构的问题R
  • 时序图工具哪家强?

    设计时序是基本功 xff0c 怎样才能高效的设计时序图呢 xff1f 下面是我搜集到的工具以及我目前在用的工具 xff0c 希望大家能找到最适合自己的工具 Visio 使用步骤 Visio时序图工具 xff0c 其中有一些做好的模具 xff
  • FIFO设计笔记(双口RAM、同步FIFO、异步FIFO)Verilog及仿真

    文章目录 0 前言0 1 FIFO0 2 FIFO与RAM 1 异步双口RAM1 1 原理1 2 Verilog代码1 3 tb仿真 2 FIFO设计前瞻知识2 1 格雷码2 1 1 二进制转格雷码Verilog代码tb仿真 2 1 2 格
  • el-table在行单击时获取行的index

    一 涉及参数及事件 参数说明类型类型说明row class name行的 className 的回调方法 xff0c 也可以使用字符串为所有行设置一个固定的 className Function row rowIndex String ro
  • 时序分析与时序约束知识总结

    文章目录 时序分析如何查看时序报告时序分析的分类和任务HOLD违例修复 xff1a SETUP违例修复 xff1a 时序违例的修复 时序约束约束的分类时序约束的作用SDF文件OCVPVT共同路径悲观效应 CPP setup time与hol
  • Ubuntu 遭遇 无法打开锁文件 /var/lib/dpkg/lock - open (13: 权限不够)解决方案:

    作者本人最近在自学linux xff0c 一是作为遇到的问题的笔记 xff0c 二是希望给遇到一样问题的同学一个解决方案 有三个解决方案 xff1a 一 xff0c 在终端输入 sudo passwd root 然后输入两次密码 再输入 s
  • VS error c4996: 'fopen': This function or variable may be unsafe 解决方案

    一 摘要 在调用图像处理函数 xff0c 或者文字处理函数的时候 xff0c 会出现类似下面这种报错 错误 C4996 39 fopen 39 This function or variable may be unsafe Consider
  • 解决word中无法粘贴问题(Ctrl+V失灵问题)

    1 问题描述 最近打开word xff0c 发现ctrl 43 v不管用了 xff0c 怎么回事呢 xff1f 昨天还好好的 xff0c 怎么突然不灵了呢 后来发现每次打开都会提示MathType的问题 xff0c 我想肯定是这个插件惹的祸
  • 解决“双系统删除其中一个,BIOS仍然有其启动项”问题

    1 打开win10下的磁盘管理工具 xff0c 按Windows键 43 X键就可以在弹出来的菜单中找到磁盘管理 xff0c 打开后找到你当时安装ubuntu的分区 xff0c 在哪个分区右击删除卷即可 2 刚才已经删除了Ubuntu的系统
  • Ubuntu | 你的内存不够啦:c++: internal compiler error: Killed (program cc1plus)

    1 问题描述 在开发板上编译opencv的时候报了一个错 c 43 43 internal compiler error Killed program cc1plus Please submit a full bug report 主要是在
  • 神经网络例程-梯度下降法更新权值

    以下代码来自Deep Learning for Computer Vision with Python第九章 一 梯度下降法 xff08 Gradient Decent xff09 import the necessary packages
  • BP神经网络拟合函数

    摘要 xff1a 采用BP神经网络 拟合目标函数 xff0c 并添加高斯随机噪声 xff0c 通过使用feedforwardnet 函数构建BP神经网络进行函数拟合 通过调试设定的参数及所使用的训练函数 xff0c 得出结论 xff1a B
  • 替换=(等于号)正则表达式

    public void test4 String expression 61 34 a 61 0 34 String aa 61 34 34 aa 61 expression replaceAll 34 61 gt lt 61 61 gt

随机推荐