使用几何和线性代数从单个图像进行 3D 重建

使用几何和线性代数从单个图像进行 3D 重建

萨蒂亚

一、说明

3D重构是一个挑战性题目,而且这个新颖的题目正处于启发和膨胀阶段;因此,各种各样的尝试层出不穷,本篇说明尝试的一种,至于其它更多的尝试,我们在陆续的跟踪中。

二、介绍

图1

        以上这3张图片有什么共同点?如果你的猜测是平行线,那么你是对的。这种几何属性是艺术家用来在其艺术中呈现 3D 视图的主要工具。此属性也是从单眼摄像头或单个图像构建 3D 视图的主要支柱。让我们在本文中讨论这个问题。

        我通过将图 3 中存在的第 3 张图像作为输入来重建 1D 场景。此实现存在一些缩放和指标校正问题。我会在某个时候解决这个问题。

图2–从单个图像进行3D重建

请观看视频。

这里的主要思想是如何利用几何和线性代数从单眼相机或单个图像重建 3D 视图。

三、概述

        从单个图像进行3D重建主要取决于您如何使用几何结构从单个图像或单眼相机获得K和R值。

相机校准(K)值主要负责将2D点从图像平面反向投影到3D空间,旋转(R)值捕获所有结构之间的旋转

图3

        单图像或单眼相机的3D重建过程通常涉及2步过程

  1. 找到 K 和 R
    1.1。使用前向投影。

    1.2. 使用几何结构。
  2. 背投
    这涉及将 2D 图像点投影到 3D 空间。

四、线性代数

        让我们讨论一些关于线性代数的基础知识以及如何使用它们。我想到的基本问题是为什么需要线性代数?简短的回答是:

几何结构根据一些线性方程给出了场景中存在的不同点/线/圆锥之间的关系,这就是为什么需要线性代数来求解方程并找到未知数的原因。

        以下是线性代数的概述。请参考。

当您设计线性方程组时,它属于以下类别之一:

  • 方形系统(m = n)
  • 矩形系统 (m !=n)- 在确定系统(n > m)- 在确定系统(m > n)
     

        当您使用直接线性变换(DLT)时,非常需要上述理解。

        我认为有了上述理解,我们可以进入下一阶段。

五. 找到 K 和 R :

5.1. 使用前向投影

图5

        在前向投影中,已知的 3D 点(假设 X)首先将其转换为相机坐标系,然后转换为图像坐标系,从而投影到图像平面(假设 x)上。整个过程表示为:

x = PX — -等式(1)

其中 P 是 4x3 投影矩阵。P可以分解为KR[I | -C],其中K=相机校准,R=旋转,C=相机中心。

如果已知 3D 点和 2D 点,则只需要从方程 (1) 中找到 P。所以我们需要了解P的自由度。

P 具有 11 个自由度(不包括比例因子)。

K = 5,R = 3, C= 3

图6

如果 P 有 11 个自由度,这意味着它需要 5 个零 1/2 个点来求解线性方程。这是不可能的,所以我们需要拿6分。

图7

根据上述计算,n = 11 和 m=12。因此,据说该系统是过度确定的,可以有多个解决方案并且需要近似。参见图4。

如何使用直接线性变换(DLT)获得K和R:

DLT基本上形成了方程PX=0的线性系统,并从中找到K和R。它被归类为

  • 基本 DLT。
  • 标准化的 DLT。
    此版本与相机中心的原点不变。因此,它是比基本DLT更受欢迎的一种。
  • 具有成本函数的DLT。
    在超定解的情况下,线性系统可以有许多解。因此,我们需要用一些成本函数(例如代数成本)近似解。

在这里,我们只讨论基本的DLT。

图8

请检查 GitHub - satya15july/2d_3d_corespondence 的实现。

5.2. 使用几何结构:

以下是针孔相机型号中使用的不同几何形状的简短摘要

图10

上述所有几何形状均用于针孔相机模型,用于3D图像重建。

图11

这是射影几何、仿射几何和欧几里得几何之间关系的简化视图。

图12

如何从单视图几何中获取 K 和 R

首先,您需要了解仿射几何、射影几何和欧几里得几何中存在的一些属性。

  1. 角度属性不保留在射影几何或仿射几何中,但它保留在欧几里得几何中。
  2. 圆锥和圆在欧几里得几何中可以唯一标识,但射影几何只能识别点,线和圆锥(圆作为圆锥)。
  3. 如果要在射影几何中找到射线或平面或直线之间的角度,则必须识别圆锥或绝对圆锥(IAC)的图像。原因是
    - 圆锥由欧几里得几何和射影几何确定。
    - 消失线在 2 个圆形点处与锥相交。

以下是从 IAC 获得 K 和 R 的方法

图.13

