首页 > 其他分享 >将未来帧中的点 pts​ 对齐到当前帧

将未来帧中的点 pts​ 对齐到当前帧

时间:2025-01-02 10:08:49浏览次数:1  
标签:rt text current future 当前 np 对齐 pts

已知当前的rt矩阵,和未来下一帧的rt矩阵和未来下一帧的5个点pts,求把pts对齐到当前帧。

import numpy as np

def align_points(rt_current, rt_future, pts_future):
    # 计算从未来帧到当前帧的相对变换矩阵
    rt_relative = np.linalg.inv(rt_current) @ rt_future
    
    # 将点转换为齐次坐标
    pts_future_homo = np.hstack((pts_future, np.ones((pts_future.shape[0], 1))))
    
    # 对点进行变换
    pts_current_homo = (rt_relative @ pts_future_homo.T).T
    
    # 转换回 3D 坐标
    pts_current = pts_current_homo[:, :3] / pts_current_homo[:, 3, np.newaxis]
    return pts_current

# 示例输入
rt_current = np.array([[1, 0, 0, 1],
                       [0, 1, 0, 2],
                       [0, 0, 1, 3],
                       [0, 0, 0, 1]])  # 当前帧的RT矩阵

rt_future = np.array([[0.866, -0.5, 0, 4],
                      [0.5, 0.866, 0, 5],
                      [0, 0, 1, 6],
                      [0, 0, 0, 1]])  # 未来帧的RT矩阵

pts_future = np.array([[1, 1, 1],
                       [2, 2, 2],
                       [3, 3, 3],
                       [4, 4, 4],
                       [5, 5, 5]])  # 未来帧的点

# 对齐点到当前帧
pts_current = align_points(rt_current, rt_future, pts_future)
print("Aligned points to current frame:\n", pts_current)

要将未来帧中的点 ( \text{pts}_\text{future} ) 对齐到当前帧,步骤如下:


问题背景

  1. 当前帧的变换矩阵:( \text{rt}_\text{current} )
    这是从当前帧坐标系到世界坐标系的变换矩阵。

  2. 未来帧的变换矩阵:( \text{rt}_\text{future} )
    这是从未来帧坐标系到世界坐标系的变换矩阵。

  3. 未来帧的点集合:( \text{pts}_\text{future} )
    这些点的形状为 ( N \times 3 )(即 3D 点)。


目标

将 ( \text{pts}_\text{future} ) 转换到当前帧的坐标系


数学公式

两帧之间的相对变换矩阵为:
[
\text{rt}\text{relative} = \text{rt}\text{current}^{-1} \cdot \text{rt}_\text{future}
]

该相对变换矩阵描述了从未来帧坐标系到当前帧坐标系的变换关系。

对于任意一个点 ( \text{pt}\text{future} )(形状为 ( 3 \times 1 )),我们需要先将其表示为齐次坐标 ( [x, y, z, 1]^T ),然后进行如下变换:
[
\text{pt}
\text{current} = \text{rt}\text{relative} \cdot \text{pt}\text{future-homo}
]

最后,将结果从齐次坐标转换回 3D 坐标。


实现代码

import numpy as np

def align_points(rt_current, rt_future, pts_future):
    # 计算从未来帧到当前帧的相对变换矩阵
    rt_relative = np.linalg.inv(rt_current) @ rt_future
    
    # 将点转换为齐次坐标
    pts_future_homo = np.hstack((pts_future, np.ones((pts_future.shape[0], 1))))
    
    # 对点进行变换
    pts_current_homo = (rt_relative @ pts_future_homo.T).T
    
    # 转换回 3D 坐标
    pts_current = pts_current_homo[:, :3] / pts_current_homo[:, 3, np.newaxis]
    return pts_current

# 示例输入
rt_current = np.array([[1, 0, 0, 1],
                       [0, 1, 0, 2],
                       [0, 0, 1, 3],
                       [0, 0, 0, 1]])  # 当前帧的RT矩阵

rt_future = np.array([[0.866, -0.5, 0, 4],
                      [0.5, 0.866, 0, 5],
                      [0, 0, 1, 6],
                      [0, 0, 0, 1]])  # 未来帧的RT矩阵

pts_future = np.array([[1, 1, 1],
                       [2, 2, 2],
                       [3, 3, 3],
                       [4, 4, 4],
                       [5, 5, 5]])  # 未来帧的点

# 对齐点到当前帧
pts_current = align_points(rt_current, rt_future, pts_future)
print("Aligned points to current frame:\n", pts_current)

运行结果

