POSIT算法的原理--opencv 3D姿态估计

2D/3D人体姿态估计 (2D/3D Human Pose Estimation) 1. 基本概念 2. 发展现状 阅读详情

3D姿态估计-POSIT算法

 

POSIT算法,Pose from Orthography and Scaling with Iterations, 比例正交投影迭代变换算法:

用于估计物体的3D姿态(相对于镜头的平移和旋转量)。算法正常工作的前提是物体在Z轴方向的“厚度”远小于其在Z轴方向的平均深度,比如距离镜头10米远的一张椅子。

 

算法流程:

假设待求的姿态,包括旋转矩阵R和平移向量T,分别为


透视投影变换为:

 

上式中的f是摄像机的焦距,它的具体值并不重要,重要的是f与x和y之间的比例,根据摄像头内参数矩阵的fx和fy可以得到这个比例。实际的运算中可直接令f=1,但是相应的x和y也要按照比例设定。比如,对于内参数为[fx,fy,u0,v0]的摄像头,如果一个像素的位置是(u,v),则对应的x和y应为

设世界坐标系中的一点为(Xw,Yw,Zw),则


有必要再解释一下旋转矩阵R和平移向量T的具体意义:

R的第i行表示摄像机坐标系中的第i个坐标轴方向的单位向量在世界坐标系里的坐标;

R的第i列表示世界坐标系中的第i个坐标轴方向的单位向量在摄像机坐标系里的坐标;

T正好是世界坐标系的原点在摄像机坐标系的坐标,特别的,Tz就代表世界坐标系的原点在摄像机坐标系里的“深度”。

根据前面的假设,物体在Z轴方向的‘厚度’,即物体表面各点在摄像机坐标系中的Z坐标变化范围,远小于该物体在Z轴方向的平均深度。一定要注意,“厚度”和“深度”都是相对于摄像机坐标系的Z轴而言的。当世界坐标系的原点在物体的中心附近时可以认为平均深度就是平移向量T中的Tz分量,即各点的Zc的平均值是Tz,而Zc的变化范围相对于Tz又很小,因此可以认为,Zc始终在Tz附近,Zc≈Tz。

根据这个近似关系,可得


这就是我们的迭代初值。在这种初始状态下,我们假设了物体的所有点在同一个深度上,这时的透视变换就退化为了一个比例正交投影POS。也就是,我们的迭代开始于一个比例正交投影,这也是POSIT算法名字的由来。

我们前面得到了:


由于我们给了w一个估计值,因此可以先将其看做已知量,删掉第三行(这样方程中就少了4个未知量,更方便求解),得到


由于w被看做已知,因此上面的迭代方程可以看做有8个未知量,分别是



给定一对坐标后(一个是世界坐标系的坐标,一个是图像坐标系的坐标,它们对应同一个点),我们就可以得到2个独立的方程,一共需要8个独立方程,因此至少需要给定4对坐标,而且对应的这4个点在世界坐标系中不能共面。为什么不能共面?如果第4个点与前三个点共面,那么该点的“齐次坐标”就可以被其他三个点的“齐次坐标”线性表示,而迭代方程的右侧使用的就是齐次坐标,这样由第四个点得到的方程就不是独立方程了。这里之所以强调“齐次坐标”是因为,只要三个点不共线,所有其他点(即使不共面)的“常规坐标”都可以被这三个点的“常规坐标”线性表示,但“齐次坐标”则要求共面。

OK,假如我们获得了4个不共面的点及其坐标,并通过迭代方程求出了8个未知量。这时我们就可以算出向量sR1和sR2的模长。而由于R1和R2本身都是单位向量,即模长为1。因此我们可以求出s,进而求得R1和R2以及Tz=f/s:


有了R1和R2就可以求出R3,后者为前两个向量的叉积(两两垂直的单位向量)。


至此,整个旋转矩阵R和平移向量T,共12个未知量,就都求出来了。不过,这只是近似值,因为我们一开始时假设了w=1(或Zc=Tz),即物体上所有的点的深度都是Tz。现在我们有了一个近似的转换矩阵,可以利用它为各点计算一个新的深度,这个深度比Tz更准确。新的深度Zc和新的迭代系数w等于:


这时,由于每个点的有不同的深度,他们也就有了不同的迭代系数w。接着,将每个点的新w值代入迭代方程中,重新得到8个方程。由于这一次每个点的w(表征了深度信息)都比上一次迭代时更准确,因此会得到更精确的转换矩阵,而更精确的转换矩阵反过来又能让我们求得各点更精确的深度信息和w。如此往复循环反馈,就可逐步逼近精确解。

 