由上图可知,求K和R的第一步是

  • 找到欧米茄(w)。
  • 然后,找到 K 和 R。

如何从 3 个正交消失对中获取 Omega:

如果存在 3 个正交消失点,就可以轻松找到 Omega。请检查下图。

图.14

        任何直线都可以与圆锥体/日食相交于 1 或 2 个点。因此消失线最多与圆锥体相交于 2 个点。

        这里详细解释了锥体到欧米伽方程是如何推导的。

                                                                图15

如果我们可以施加一些额外的约束,例如,

  • 如果使用方形像素,则 w1==w3 。
  • 如果没有使用比例因子,则 w2=0

然后欧米茄基质变成

请检查 GitHub - satya15july/find_K_from_orthogonal_planes 的实现。

从几何结构中找到欧米茄后,您可以轻松地从中获得K和R。请参考图 13。

六、 背投

                                                                图16

让我们在其他文章中讨论这个问题,因为我不想让这篇文章变得大。

七、结论

        校准相机意味着K是已知的,我们需要知道R,因为我们需要了解场景中存在的2个结构之间所需的旋转。在这里,我们了解如何使用不同的方法从单个图像中找到它们。

现在的问题是,在了解了这种技术之后,我们如何从单个图像或单眼相机重建3D场景。

检查下面的图像或任何随机的街景,我们如何通过使用上述技术重建它?我们可能需要哪些其他技术。这是一个有趣的问题。解决方案在某个时候再见。

        让我们在这里暂停一下,我希望这篇文章能让您清楚地了解 3D 重建的工作原理。感谢您的阅读。

        具体的实现在

  • GitHub - satya15july/2d_3d_corespondence。
  • GitHub - satya15july/find_K_from_orthogonal_planes。
  • GitHub - satya15july/find_K_from_non_othogonal_planes。
  • GitHub - satya15july/3dreconstruction_single_image。

        如果您喜欢这些内容,欢迎拍手,并关注我以获取有关计算机视觉,3D重建和深度学习的更多信息内容。

引用

  • 计算机视觉中的多视图几何,作者:Richard Hartley 和 Andrew Zisserman。

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

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

相关文章

RTT(RT-Thread)IO设备模型

目录 IO设备模型 模型框架原理 IO设备类型 创建和注册IO设备 RTT设备管理程序实现原理 访问IO设备 查找设备 初始化设备 打开设备 关闭设备 控制设备 读写设备 数据收发回调 数据接收回调 数据发送回调 设备模型实例 IO设备模型 RT-Thread 提供了一套简单的 I/O …

网络编程(TFTP协议实验)

#include <stdio.h> #include <string.h> #include <stdlib.h> #include <head.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h>#define PORT 69 //端口号&#xf…

网络安全威胁与防御策略

第一章&#xff1a;引言 随着数字化时代的快速发展&#xff0c;网络已经成为人们生活和工作中不可或缺的一部分。然而&#xff0c;网络的广泛应用也引发了一系列严峻的网络安全威胁。恶意软件、网络攻击、数据泄露等问题层出不穷&#xff0c;给个人和企业带来了巨大的风险。本文…

mysql基础之触发器的简单使用

1.建立学生信息表 -- 触发器 -- 建立学生信息表 create table s1(id int unsigned auto_increment,name varchar(30),score tinyint unsigned,dept varchar(50),primary key(id) );2.建立学生补考信息表 -- 建立学生补考信息表 create table s2 like s1;3.建立触发器&#xf…

java 自定义xss校验注解实现

自定义一个注解Xss。名字随意 import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Targe…

C字符串练习题(6.3.1)

编写一个程序&#xff0c;从键盘上读入一个小于1000的正整数&#xff0c;然后创建并输出一个字符串&#xff0c;说明该整数的值。例如&#xff0c;输入941&#xff0c;程序产生的字符串是“Nine hundred and forty one”。 #include<stdlib.h> #include<string.h>…

Maven基础总结

前言 Maven 是一个项目管理工具&#xff0c;可以对 Java 项目进行构建、依赖管理。 基本要求掌握 配置Maven环境直接查。 得会在IDEA创建Maven的java项目吧、会创建Maven的web项目吧、会创建多模块项目吧。 得会配置插件pligin、依赖dependency吧 一、Maven四大特性 1、…

CSS:服务器字体 与 响应式布局(用法 + 例子 + 效果)

文章目录 服务器字体定义 服务器字体使用例子 响应式布局设备类型设备特性例子 服务器字体 解决字体不一致而产生的。 首先&#xff0c;在网上把字体下载好。 定义 服务器字体 font-face{font-family:字体名称;src:url(字体资源路径); }使用 在需要使用的选择器里加上 font…

数学建模(一)前继概念