运行上述代码后,pts_current 将是未来帧中的点 ( \text{pts}_\text{future} ) 对齐到当前帧坐标系后的点集合。


说明

  • 公式推导:从未来帧到当前帧,需要相对变换矩阵 ( \text{rt}_\text{relative} ),其计算依赖于两个帧的绝对变换矩阵。
  • 适用范围:此方法适用于常见的刚体变换场景,尤其是在 3D 点云处理和计算机视觉任务中。

标签:rt,text,current,future,当前,np,对齐,pts
From: https://www.cnblogs.com/yanghailin/p/18646911

相关文章

  • ubuntu查看当前哪些进程在使用网络流量(好用的方法)
    一、ubuntu要查看当前哪些进程在使用网络流量使用nethogs工具:nethogs是一个用于显示各个进程使用的网络带宽的命令行工具。你可以通过以下命令安装并运行nethogs:sudoapt-getinstallnethogs#安装nethogs(对于基于Debian的系统)sudonethogs运行结果如下:会列出......
  • 在js中importScripts方法有什么作用?
    importScripts()是WebWorkersAPI中的一个函数,它允许你在WebWorker中加载和执行外部的JavaScript文件。WebWorkers是一种能让你在浏览器中进行后台处理的技术,这样即使在进行大量计算时,也不会阻塞主线程,从而提高页面的响应性。importScripts()函数接受一个或多个URI......
  • Linux查找当前整个系统每个进程的线程数
    工作中经常遇到这样的问题:某台服务器的CPU使用率飙升,通过top命令查看是某个程序(Java)占用的CPU比较大,需要查询Java各个进程下的线程数数量。可以通过以下一组命令组合实现:forpidin$(ps-ef|grep“java”|grep-vgrep|awk'{print$2}');doecho${pid}>/tmp/a.txt;ca......
  • word中自带插入公式,实现换行和对齐
    word自带公式输入很是难用,尤其是不能在公式内回车换行。网上有方法说用(shift+回车)方法,亲测不可用。通过多方查找资料,终于找到如何实现word自带公式的换行和对齐的解决方法。先看看最终效果。首先,我们需要观测到word公式输入的模式,在插入公式操作中,公式工具左上角会显示如下图内......
  • BAT 获取当前文件夹的名称和文件名
    1.代码如下@echooffsetlocalfor%%Iin("%cd%")doset"folder=%%~nxI"echo%folder%或者@echooffpushd%1&for%%Iin(.)dosetcurr=%%~nIecho%curr%pause 2.选项语法~I-删除任何引号("),扩充%I%~fI......
  • CHCP(Change Code Page)命令源自 MS-DOS 操作系统,是用于显示或设置当前活动代码页(Code P
    chcp|MicrosoftLearnCHCP和相关说明,以下是按功能分类的表格:功能分类命令/选项说明查看当前活动代码页CHCP显示当前活动的代码页编号。设置活动代码页CHCP[nnn]设置指定的代码页编号,nnn 为要设置的代码页编号。进一步说明:查看当前活动代码页:CHCP......
  • Java:通过当前path(1,1_1,1_1_1)获取上一级或下一级
    packagecom.kingbal.king.dmp;importcom.alibaba.nacos.shaded.com.google.common.collect.Lists;importlombok.AllArgsConstructor;importlombok.Data;importlombok.extern.slf4j.Slf4j;importjava.util.Comparator;importjava.util.List;importjava.util.O......
  • 音视频入门基础:MPEG2-TS专题(24)——FFmpeg源码中,显示TS流每个packet的pts、dts的实现
    =================================================================音视频入门基础:MPEG2-TS专题系列文章:音视频入门基础:MPEG2-TS专题(1)——MPEG2-TS官方文档下载音视频入门基础:MPEG2-TS专题(2)——使用FFmpeg命令生成ts文件音视频入门基础:MPEG2-TS专题(3)——TSHeader简介音......
  • JAVA获取当前时间的三种方法
    JAVA获取当前时间的三种方法|Id|Title|DateAdded|SourceUrl|PostType|Body|BlogId|Description|DateUpdated|IsMarkdown|EntryName|CreatedTime|IsActive|AutoDesc|AccessPermission||-------------|-------------|-------------|------------......
  • java获取本月开始时间和结束时间、上个月第一天和最后一天的时间以及当前日期往前推一
    java获取本月开始时间和结束时间、上个月第一天和最后一天的时间以及当前日期往前推一周、一个月|Id|Title|DateAdded|SourceUrl|PostType|Body|BlogId|Description|DateUpdated|IsMarkdown|EntryName|CreatedTime|IsActive|AutoDesc|AccessPermissi......