openCV里用cvPOSIT()函数实现POSIT迭代,具体的函数用法网上有很多介绍不再重复了。顺带提一下openCV里的另两个函数solvePNP()和cvFindExtrinsicCameraParams2(),这两个函数功能与POSIT类似,也是在已知一组点对应的图像坐标和世界坐标以及摄像头内参数的情况下计算物体的3D姿态,不过与POSIT不同的是,它们不是求近似解,而是直接求精确解。既然可以直接求精确解了,那POSIT估计算法还有什么意义呢?

其实理论上,只要获得3个点的信息,就可以得出旋转矩阵R和平移向量T了:

R和T共有12个未知量,每个点的坐标代入前面的“---原始方程--”中,消去w,可得到2个独立的方程,3个点就可以得到6个线性方程,再加上R自身的正交矩阵特征(每行、每列都是单位向量,模长为1)又可以得到6个独立的方程(非线性),共12个方程。

但实际中,解非线性方程很麻烦,所以openCV中应该是用了其他的优化方法。最无奈地,我们可以找6个点,每个点用“---原始方程--”消去w得到2个线性方程,最终也能得到12个方程,不过由于这种方法的求解过程中直接无视了正交矩阵R本身的特征,最后得到的结果会由于点坐标的测量误差和计算误差而稍微违反R自身的正交矩阵约束,当然这可以通过迭代弥补,但会增加算法的复杂度。可能有人会疑惑,同样是从3行的“---原始方程--”转化成2行的方程,为什么POSIT方法只需要四个点就可以求解,而这里却需要6个点?要知道,这里只是利用线性关系消去了w,但保留了原来第三行中的未知量,因此未知量的数量保持12不变;而POSIT方法中,直接为w选取了一个估计值,并删去了“---原始方程--”的第3行,这样方程中才少了4个未知量只剩下8个,所以利用4个点的坐标才得以求解。

于是,我们大概就能猜到既然有精确求解的算法却还要保留POSIT估计算法的原因了:如果只有少数点的信息(比如4个),又不想求解非线性方程,那就该POSIT上了。

 

 

OpenCV4读书笔记day11:单目位姿估计 一.单目位姿估计   根据相机成像模型,如果已知相机的内参矩阵、世界坐标系中若干空间点的三维坐标和空间点在图像中投影的二维坐标,那么可以计算出世界坐标系到相机坐标系的旋转向量和平移向量。如图所示,当知道点ci在世界坐标系下的三维坐标和这些点在图像中对应点的二维坐标时,结合相机的内参矩阵和畸变系数,就可以计算出世界坐标系变换到相机坐标系的旋转向量和平移向量。   在这种情况下,可以估计相机在世界坐标系中的位姿。如果将世界坐标系看成前一时刻的相机坐标系姿态,ci在世界坐标系下的三维坐标看成ci在前一时刻相机坐 阅读详情

相关推荐

opencv (六十)单目位姿估计

我们可以想象,在一幅图像中,最少只要知道三个点的空间坐标即3D坐标,就可以用于估计相机的运动以及相机的姿态。而PnP常见的解法有 直接线性变换、P3P、BA等,在后续几篇博文中,将以基于opencv的solvepnp(P4P)同时借助简单的二维码QRcode来实现相机位姿的估计。因此,PnP方法不需要使用对极约束,又可以在很少的匹配点中获得较好的运动估计。而特征点的空间坐标,我们可以通过深度图来确定,亦可在程序初始化时,通过设定世界坐标系的方法解得。知识相对距离,因为有单位比例等,无法知道真正的距离;

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 801

POSIT算法

一、基本思想:算法分两部分 (1)带有比例系数的正交投影变换SOP,根据线性方程组求出旋转矩阵和平移向量; (2)由得出的旋转矩阵和平移向量系数,更新比例系数,(scale factor),再由比例系数更新原有的点进行迭代。 二、算法过程: (1)假设矩阵 和平移向量,f是焦距,在透视投影变换中,, 而在SOP中,,其中比例因子是s=f/Z0。 (2)作为基本的透视投影变换,将3D点透

lyk314949530的专栏 4076

42、投影与3D视觉:原理、算法及应用

本文深入探讨了计算机视觉中的3D视觉技术,涵盖投影原理、仿射与透视变换、鸟瞰图转换实现方法以及POSIT姿态估计算法。通过OpenCV函数详解和代码示例,展示了如何从二维图像中恢复三维信息,并介绍了立体视觉和基于运动的结构恢复等多图像三维重建技术。文章还展望了3D视觉在机器人导航、自动驾驶和增强现实等领域的广泛应用前景。

