相机投影矩阵的计算

这篇具有很好参考价值的文章主要介绍了相机投影矩阵的计算。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

摄像机标定(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。
由于每个人的坐标数据不一样,因此这一步可自行编写相关代码进行验证。文章来源地址https://www.toymoban.com/news/detail-422029.html

到了这里,关于相机投影矩阵的计算的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCV之摄像机标定

    最近方向定下来是双目立体视觉,主要是做重建这块的研究。大致过程是图像获取-摄像机标定-特征提取-匹配-三维重建,当然开始可以进行图像预处理,矫正,后期可以进行点云的进一步处理,如渲染表面使其更接近于现实物体。 图像获取相对来说比较简单,用相机拍摄目

    2024年02月09日
    浏览(26)
  • 摄像机模型建立和手机标定Python实现

    目录 记录了摄像机模型建立和张正有标定法,并采用python对自己手机的摄像头进行了标定。 计算机视觉之摄像机模型建立和标定(张正友标定法) 1.摄像机模型 1.1小孔成像原理 1.2坐标系 1.3相似三角形原理 1.4像素坐标 1.5齐次坐标 1.6矩阵表示 1.7摄像机内参矩阵 1.8世界坐标

    2024年02月04日
    浏览(34)
  • OpenCV基础(28)使用OpenCV进行摄像机标定Python和C++

    摄像头是机器人、监控、太空探索、社交媒体、工业自动化甚至娱乐业等多个领域不可或缺的一部分。 对于许多应用,必须了解相机的参数才能有效地将其用作视觉传感器。 在这篇文章中,您将了解相机校准所涉及的步骤及其意义。 我们还共享 C++ 和 Python 代码以及棋盘图案

    2024年02月04日
    浏览(27)
  • Unity丨移动相机朝向目标并确定目标在摄像机可视范围内丨摄像机注释模型丨摄像机移动丨不同尺寸模型优化丨

    本文提供的功能是摄像机朝向目标移动,并确定整个目标出现在摄像机视角内,针对不同尺寸的模型优化。 提示:这里可以添加技术名词解释 直接上代码 后期可扩展功能:类似点击目标完成视角移动等。

    2024年02月07日
    浏览(42)
  • OpenCV开发笔记(七十七):相机标定(二):通过棋盘标定计算相机内参矩阵矫正畸变摄像头图像

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/136616551 各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究 红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、

    2024年03月13日
    浏览(37)
  • 计算机视觉之三维重建(一)(摄像机几何)

    针孔摄像机 添加屏障: 使用针孔( o =光圈=针孔=摄像机中心),实现现实与成像一对一映射,减少模糊。其中针孔与像平面的距离为 f (焦距);虚拟像平面位于针孔与真实物体之间,与像平面互为倒立关系。 位置映射:利用相似三角形得到现实坐标在像平面上的映射坐标。 光

    2024年02月12日
    浏览(41)
  • unity实现简单的摄像机震动效果(包括普通摄像机和虚拟摄像机)

    用代码实现摄像机简单的震动效果

    2024年02月12日
    浏览(27)
  • Unity【角色/摄像机移动控制】【3.摄像机跟随角色】

    本章代码基于前两章。 1. 我们新建CameraController脚本,将其挂载到Camera上 2. 在角色Player下新建一个空物体,命名为cameraTargetPoint,并将该物体挂载至CameraController脚本中【注意代码中的这行:public Transform cameraTargetPoint;】,将该空物体放在人物头部附近位置 3.将PlayerController脚本

    2024年02月22日
    浏览(39)
  • 小米摄像机升级失败,小米摄像机黄灯常亮修复,全网最硬核修复

    2020年买了个小米云台相机pro,后来搬家没怎么用,放家里吃灰一年多,前两天突然翻到想着拿来用一用,结果开机后提示要升级,我就点了升级,结果升级好重启后就一直没反应了,一直黄灯常亮。升级期间也没断电干啥的,结果就不能开机了。然后网上找方法说可以下载固

    2024年02月10日
    浏览(121)
  • 【UE4】 通过按钮点击实现摄像机的切换 并通过鼠标控制新摄像机的旋转

    首先创建了4个Actor蓝图类 每个蓝图类内只拥有一个摄像机组件 将每个actor蓝图类摆放到场景的合适位置 在关卡蓝图中创建自定义事件,当该事件触发时切换摄像机 创建一个控件蓝图,在控件蓝图中创建如下5个按钮,并创建点击事件。按钮分别表示车上的4个镜头和车外自由

    2023年04月09日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包