位姿估计 | 目标体坐标系相对于相机坐标系的位姿估计及其Python代码

news2024/11/25 6:38:46

目录

  • 引言
  • 技术流程
    • 1. PNP介绍
    • 2. ICP介绍
      • a. 利用ICP求解目标相对相机的位姿
      • b. 利用ICP求解相机帧间运动
  • Python代码

引言

本文接着分享空间目标位姿跟踪和滤波算法中用到的一些常用内容,希望为后来者减少一些基础性内容的工作时间。以往分享总结见文章:位姿跟踪 | 相关内容目录和链接总结(不断更新中~~~)

本文介绍如何利用特征点求解目标体坐标系相对于相机坐标系的位姿

技术流程

1. PNP介绍

PnP(Perspective-n-Point)是根据图像中特征点的二维像素坐标及其对应的三维空间坐标,来估计相机在参考坐标系中位姿的一类算法。

直观来讲,当相机观察到空间中的某一物体时,我们已经知道了该物体在某一参考坐标系下的位置和姿态,那么如何通过图片中物体的成像判断出相机此时在参考坐标系下的位姿

这正是PnP要解决的问题,即利用已知三维结构与图像的对应关系求解相机与参考坐标系的相对关系(相机的外参)。

总的来说,PNP问题求解的是相机相对于参考坐标系的位姿。需要已知特征点像素坐标,以及对应的参考坐标系下的坐标值。

一般来说,利用特征点的像素坐标,以及已知的相机内参,可以获取特征点在相机坐标系下的坐标。

在已知特征点在相机坐标系下的坐标和参考坐标系下的坐标位置后,利用ICP方法可以求解相机坐标系和参考坐标系之间的相对位姿!!

2. ICP介绍

迭代最近点算法ICP ( Iterative Closest Point):已知三维点在两个坐标系中的坐标,求这两个坐标系的变换关系,称为 ICP 问题。

ICP 算法的目的是要找到特征点匹配之间的旋转参数 R R R和平移参数 T T T,使得两点数据之间满足某种度量准则下的最优匹配。

设参考坐标系下特征点坐标集合为 S 1 S_1 S1,相机坐标系下特征点坐标集合为 S 2 S_2 S2 P i P_i Pi Q i Q_i Qi (又可记作 p 1 i p_1^i p1i p 2 i p_2^i p2i)分别表示特征点集 S 1 S_1 S1 S 2 S_2 S2中某个特征点坐标。

构造目标函数:

利用SVD分解求解ICP问题,具体步骤为:

  1. 首先计算特征点集的均值以及去中心点化的点坐标:
  2. 定义矩阵 M M M
  3. M M M进行奇异值分解:
  4. 计算旋转矩阵 R R R的最优解为:
  5. 计算平移矩阵 T T T

ICP问题的应用包括两种:利用ICP求解相对位姿,利用ICP求解相机帧间运动。

a. 利用ICP求解目标相对相机的位姿

已知量:特征点坐标 在相机坐标系和目标坐标系下的坐标值

步骤奇异值分解(SVD),具体求解流程见上文。

输出:目标坐标系相对于参考坐标系的旋转矩阵 R R R和平移矩阵 T T T,即为求解目标相对位姿。

该方法适用于求解空间目标相对于相机坐标系的位姿,在基于特征的目标位姿估计方法中比较适用。

b. 利用ICP求解相机帧间运动

ICP算法还可以根据前后两帧图像中匹配好的特征点在相机坐标系下的三维坐标,求解相机帧间运动。

直观来讲,当相机在某处观察某一物体时,我们知道了相机此时与物体之间的相对位姿关系;当相机运动到另一处,我们亦知道此时相机与物体的相对位姿关系。

已知量 t 1 t_1 t1时刻相机与目标之间的相对位姿, t 2 t_2 t2时刻相机与目标之间的相对位姿。

步骤奇异值分解(SVD) 或者 非线性迭代等,具体求解流程见上文。

输出:ICP问题可以求解这两次相机与物体的相对位姿关系,从而确定相机发生了怎样的运动。

参考网址:

  1. ICP 问题之 SVD
  2. 视觉SLAM中的对极约束、三角测量、PnP、ICP问题

Python代码

