Blender模拟结构光3D Scanner(一)外参数匹配

如何使用Blender模拟FPP(Fringe Projection Profilometry) 原理的结构光3D传感器?

主要包含的工作有:

1)相机、投影仪定位与内外参数匹配;

2)投影仪投射指定Pattern图像;

3)被测物体材质属性配置等;

本篇主要关注外参数匹配。

外参数匹配的基本思路 是,添加Camera和SpotLight节点,并设置各自的变换(Transform)属性,主要是位置X/Y/Z和旋转X/Y/Z六个参数。


1 Blender中变换参数的含义

Blender中,变换参数的含义可理解为世界坐标系到当前Object坐标系的变换,用位置X/Y/Z和旋转X/Y/Z可分别表示为\boldsymbol{T}_{3 \times 1}\boldsymbol{R}_{3 \times 3}

则Object坐标系下的点\boldsymbol{P}_\textnormal{obj}与该点在世界坐标系下的坐标\boldsymbol{P}_\textnormal{W}之间的变换关系为

\boldsymbol{P}_\textnormal{obj}=\boldsymbol{R}\boldsymbol{P}_\textnormal{W}-\boldsymbol{R}\boldsymbol{T}  (1-1)


2 左相机变换参数配置

在三维测量中惯用的相机坐标系定义为,

X ——  相机画幅平面内水平向右的方向为X正方向;

Y —— 相机画幅平面内竖直向下的方向为Y正方向;

Z —— 相机观测正前方(Front)方向为Z正方向;

        但Blender中,相机坐标系的定义是不同的。具体表现为,在Blender中将相机变换参数的位置X/Y/Z和旋转X/Y/Z都设置为0,如图1所示。

图1 相机位置和旋转参数置0

图2 相机视野和方向

        此时相机的视野和方向如图2,图中和红色/绿色/蓝色线为世界坐标系XYZ三轴的轴线, 三个轴的正方向可参见右上角的坐标轴缩略图(彩色实心圆指向轴的正方向);图中橙色线段,端点标有XYZ的是相机坐标系;相机的视野前方为世界坐标系的Z负方向,相机视野的上方向为世界坐标系的Y正方向。

        为了使相机的视野前方与上方向与三维测量中惯用的相机相匹配,需要设置Blender中相机旋转变换参数,旋转Y/Z轴均设置180°,如图3所示。设置后,相机视野前方指向Z正方向,视野上方指向Y负方向。

        但注意此时Blender中相机坐标系(橙色)的各轴方向为:        

        X ——  与世界坐标系X正方向一致;

        Y —— 与世界坐标系Y正方向相反;

        Z —— 与世界坐标系Z正方向相反;

图3 旋转Y/Z轴均设置180°后的Blender相机坐标系

        根据式(1-1),此时Blender相机坐标系下点的坐标\boldsymbol{P}_{\textnormal{C}}与该点在世界坐标系下的表示\boldsymbol{P}_{\textnormal{W}}的关系为

\boldsymbol{P}_{\textnormal{C}}=\boldsymbol{R}_{\textnormal{C}}\boldsymbol{P}_{\textnormal{W}} (2-1)

式中,\boldsymbol{R}_{\textnormal{C}}对应旋转变换参数Y/Z轴均设置180°。

        但是,此时Blender相机坐标系和三维测量惯用的相机坐标系(本节开头)定义仍是不同的,若在此时Blender相机节点的位置,建立三维测量惯用的相机坐标系,设该坐标系下点的坐标为\boldsymbol{P'}_\textnormal{C},则\boldsymbol{P'}_\textnormal{C}与该点在Blender相机坐标系下的坐标\boldsymbol{P}_{\textnormal{C}}之间的变换关系为