课程推荐&#xff1a;数学建模老哥_哔哩哔哩_bilibili 目录 一、什么是数学建模&#xff1f; 二、数学建模的一般步骤 三、数学建模赛题类型 1.预测型 2. 评价类 3.机理分析类 4. 优化类 一、什么是数学建模&#xff1f; 数学建模是利用数学方法解决实际问题的一种实践。…

什么是多线程?进程和线程的区别是什么?如何使用Java实现多线程?

文章目录 前言我们为什么要使用线程而不是进程来实现并发编程什么是线程进程和线程的区别如何使用Java实现多线程创建线程1.创建一个继承 Thread 类的线程类2.实现 Runnable 接口匿名内部类方式实现 Runnable 接口lambda 表达式实现 Runnable 接口 Thread 类的常见构造方法Thre…

T113-S3-RTL8211网口phy芯片调试

目录 前言 一、RTL8211介绍 二、硬件连接 三、设备树配置 四、内核配置 五、phy芯片配置 六、调试问题 总结 前言 在嵌入式系统开发中&#xff0c;网络连接是至关重要的一部分。T113-S3开发板搭载了RTL8211系列的网口PHY芯片&#xff0c;用于实现以太网连接。在开发过程…

C++ QT(二)

目录 Qt 控件按钮QPushButton控件简介用法示例运行效果 QToolButton控件简介用法示例运行效果 QRadioButton控件简介用法示例运行效果 QCheckBox控件简介用法示例运行效果 QCommandLinkButton控件简介用法示例运行效果 QDialogButtonBox控件简介用法示例运行效果 输入窗口部件Q…

用 React+ts 实现无缝滚动的走马灯

一、走马灯的作用 走马灯是一种常见的网页交互组件&#xff0c;可以展示多张图片或者内容&#xff0c;通过自动播放或者手动切换的方式&#xff0c;让用户能够方便地浏览多张图片或者内容。 本次实现的不是轮播图而是像传送带一样的无限滚动的形式。 二、需求梳理 走马灯可设…

Go Gin 中使用 JWT

一、JWT JWT全称JSON Web Token是一种跨域认证解决方案&#xff0c;属于一个开放的标准&#xff0c;它规定了一种Token实现方式&#xff0c;目前多用于前后端分离项目和OAuth2.0业务场景下。 二、为什么要用在你的Gin中使用JWT 传统的Cookie-Sesson模式占用服务器内存, 拓展性…

uniapp实现自定义导航内容高度居中(兼容APP端以及小程序端与胶囊对齐)

①效果图如下 1.小程序端与胶囊对齐 2.APP端内容区域居中 注意&#xff1a;上面使用的是colorui里面的自定义导航样式。 ②思路&#xff1a; 1.APP端和小程序端走不同的方法&#xff0c;因为小程序端要计算不同屏幕下右侧胶囊的高度。 2.其次最重要的要清晰App端和小程序端…

【数学建模】清风数模更新5 灰色关联分析

灰色关联分析综述 诸如经济系统、生态系统、社会系统等抽象系统都包含许多因素&#xff0c;系统整体的发展受各个因素共同影响。 为了更好地推动系统发展&#xff0c;我们需要清楚哪些因素是主要的&#xff0c;哪些是次要的&#xff0c;哪些是积极的&#xff0c;哪些是消极的…

网络基础——网络的由来与发展史

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 目录 一、网络的由来 二、计算机网络的发展史 1、第一阶段 2、第二阶段 3、第三阶段 前言 每天都是使用网络&#xff0c;那么你知道网络…

FPGA----Vivado SDK创建并使用静态链接库(C/C++代码移植)

1、在进行SoC开发时&#xff0c;PS端的C/C代码可能涉及到核心算法需要移植操作&#xff0c;为此&#xff0c;本文讲述了如何将C/C代码打包为.a文件供程序调用 2、文章以我的程序为例&#xff0c;逐步讲述代码生成静态链接库并调用的方法。 下面是我程序的目录结构&#xff0c…

RocketMQ 延迟消息

RocketMQ 延迟消息 RocketMQ 消费者启动流程 什么是延迟消息 RocketMQ 延迟消息是指&#xff0c;生产者发送消息给消费者消息&#xff0c;消费者需要等待一段时间后才能消费到。 使用场景 用户下单之后&#xff0c;15分钟未支付&#xff0c;对支付账单进行提醒或者关单处理…

PostgreSQL查询慢sql原因和优化方案

PostgreSQL sql查询慢优化方案有一下几种解决方案&#xff1a; 1.关闭会话 查询慢sql的执行会话&#xff0c;关闭进程。 查看数据库后台连接进程 SELECT count(*) FROM pg_stat_activity;SELECT * FROM pg_stat_activity; 查看数据库后台连接进程&#xff0c;但是此条SQL不…