功能:已知特征点在相机坐标系和目标坐标系的位置,利用SVD线性求解目标坐标系相对于相机坐标系的位姿,也即目标的相对位姿。(ICP问题)

import numpy as np
import math

def objpose(P, Q):
    n = P.shape[1]

    # 计算P' 和 Q' 的值
    P1 = P.copy()
    Q1 = Q.copy()
    pbar = sum(P.T)/n
    qbar = sum(Q.T)/n
    P = P - pbar.reshape((3,1))
    Q = Q - qbar.reshape((3,1))

    # SVD分解
    # 计算M矩阵
    M = np.zeros((3,3))
    for i in range(n):
        M += np.dot(P[:,i].reshape((3,1)), Q[:,i].reshape((3,1)).T)

    [U,S,V] = np.linalg.svd(M)

    # 计算旋转矩阵R
    R = np.dot(V, U.T)

    # 得到R值后, 计算t值
    Sum = np.dot(R, P1[:, 1])

    t = Q1[:, 1] - Sum

    # 方向判断
    if t[2] < 0:
        R = -R
        t = -t

    return R, t


if __name__ == '__main__':

    P = np.array([[-2,0,0],[-2,2,0],[2,0,0],[2,2,0]]).T # 3D point
    Q = np.array([[-2,0,2],[-2,2,2],[2,0,2],[2,2,2]]).T# 3D point

    [R, t] = objpose(P,Q)
    print(R)
    print(t)

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

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

相关文章

Redis 之Jedis 加springboot整合Redis

Jedis API 文档 在线文档: https://www.mklab.cn/onlineapi/jedis/ Jedis 介绍 Jedis 工作示意图 Java 程序操作Redis 的工具 示意图 Jedis 操作Redis 数据 快速入门 创建maven 项目 注意二步是路径配置自己想放哪里 三步是 定义包的层次结构 嫌弃麻烦的也可以不设置 …

chatgpt赋能python:Python编程技巧:如何横着打印差数列

Python编程技巧&#xff1a;如何横着打印差数列 随着互联网时代的到来&#xff0c;SEO已成为企业推广和营销的重要手段。而作为一名具有10年Python编程经验的工程师&#xff0c;我发现Python编程技巧的学习和应用也可以帮助企业优化SEO排名。本文将从实际项目需求出发&#xf…

如何实现Http请求报头的自动转发之设计

HeaderForwarder组件不仅能够从当前接收请求提取指定的HTTP报头&#xff0c;并自动将其添加到任何一个通过HttpClient发出的请求中&#xff0c;它同时也提供了一种基于Context/ContextScope的编程模式是我们可以很方便地将任何报头添加到指定范围内的所有由HttpClient发出的请求…

基于Java家政服务网站系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

opencv人与摄像头距离、角度检测

参考&#xff1a; https://chtseng.wordpress.com/2018/09/18/%E5%A6%82%E4%BD%95%E4%BC%B0%E7%AE%97%E5%89%8D%E6%96%B9%E4%BA%BA%E7%89%A9%E7%9A%84%E8%B7%9D%E9%9B%A2/ WeChat_20230611160620 1、cv2加载摄像头慢解决方法&#xff0c;单独重新cv2.VideoCapture() https://b…

新《终结者》电影剧本或交由 ChatGPT 书写

据外媒报道&#xff0c;詹姆斯・卡梅隆透露他正在创作下一部《终结者》电影的剧本&#xff0c;他同时表示新剧本的灵感得益于 OpenAI 的 ChatGPT。 打开豆瓣&#xff0c;1984年10月上映的那部「终结者」评分依然在8分以上。而后&#xff0c;终结者系列的电影不断上新&#xff…

基于Java房屋租售网站设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

考研计算机组成思维导图总结(408,833,834)

需要思维导图文件和图片的可以去我的Github上寻找&#xff0c;这份思维导图参考23年王道机组&#xff0c;同时添加了一部分833&#xff0c;834需要知识点。 注意&#xff1a;最后的机组知识点仍要以学院进行对照&#xff0c;这里只是提供参考 思维导图pdf和知识点图片 文章目…

<Linux> 《SUSE Linux 中SSH安全加固》