\boldsymbol{P'}_\textnormal{C}=\boldsymbol{R}_x\boldsymbol{P}_\textnormal{c}  (2-2)

        式中,\boldsymbol{R}_x对应旋转变换参数X轴旋转180°,即Blender相机坐标系绕X轴旋转180°可构造出三维测量惯用的相机坐标系。


3 投影仪变换参数配置

        投影仪和双目系统中右相机的地位是相同的。在Blender中可通过设置聚光灯(Spot Light)+图像纹理的方式来模拟投影仪的效果。参考式(1-1),配置投影仪变换参数即确定\boldsymbol{R}_\textnormal{P}\boldsymbol{T}_\textnormal{P}

\boldsymbol{P}_\textnormal{P}=\boldsymbol{R}_\textnormal{P}\boldsymbol{P}_\textnormal{W}-\boldsymbol{R}_\textnormal{P}\boldsymbol{T}_\textnormal{P}  (3-1)

        聚光灯的坐标系(即投影仪坐标系)与第2节中Blender相机坐标系的定义是类似的,也存在Blender投影仪坐标系与三维测量惯用的投影仪坐标系差距\boldsymbol{R}_x旋转的问题,即

\boldsymbol{P'}_\textnormal{P}=\boldsymbol{R}_x\boldsymbol{P}_\textnormal{P} (3-2)

        若三维测量系统标定外参数已知,即三维测量惯用的投影仪坐标系与三维测量惯用的左相机坐标系的变换关系已知,则有

\boldsymbol{P'}_\textnormal{P}=\boldsymbol{R}\boldsymbol{P'}_\textnormal{C}+\boldsymbol{T} (3-3)

        联立式(2-1)、(2-2)、(3-1)、(3-2)、(3-3)可求得投影仪变换旋转参数\boldsymbol{R}_\textnormal{P}和平移参数\boldsymbol{T}_\textnormal{P},即可对应得到Blender聚光灯的变换参数。

\boldsymbol{R}_x\boldsymbol{P}_\textnormal{P}=\boldsymbol{R}\boldsymbol{R}_x\boldsymbol{P}_\textnormal{c}+\boldsymbol{T}

\boldsymbol{R}_x(\boldsymbol{R}_\textnormal{P}\boldsymbol{P}_\textnormal{W}-\boldsymbol{R}_\textnormal{P}\boldsymbol{T}_\textnormal{P})=\boldsymbol{R}\boldsymbol{R}_x\boldsymbol{R}_\textnormal{C}\boldsymbol{P}_\textnormal{W}+\boldsymbol{T}

\boldsymbol{R}_x\boldsymbol{R}_\textnormal{P}\boldsymbol{P}_\textnormal{W}=\boldsymbol{R}\boldsymbol{R}_x\boldsymbol{R}_\textnormal{C}\boldsymbol{P}_\textnormal{W}

\boldsymbol{R}_\textnormal{P}=\boldsymbol{R}_x^{\top}\boldsymbol{R}\boldsymbol{R}_x\boldsymbol{R}_\textnormal{C}  (3-4)

-\boldsymbol{R}_x\boldsymbol{R}_\textnormal{P}\boldsymbol{T}_\textnormal{P}=\boldsymbol{T}

-\boldsymbol{R}_x\boldsymbol{R}_x^{\top}\boldsymbol{R}\boldsymbol{R}_x\boldsymbol{R}_\textnormal{C}\boldsymbol{T}_\textnormal{P}=\boldsymbol{T}

-\boldsymbol{R}\boldsymbol{R}_x\boldsymbol{R}_\textnormal{C}\boldsymbol{T}_\textnormal{P}=\boldsymbol{T}

\boldsymbol{T}_\textnormal{P}=-(\boldsymbol{R}\boldsymbol{R}_x\boldsymbol{R}_\textnormal{C})^{\top}\boldsymbol{T}  (3-5)

注意,式中\boldsymbol{R}_x\boldsymbol{R}_\textnormal{C}可理解为分别绕XYZ三个轴各转了180°,相当于没有转!

所以有

\boldsymbol{T}_\textnormal{P}=-\boldsymbol{R}^{\top}\boldsymbol{T}  (3-6)

最终实验得到的一组投影仪变换参数和相机-投影仪位置关系如图4所示

图4 实验得到的一组投影仪变换参数和相机-投影仪位置关系

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

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

相关文章

LangChain是如何实现RAG多轮问答的

目录引言一、LangChain实现RAG多轮问答核心机制1. 对话历史管理(Memory)2. 问题重写(Query Rewriting)3. 检索增强生成(RAG Core)4. 链式工作流(Chain)二、关键设计特点三、完整示例…

DAY 44 预训练模型

知识点回顾: 预训练的概念常见的分类预训练模型图像预训练模型的发展史预训练的策略预训练代码实战:resnet18 一、预训练的概念 我们之前在训练中发现,准确率最开始随着epoch的增加而增加。随着循环的更新,参数在不断发生更新。 所…

Java Stream API 中常用方法复习及项目实战示例

在最近的练手项目中,对于stream流的操作愈加频繁,我也越来越感觉stream流在处理数据是的干净利落,因此写博客用来记录最近常用的方法以便于未来的复习。map() 方法map()是一个中间操作(intermediate operation)&#x…

从零开始手搓一个GPT大语言模型:从理论到实践的完整指南(一)

现在人工智能飞速发展时代,LLM绝对可以算是人工智能领域得一颗明珠,也是现在许多AI项目落地得必不可少得一个模块,可以说,不管你之前得研究领域是AI得哪个方向,现在都需要会一些LLM基础,在这个系列&#xf…

Redis ubuntu下载Redis的C++客户端

1. 安装 redis-plus-plus C 操作 Redis 的库有很多,这里选择使用 redis-plus-plus,这个库的功能强大,使用简单。 Github 地址:GitHub - sewenew/redis-plus-plus: Redis client written in C 访问不了Github 地址的可以使用Ste…

nm命令和nm -D命令参数

出现这种差异的原因在于:动态库中的符号分为两种类型: 常规符号表(regular symbol table):通常用于静态链接和调试,默认不包含在动态库中(除非显式保留)。动态符号表(dyn…

Windows下cuda的安装和配置

今天开始做一个cuda教程。由于本人主要在windows下使用visual studio进行开发,因此这里讲一下windows下的cuda开发环境。 下载cuda_toolkit 从网站https://developer.nvidia.com/cuda-toolkit中下载,先选择Download Now,然后跳转到如下页面&#xff1a…

【代码随想录day 19】 力扣 450.删除二叉搜索树中的节点

视频讲解:https://www.bilibili.com/video/BV1tP41177us/?share_sourcecopy_web&vd_sourcea935eaede74a204ec74fd041b917810c 文档讲解:https://programmercarl.com/0450.%E5%88%A0%E9%99%A4%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E4%B8%A…

智慧养老丨实用科普+避坑指南:科技如何让晚年生活更安全舒适?

随着老龄化社会的到来,智慧养老产品逐渐成为改善老年人生活质量的重要工具。从智能手表到便携洗浴机,科技正为老年人的健康、安全与生活便利提供创新解决方案。我们这次主要介绍四类典型智慧养老产品,结合真实体验给出选购建议,并…

系统垃圾清理批处理脚本 (BAT)

系统垃圾清理批处理脚本 (BAT) 以下是一个Windows系统垃圾清理的批处理脚本,它可以清理常见的系统临时文件、缓存和日志等: echo off title 系统垃圾清理工具 color 0a echo. echo 正在清理系统垃圾文件,请稍候... echo.:: 清理临时文件 echo…

Terraform的零基础学习教程

一、Terraform 是什么? Terraform 是由 HashiCorp 开发的开源工具,用于自动化管理云基础设施(如 AWS、Azure、GCP 等)。 核心特点: 基础设施即代码(IaC):用代码定义和管理资源。跨…

429. N 叉树的层序遍历(中等)题解

题目描述给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。示例 1:输入:root [1,…

Java 课程,每天解读一个简单Java之题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

package ytr250813;import java.io.IOException;public class CharacterCounter {public static void main(String[] args) throws IOException {// 初始化计数器变量int letterCount 0; // 英文字母计数器int spaceCount 0; // 空格计数器int digitCount 0; // 数字计数器i…

GitLab CI + Docker 自动构建前端项目并部署 — 完整流程文档

一、环境准备1. 服务器准备一台Linux服务器(CentOS/Ubuntu皆可),推荐至少4核8GB内存已安装 Docker(及 Docker 服务已启动)已安装 GitLab Runner2. 服务器上安装 Docker (如果没装)# CentOS9以下…

LCP 17. 速算机器人

目录 题目链接: 题目: 解题思路: 代码: 总结: 题目链接: LCP 17. 速算机器人 - 力扣(LeetCode) 题目: # LCP 17. 速算机器人 小扣在秋日市集发现了一款速算机器人。…

Spring cloud集成ElastictJob分布式定时任务完整攻略(含snakeyaml报错处理方法)

ElasticJob 是一款轻量级、可扩展的分布式定时任务解决方案,基于 Quartz 二次开发,支持任务分片、失效转移、任务追踪等功能,非常适合在 Spring Cloud 微服务场景中使用。我将带你完成 Spring Cloud 集成 ElasticJob 的全过程,并分…

了解 Linux 中的 /usr 目录以及 bin、sbin 和 lib 的演变

Linux 文件系统层次结构是一个复杂且引人入胜的体系,其根源深植于类 Unix 操作系统的历史之中。在这一结构的核心,/usr 目录是一个至关重要的组成部分,随着时间的推移,它经历了显著的演变。与此同时,/bin、/sbin、/lib…

高级IO(五种IO模型介绍)

文章目录一、IO为什么慢?一、阻塞IO二、非阻塞IO三、信号驱动IO四、IO多路复用五、异步IO一、IO为什么慢? IO操作往往都是和外设交互,比如键盘、鼠标、打印机、磁盘。而最常见的就是内存与磁盘的交互,要知道磁盘是机械设备&#…

第十二节:粒子系统:海量点渲染

第十二节:粒子系统:海量点渲染 引言 粒子系统是创造动态视觉效果的神器,从漫天繁星到熊熊火焰,从魔法特效到数据可视化,都离不开粒子技术。Three.js提供了强大的粒子渲染能力,可轻松处理百万级粒子。本文将…

LeetCode Day5 -- 二叉树

目录 1. 啥时候用二叉树? (1)典型问题 (2)核心思路 2. BFS、DFS、BST 2.1 广度优先搜索BFS (1)适用任务 (2)解决思路​​:使用队列逐层遍历 2.2 深度…