OpenCV的solvePnP函数和Dlib估计头部姿势

这篇具有很好参考价值的文章主要介绍了OpenCV的solvePnP函数和Dlib估计头部姿势。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、姿势估计概述

1、概述

在许多应用中,我们需要知道头部是如何相对于相机倾斜的。例如,在虚拟现实应用程序中,可以使用头部的姿势来渲染场景的右视图。在驾驶员辅助系统中,在车辆中观察驾驶员面部的摄像头可以使用头部姿势估计来查看驾驶员是否正在注意道路。当然,人们可以使用基于头部姿势的手势来控制免提应用程序/游戏。例如,从左到右偏头可能表示“否”。

2、姿态估计

在计算机视觉中,物体的姿态是指它相对于相机的相对方向和位置。您可以通过相对于相机移动对象或相对于对象移动相机来更改姿势

姿态估计问题在计算机视觉术语中通常称为Perspective-n-Point问题或 PNP。在这个问题中,目标是在我们有一个校准过的相机时找到物体的位姿,并且我们知道物体上n 个3D 点的位置以及相应的 2D 投影图片。

3、在数学上表示相机运动

3D 刚体相对于相机只有两种运动。

平移:将相机从其当前的 3D 位置移动(X, Y, Z)到新的 3D 位置(X', Y', Z')称为翻译。如您所见,平移有 3 个自由度——您可以在 X、Y 或 Z 方向上移动。翻译由向量表示\mathbf{t}这等于(X' - X,Y' - Y,Z' - Z).

旋转:您还可以围绕X,是和Z轴。因此,旋转也具有三个自由度。表示旋转的方式有很多种。您可以使用欧拉角(roll、pitch 和 yaw)来表示它,a3\次3 旋转矩阵,或旋转方向(即轴)和角度。

因此,估计 3D 对象的姿态意味着找到 6 个数字——三个用于平移,三个用于旋转。

4、姿势估计需要什么

要计算图像中对象的 3D 姿势,您需要以下信息

(1)几个点的 2D 坐标

您需要图像中几个点的 2D (x,y) 位置。对于人脸,你可以选择眼角、鼻尖、嘴角等。Dlib 的面部特征检测器为我们提供了许多可供选择的点。在本教程中,我们将使用鼻尖、下巴、左眼左眼角、右眼右眼角、左嘴角和右嘴角。

(2)相同点的 3D 位置

您还需要 2D 特征点的 3D 位置。您可能会认为需要照片中人物的 3D 模型才能获得 3D 位置。理想情况下是的,但在实践中,你不会。一个通用的 3D 模型就足够了。你从哪里得到一个头部的 3D 模型?好吧,您真的不需要完整的 3D 模型。您只需要一些任意参考框架中几个点的 3D 位置。在本教程中,我们将使用以下 3D 点。

鼻尖 : ( 0.0, 0.0, 0.0)

下巴:(0.0,-330.0,-65.0)

左眼左眼角:(-225.0f, 170.0f, -135.0)

右眼角:( 225.0, 170.0, -135.0)

左嘴角:(-150.0, -150.0, -125.0)

右嘴角:(150.0, -150.0, -125.0)

请注意,上述点位于某个任意参考系/坐标系中。这称为世界坐标(在 OpenCV 文档中也称为模型坐标)。

图像处理中涉及到的四个坐标系:

solvepnp,ML/CV,opencv,计算机视觉,unity,Powered by 金山文档

(3)相机的内在参数

如前所述,在这个问题中,假设相机是经过校准的。换句话说,需要知道相机的焦距、图像中的光学中心和径向畸变参数。所以你需要校准你的相机。不过可以不使用精确的 3D 模型,而使用近似状态。可以通过图像的中心来近似光学中心,通过以像素为单位的图像宽度来近似焦距,并假设不存在径向畸变。

5、姿势估计算法

有几种姿势估计算法。第一个已知的算法可以追溯到 1841 年。这里简要介绍一下。

有三个坐标系。上面显示的各种面部特征的 3D 坐标是世界坐标。如果我们知道旋转和平移(即姿势),我们可以将世界坐标中的 3D 点转换为相机坐标中的 3D 点。使用相机的内在参数(焦距,光学中心等),可以将相机坐标中的3D点投影到图像平面(即图像坐标系)上。

solvepnp,ML/CV,opencv,计算机视觉,unity,Powered by 金山文档

在上图中,O是相机的中心,图中所示的平面是图像平面。我们找出投影的方程3D点的到图像平面上。

关于3D到2D的投影可以简单参考下面链接

https://skydance.blog.csdn.net/article/details/124991406

假设我们知道位置(U、V、W)一个 3D 点磷在世界坐标中。如果我们知道旋转R(一个 3×3 矩阵)和平移t(一个 3×1 向量),相对于相机坐标的世界坐标,我们可以计算位置(X, Y, Z)点的P在相机坐标系中使用以下等式。

在扩展形式中,上面的等式看起来像这样