h6j7k8l9p0的博客 51

CVPR 2017|SfMLearner:单目视频中深度和姿态估计的无监督算法

🏆作者提出了一个单目相机的视频序列进行深度估计与运动估计,作者的方法是完全无监督的,端到端的学习,作者使用了单视角深度网络和多姿态网络,提出了一个图像(predict)与真实的下一帧(goundturth)计算loss,作为无监督的依据,实现无监督学习。使用KITTI数据集证明了他们的有效性:1.合成的深度图与监督学习的方法是可比的;2. 在可比较的输入设置下,姿势估计与已建立的SLAM系统相比性能优越

yzfzzz的博客 2549

单目相机位姿估计的稳健正交迭代方法

单目位姿估计是计算机视觉中一个基础而重要的问题,在机器人定位、虚拟现实、图像精密测量等领域应用广泛。在实际应用中,参考点坐标不可避免地含有粗差点,导致估计结果偏离真值,为此,提出自适应加权的稳健正交迭代算法。该算法采用稳健估计方法自动识别粗差点,并赋予其较小权值,以提高算法的稳健性。实验结果表明,稳健正交迭代算法求解精度高、稳健性好,可有效抑制不同个数、不同水平的粗差影响。当20个观测点中存在8个水平为60 pixel的粗差点时,本文解算精度分别比经典正交迭代算法和加权正交迭代算法高2个和1个数量级。

手把手教你用ComfyUI搭建高效AI绘画工作流:从基础到高级技巧

本文详细介绍了如何使用ComfyUI构建高效的AI绘画工作流,从基础配置到高级技巧全面覆盖。通过模块化设计,ComfyUI显著提升显存利用率和创作灵活性,适合从新手到专业用户。文章包含部署指南、工作流搭建、性能优化及行业应用案例,帮助读者快速掌握AI绘画核心技术。

7up55的博客 718

POSIT算法原理---opencv 3D姿态估计

文章转自:http://blog.youkuaiyun.com/newthinker_wei/article/details/45748157 3D姿态估计-POSIT算法   POSIT算法,Pose from Orthography and Scaling with Iterations, 比例正交投影迭代变换算法: 用于估计物体的3D姿态(相对于镜头的平移和旋转量)。算法正常

tianzhu1026的专栏 2700

别再手动搬数据了!用rclone一键同步MinIO到华为云OBS的保姆级教程

本文详细介绍了如何使用rclone工具实现MinIO到华为云OBS的数据迁移,包括环境准备、双端配置、迁移前验证、实战迁移及后期监控等步骤。通过rclone的增量同步、断点续传等功能,确保数据迁移高效安全,特别适合需要跨云存储迁移的用户。

weixin_30839881的博客 523

立体视觉的文章,帮助理解基础矩阵F与R、T的关系

http://blog.youkuaiyun.com/xiao4399/article/details/48037287

lyh666的笔记 1516

C语言 函数

一、什么是函数 二、函数的相关语法 三、函数编码规范

m0_57105760的博客 1890

RK3568适配MIPI屏幕触摸,触摸延时很大

我用的是系统,接了一个,设备树已经正确配置,evtest测试坐标值和触摸位置都是准确的。但是出现了一个:我在屏幕上点一下,要等大约 2 秒才能在evtest里看到坐标事件打印。这种现象在 Goodix 系列触摸驱动里比较少见,一般意味着。

小灰灰的博客 1363

3D头部姿态估计:AAM和POSIT算法终极实战指南

想要掌握计算机视觉中的核心技术吗?3D头部姿态估计正是连接2D图像与3D世界的关键桥梁!🎯 本文将通过主动外观模型(AAM)和POSIT算法,带你深入理解这一前沿技术。 ## 什么是3D头部姿态估计? 3D头部姿态估计是计算机视觉中的重要研究方向,它能够从2D图像中准确计算出人头的3D旋转角度和位置信息。这项技术在虚拟现实、人机交互、驾驶员监控系统等领域有着广泛应用。 ## AAM算法详解

gitblog_01054的博客 355

Qemu开发ARM篇-3、qemu运行uboot演示

在上一篇文章中,我们搭建了交叉编译工具链,并成功进行了uboot的交叉编译,在该篇中,我们将演示如何利用qemu运行上一篇中交叉编译的uboot程序。

sinat_33909696的博客 1211

【OpenCV】 POSIT 算法 -- 3D姿态估计

Backto OpenCV Index POSIT(Pose from Orthography and Scaling with Iterations), 比例正交投影迭代变换算法. Pose : 首先这个算法用于估计 Pose Iterations : 其次, 这个算法采用优化迭代的算法估计 pose Orthography : 这个迭代的初始值是认定 物理坐标点在一个平面上, 因此有 ...

