当前位置: 首页 > news >正文

逆透视投影 torch

目录

逆透视投影 torch版本

代码解释:

主要目的:


逆透视投影 torch版本

import torch

def inverse_perspective_projection(points, K, distance):
    """
    这个函数计算给定估计距离的点集的逆透视投影。
    
    参数:
        points (bs, N, 2): 2D 图像上的点(每个批次有 N 个 2D 点)
        K (bs, 3, 3): 相机的内参矩阵(每个批次一个 3x3 的矩阵)
        distance (bs, N, 1): 3D 世界中每个点的距离
        
    类似于:
        - pts_l_norm = cv2.undistortPoints(np.expand_dims(pts_l, axis=1), cameraMatrix=K_l, distCoeffs=None)
    """

    # 第一步:将 2D 点转化为齐次坐标(在每个点的最后添加一个 1)
    points = torch.cat([points, torch.ones_like(points[..., :1])], -1)
    # points 的形状变为 (bs, N, 3),此时最后一维是齐次坐标

    # 第二步:应用相机内参 K,计算归一化的图像坐标
    points = torch.einsum("bij,bkj->bki", torch.inverse(K), points)
    # 通过 K 的逆矩阵将点从像素坐标系转换到归一化相机坐标系

    # 第三步:如果没有给定距离参数,直接返回归一化后的坐标
    if distance == None:
        return points

    # 第四步:将归一化坐标乘以距离,恢复到实际的 3D 空间坐标
    points = points * distance
    return points

代码解释:

  1. 输入参数:

    • points (bs, N, 2):包含 bs 批次,每个批次 N 个 2D 图像点。每个点是一个二维坐标。

    • K (bs, 3, 3):相机内参矩阵,每个批次对应一个 3x3 的矩阵。相机的内参矩阵通常包含焦距和主点坐标。

    • distance (bs, N, 1):每个点在 3D 空间中的距离。

  2. 第一步:将 2D 点扩展为齐次坐标。

    • points = torch.cat([points, torch.ones_like(points[..., :1])], -1) 将每个 2D 点添加一个 1,变成 (x, y, 1) 形式,这样可以进行齐次坐标变换。

  3. 第二步:应用相机的内参矩阵 K 的逆,将 2D 图像点从像素坐标系转换为归一化的相机坐标系。

    • 使用 torch.einsum("bij,bkj->bki", torch.inverse(K), points) 计算逆透视变换。torch.inverse(K) 是相机内参的逆矩阵,然后使用爱因斯坦求和约定将其与点坐标进行相乘,得到归一化的 3D 坐标。

  4. 第三步:如果没有给定距离 distance,直接返回归一化后的点坐标。

  5. 第四步:如果给定了每个点的 distance,则将归一化的坐标乘以该点的距离,得到实际的 3D 空间坐标。

主要目的:

  • 该函数通过逆透视投影,将 2D 图像上的点转换为 3D 空间中的坐标。这种方法通常用于从 2D 图像恢复 3D 空间中的物体位置,前提是知道每个点到相机的距离(distance)。

http://www.dtcms.com/a/108885.html

相关文章:

  • 全面解析 Mybatis 与 Mybatis-Plus:深入原理、实践案例与高级特性对比
  • XXS漏洞零基础学习到入门
  • 通用的动态定时任务系统
  • 【动态规划】二分优化最长上升子序列
  • 34、web前端开发之JavaScript(三)
  • 将图表和表格导出为PDF的功能
  • ThreadLocalMap的作用和特点
  • cobbler自动最小化安装centos,并配置地址
  • springboot+easyexcel实现下载excels模板下拉选择
  • Spring Boot 的配置文件
  • 网络空间安全(50)JavaScript基础语法
  • C#:重构(refactoring)
  • 【Spring Cloud Alibaba】:Nacos 使用全详解
  • CExercise04_1位运算符_1 用位运算符判断某个整数是否为奇数
  • 购物车(V2装饰器)
  • 算法:优选(1)
  • RK3568驱动 SPI主/从 配置
  • 基于微信小程序的医院挂号预约系统设计与实现
  • Apache Doris 2025 Roadmap:构建 GenAI 时代实时高效统一的数据底座
  • WRF-Chem 中出现real.exe错误(psfc 计算问题)- MOZART
  • Apache BookKeeper Ledger 的底层存储机制解析
  • 配置单区域OSPF
  • ARM—LED,看门狗关闭,按钮,时钟,PWM定时器,蜂鸣器
  • 【前端扫盲】postman介绍及使用
  • 走向多模态AI之路(三):多模态 AI 的挑战与未来
  • 【家政平台开发(12)】家政平台数据库设计:从MySQL到MyBatis-Plus实战
  • 多个参考文献插入、如何同时插入多个参考文献:如[1,2]、[1-3]格式
  • 搬砖--贪心+排序的背包
  • 请谈谈分治算法,如何应用分治算法解决大规模问题?
  • Pico4 Pro VR 和HTC Vivi 哪个好些