在线性代数中,如果我们知道足够数量的点对应(即(X, Y, Z)和(U、V、W)),上面是一个线性方程组,其中和是未知数,您可以轻松解决未知数。

我们知道 3D 模型上的许多点(即(U、V、W)),但我们不知道(X, Y, Z). 我们只知道二维点的位置(即(x, y))。在没有径向畸变的情况下,坐标(x, y)点的p图像坐标由下式给出

其中和是 x 和 y 方向上的焦距,并且是光学中心。当涉及径向失真时,事情会变得稍微复杂一些,暂将其省略。

那个怎么样s在等式中?这是一个未知的比例因子。它存在于等式中,因为在任何图像中我们都不知道深度。如果你加入任何一点磷在 3D 中到中心○相机,点p,射线与像平面相交的地方是P. 请注意,沿着连接相机中心和点的射线的所有点P产生相同的图像。

上述形式的方程可以通过使用称为直接线性变换 (DLT)的方法使用一些代数魔法来求解。您可以在发现方程几乎是线性但偏离未知比例的问题时随时使用 DLT。

6、Levenberg-Marquardt 优化

上面提到的 DLT 解决方案不是很准确,原因如下。一、旋转具有三个自由度,但 DLT 解决方案中使用的矩阵表示有 9 个数字。DLT 解决方案中没有任何东西强制估计的 3×3 矩阵成为旋转矩阵。更重要的是,DLT 解决方案不会最小化正确的目标函数。理想情况下,我们希望最小化下面描述的重投影误差。

如果我们知道正确的姿势 (和),我们可以通过将 3D 点投影到 2D 图像上来预测图像上 3D 面部点的 2D 位置。换句话说,如果我们知道和我们可以找到重点p在每个 3D 点的图像中磷.

我们还知道 2D 面部特征点(使用 Dlib 或手动点击)。我们可以查看投影的 3D 点和 2D 面部特征之间的距离。当估计的姿势完美时,投影到图像平面上的 3D 点将与 2D 面部特征几乎完美地对齐。当姿态估计不正确时,我们可以计算重投影误差度量——投影的 3D 点和 2D 面部特征点之间的距离平方和。

如前所述,姿态的近似估计(和) 可以使用 DLT 解决方案找到。改进 DLT 解决方案的一种简单方法是随机改变姿势 (和) 并检查重投影误差是否减小。如果是这样,我们可以接受新的姿势估计。我们可以继续扰动和一次又一次地寻找更好的估计。虽然这个过程会起作用,但它会很慢。事实证明,有原则性的方法可以迭代地改变和使重投影误差减小。

二、solvePnP函数

1、函数原型

如OpenCV文档中可见,姿势估计有一系列solvePnP函数,这里仅介绍solvePnP函数。

此函数使用不同的方法返回将对象坐标系中表示的 3D 点转换为相机坐标系的旋转和平移矢量:

P3P 方法(SOLVEPNP_P3P、SOLVEPNP_AP3P):需要 4 个输入点才能返回唯一解。

SOLVEPNP_IPPE 输入点必须 >= 4 并且对象点必须共面。

SOLVEPNP_IPPE_SQUARE 适用于标记姿势估计的特殊情况。 输入点数必须为 4。对象点必须按顺序定义。

对于所有其他标志,输入点的数量必须 >= 4,并且对象点可以采用任何配置。

bool cv::solvePnP (InputArray objectPoints, InputArray imagePoints, InputArray cameraMatrix, InputArray distCoeffs, OutputArray rvec, OutputArray tvec, bool useExtrinsicGuess=false, int flags=SOLVEPNP_ITERATIVE)

2、参数详解

objectPoints对象坐标空间中的对象点数组,Nx3 1通道或 1xN/Nx1 3通道,其中 N 是点数。 vector<Point3d> 也可以在这里传递。

imagePoints对应图像点的数组,Nx2 1通道或 1xN/Nx1 2通道,其中 N 是点数。 vector<Point2d> 也可以在这里传递。

cameraMatrix输入相机固有矩阵

distCoeffs4、5、8、12 的失真系数 (k1,k2,p1,p2[,k3[,k4,k5,k6[,s1,s2,s3,s4[,τx,τy]]]]) 的输入向量 或 14 个元素。 如果向量为 NULL/空,则假定零失真系数。

rvec输出旋转矢量(参见 Rodrigues),它与 tvec 一起将点从模型坐标系带到相机坐标系。

tvec输出平移向量。

useExtrinsicGuess用于 SOLVEPNP_ITERATIVE 的参数。 如果为真 (1),则函数使用提供的 rvec 和 tvec 值分别作为旋转和平移向量的初始近似值,并进一步优化它们。

flags解决 PnP 问题的方法:参见 calib3d_solvePnP_flags

三、OpenCV源码

1、源码路径

opencv\modules\calib3d\src\solvepnp.cpp

四、效果图像示例

这里面部特征点的位置是硬编码的,可以使用dlib进行面部特征点的定位然后更改image_points。

https://skydance.blog.csdn.net/article/details/107896225

可以简单参考上面的链接