北境の守望者 2400

为什么devc++编译项目会失败?提示gcc无法正常启动...

根据你的描述,编译能正常进行时,只打开源文件并没有问题,问题主要出现在创建项目后编译失败,这通常与 Makefile 配置、环境变量、编译器路径设置等因素有关。你可以检查 Makefile 配置,验证 DevC++ 的编译器环境设置,或者尝试清理并重新配置项目。如果问题仍然存在,可以尝试重装 DevC++ 或重新配置工具链。希望如上措施及解决方案能够帮到有需要的你。

**My Coding Family** 1376

YOLOv11改进 ,YOLOv11改进主干网络为MobileNetV3,助力涨点

MobileNetV3通过结合硬件感知网络架构搜索(NAS)和NetAdapt算法,通过新颖的架构改进进一步提升了性能。本文开始探讨了自动化搜索算法与网络设计如何协同工作,以利用互补方法来提升整体技术水平。通过这一过程,创建了两个新的MobileNet模型:MobileNetV3-Large和MobileNetV3-Small,分别针对高资源和低资源使用场景。这些模型随后被适配并应用于目标检测和语义分割任务。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1935

使用OpenCV和Dlib进行人头姿态估计

转自:https://blog.youkuaiyun.com/u012525096/article/details/78348765 原文地址:http://www.learnopencv.com/head-pose-estimation-using-opencv-and-dlib/        效果图: 在本教程中我们将学习如何估计人类的姿势使用OpenCV和Dlib照片。 在进行本教程之前,...

ZouZou的专栏 2195

[明道云] -基础教学5- 明道云 40 种控件详解与场景解析

明道云工作表提供40种业务控件,涵盖文本、数值、关联、公式等类型,支持各类业务场景。文本类支持多行输入、正则校验;数值/金额类提供进度条、百分比显示等功能;关联类实现多表数据引用;公式/函数类支持复杂逻辑运算;自动化类包括打印模板、API调用等控件。合理使用这些控件可提升数据收集质量和自动化效率,同时需注意控件联动的性能影响和权限配置。关键控件包括关联记录、级联选择、公式计算等,适用于订单管理、客户信息关联等业务场景。

每日出拳老爷子的博客 8541

使用POSIT算法估计物体角度

POSIT算法(DeMenthon & Davis 1995) 能够根据2D图像中的若干特征点位置,估计出物体在3D上角度(比如人脸)。下面是使用OpenCV的POSIT算法的使用示例,引自:opencv posit sample 1、对象声明 CvPOSITObject* positObject; 就是这个简单的CvPOSITObject的结构体。

shaoxiaohu的专栏 1万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

使用计算机视觉实战项目精通 OpenCV(三)

简而言之,Active Appearance Models 是结合了纹理和形状的模型参数化,再加上有效的搜索算法,该算法可以准确指出模型在图片框中的位置和位置。为此,我们将从“活动形状模型”部分开始,将看到它们与界标位置更紧密相关。以下各节将更好地描述主成分分析和一些动手经验。然后,我们将能够从 OpenCV 的 Delaunay 函数中获得一些帮助,并学习一些三角剖分。从那时起,我们将逐步发展到在三角形纹理扭曲部分中应用分段仿射扭曲,在该部分中我们可以从对象的纹理中获取信息。

龙哥盟 837

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Mastering OpenCV with Practical Computer Vision Projects_full 章节翻译-7

感谢翻译,译文原链接http://94it.net/a/jingxuanboke/2014/0228/255204.html 学习了 Chapter 7:3D Head Pose Estimation Using AAM and POSIT 一个好的计算机视觉算法如果没有伟大健壮的功能以及广泛的普遍化和一个坚实的数学基础是不完整的。所有的这些优点伴随着主要由TimCootes开发的...

xiao_lxl的专栏 3672

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Java opencv3d计算姿态_关于OpenCV的那些事——相机姿态更新

上一节我们使用张正友相机标定法获得了相机内参,这一节我们使用 PnP (Perspective-n-Point)算法估计相机初始姿态并更新之。推荐3篇我学习的博客:【姿态估计】Pose estimation algorithm 之 Robust Planar Pose (RPP)algorithm,POSIT算法的原理--opencv 3D姿态估计,三维姿态:关于solvePnP与cvPOSIT。...

weixin_26854475的博客 332
上一篇: Harris角点检测原理分析
下一篇: opencv中的各种“矩阵”
NewThinker_wei
博客等级 码龄14年 521粉丝 51原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值