《SUSE Linux 中SSH安全加固》 1 说明2 安全加固2.1 更改 ssh 默认端口2.2 限制 ROOT 远程登陆2.3 修改默认登录时间2.4 升级旧版本2.5 当用户处于非活动时断线2.6 修改加密协议版本2.7 限制 IP 登录2.8 允许或禁止指定用户和组登录2.9 限制监听 IP2.10 最后修改配置文件的属性…

【JVM 监控工具】JVisualVM的使用

文章目录 前言二、启动JVisualVM三、安装插件四、使用 前言 JVisualVM是一个Java虚拟机的监控工具&#xff0c;要是需要对JVM的性能进行监控可以使用这个工具哦 使用这个工具&#xff0c;你就可以监控到java虚拟机的gc过程了 那么&#xff0c;这么强大的工具怎么下载呢&…

【HBZ分享】FactoryBean的应用 与 BeanFactroyPostProcessor的应用 与 BeanPostProcesser的应用

FactoryBean的应用实战 需要写一个A类来实现FactoryBean实现FactoryBean的3个方法&#xff0c;即getOject(), getObjectType(), isSingleton()注意&#xff1a;在通过xml的【 】标签或者通过注解方式将A类注入容器的时候&#xff0c;返回的实例不是A类&#xff0c;而是T类&…

HTML 基础

目录 HTML 结构 1.认识 HTML 标签 HTML 文件基本结构 标签层次结构 HTML 常见标签 注释标签 标题标签: h1-h6 段落标签: p 换行标签: br 格式化标签 图片标签: img 关于目录结构: 超链接标签: a 链接的几种形式: 表格标签 合并单元格 列表标签 表单标签 form …

【头歌-Python】Python第九章作业(初级)第 1、2、4 关

第1关&#xff1a;绘制温度曲线 任务描述 附件中是某月每天的最高温度和最低温度数据&#xff0c;请绘制本月的高温曲线&#xff08;红色、圆点标记坐标&#xff09;和低温曲线&#xff08;蓝色、星号标记坐标&#xff09;&#xff0c;线型、刻度如输出示例所示&#xff0c;线…

Rust每日一练(Leetday0031) 解码方法、复原 IP 地址

目录 91. 解码方法 Decode Ways &#x1f31f;&#x1f31f; 93. 复原 IP 地址 Restore IP Addresses &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 91. …

chatgpt赋能python:Python如何求平均

Python如何求平均 Python是一种非常流行的编程语言&#xff0c;它被广泛应用于各种领域&#xff0c;包括科学计算、数据分析、Web开发等。在这篇文章中&#xff0c;我们将介绍如何使用Python求平均值。 什么是平均数 平均数&#xff0c;也称为均值&#xff0c;是指一组数据的…

chatgpt赋能python:Python怎么求平均值?全面解析平均值计算方法

Python怎么求平均值&#xff1f;全面解析平均值计算方法 作为一种简洁易用的计算机编程语言&#xff0c;Python的应用范围已经越来越广泛。在Python中&#xff0c;我们可以轻松地进行各种统计和计算工作&#xff0c;其中求平均值是最常见的计算之一。在本文中&#xff0c;我们…

Redis过期策略

Redis 使用的过期删除策略是什么&#xff1f; Redis 是可以对 key 设置过期时间的&#xff0c;因此需要有相应的机制将已过期的键值对删除&#xff0c;而做这个工作的就是过期键值删除策略。 每当我们对一个 key 设置了过期时间时&#xff0c;Redis 会把该 key 带上过期时间存…

Redis 持久化-RDB和 持久化-AOF 的详细介绍以及区别

Redis 持久化-RDB 官方资料 在线文档: https://redis.io/topics/persistence 持久化方案 RDB&#xff08;Redis DataBase&#xff09; AOF&#xff08;Append Of File&#xff09; RDB 是什么? 在指定的时间间隔内将内存中的数据集快照写入磁盘&#xff0c; 也就Snapsh…

java中获取配置文件路径中含有中文,出现乱码的情况解决方案

问题背景&#xff1a;读取配置文件&#xff0c;但是读到的目录信息是中文乱码的。 第一步&#xff1a; 参考代码如上截图&#xff0c;方法即&#xff1a;读取jdbc配置&#xff0c;获取了配置文件&#xff08;jdbc.properties&#xff09;地址&#xff0c;然后加载这个文件读取…