solvepnp,ML/CV,opencv,计算机视觉,unity,Powered by 金山文档

python版本

https://blog.csdn.net/bashendixie5/article/details/125689183

https://blog.csdn.net/weixin_41010198/article/details/116028666文章来源地址https://www.toymoban.com/news/detail-815526.html

到了这里,关于OpenCV的solvePnP函数和Dlib估计头部姿势的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • cv::solvePnP使用方法及注意点详解(OpenCV/C++)

    1、参数说明: objectPoints :一个 vectorcv::Point3f,包含了在世界坐标系中的三维点的坐标,至少需要4个点。 imagePoints :一个 vectorcv::Point2f,包含了对应的图像上的二维点的坐标,与 objectPoints 中的点一一对应。 cameraMatrix :相机的内参数矩阵,类型为 cv::Mat,一般为 3x3 的浮点数

    2024年02月05日
    浏览(39)
  • PnP解算及SolvePnp用法

    PnP问题:Perspective-n-Point问题。 参考下图, 给定n个3D空间参考点,以及各点在相机图像上对应的成像点,求参考点所在坐标系与相机的空间关系。 即: 已知条件1:给定匹配点对:世界坐标系(图中OwXwYwZw)下的n个3D点坐标及其对应在图像坐标系(图中ouv)下的2D点坐标。 已

    2024年02月03日
    浏览(36)
  • 学习关于 2D 和 3D 姿势估计的知识

    介绍 让我们了解一下如何将姿势估计用于 Snapchat 滤镜。你有没有想过 Snapchat 的滤镜为什么这么吸引人?Snapchat 上的滤镜种类繁多,从有趣的到化妆的滤镜。这更像是滑动滤镜并选择一个你感兴趣的滤镜来拍照。 阅读本文并不需要任何有关姿势估计的基础知识。本文从头到尾

    2023年04月08日
    浏览(40)
  • SynergyNet(头部姿态估计 Head Pose Estimation)复现 demo测试

    SynergyNet(github):https://github.com/choyingw/SynergyNet b站:https://www.bilibili.com/video/BV1Ph4y1k7LK/ 我用的AutoDL平台搭建 选择镜像 PyTorch 1.9.0 Python 3.8(ubuntu18.04) Cuda 11.1 安装其它包: 备注:如果无法下载,就到github中下载压缩包,然后上传解压安装 或者使用码云下载: 需要下载如下文件

    2024年02月14日
    浏览(44)
  • 在 PyTorch 中使用关键点 RCNN 进行人体姿势估计--附源码

    人体姿态估计是计算机视觉领域的一个重要研究领域。它涉及估计人体上的独特点,也称为 关键点 。在这篇博文中,我们将讨论一种在包含人类的图像上查找关键点的算法,称为 Keypoint-RCNN 。该代码是使用 Pytorch 使用 Torchvision 库编写的。 假设您想要建立一名私人健身教练,

    2024年02月12日
    浏览(40)
  • 基于人体姿势估计的舞蹈检测(AI Dance based on Human Pose Estimation)

    人体姿势骨架以图形格式表示人的方向。本质上,它是一组坐标,可以连接起来描述人的姿势。骨架中的每个坐标都被称为一个部分(或一个关节,或一个关键点)。两个部分之间的有效连接称为一对(或分支)。下面是一个人体姿势骨架样本。 因此,在本文中,我们将研究如何

    2024年02月11日
    浏览(43)
  • opencv-目标追踪-dlib

    2024年02月12日
    浏览(35)
  • opencv、dlib、paddlehub人脸检测

    opencv、dlib、paddlehub检测效果对比。dlib和paddlehub的效果相对好一点。 说明:本文只做人脸检测不识别,找识别的不用看本文。 依赖(用1个就行) dlib需要C++编译器(gcc 或 vs) opencv检测     dlib检测  PaddleHub检测 APIPOST调接口测试     axios调用示例 jquery调用示例

    2024年02月08日
    浏览(47)
  • 【MATLAB源码-第140期】基于matlab的深度学习的两用户NOMA-OFDM系统信道估计仿真,对比LS,MMSE,ML。

    深度学习技术在无线通信领域的应用越来越广泛,特别是在非正交多址接入(NOMA)和正交频分复用(OFDM)系统中,深度学习技术被用来提高信道估计的性能和效率。信道估计是无线通信系统中的关键技术之一,它直接影响着系统的通信质量和可靠性。本文将详细介绍深度学

    2024年02月20日
    浏览(55)
  • 【超详细】【YOLOV8使用说明】一套框架解决CV的5大任务:目标检测、分割、姿势估计、跟踪和分类任务【含源码】

    YOLOv8 是Ultralytics的最新版本YOLO。作为最先进的 SOTA 模型,YOLOv8 建立在以前版本成功的基础上,引入了新功能和改进,以增强性能、灵活性和效率。YOLOv8 支持全方位的视觉 AI 任务,包括 检测 、 分割 、 姿势估计 、 跟踪 和 分类 。这种多功能性使用户能够在不同的应用程序

    2024年02月06日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包