如何在Dlib C ++中获得3D头部姿势估计坐标轴

造雨机

Dlib C ++可以很好地检测界标并估计人脸姿势。但是,如何获得头部姿势的3D坐标轴方向(x,y,z)?

成功

不久前,我也遇到了同样的问题,搜索并找到了1-2条有用的博客文章,此链接将为您简要介绍所涉及的技术,如果您只需要计算小数点后的3D姿势,则可以跳过OpenGL渲染部分,但是,如果您想在视觉上获得反馈,那么您也可以尝试使用OpenGL,但是我建议您以初学者的身份忽略OpenGL部分,因此将从github页面提取的最小工作代码段将看起来像这样:

在此处输入图片说明

// Reading image using OpenCV, you may use dlib as well.
cv::Mat img = cv::imread(imagePath);

std::vector<double> rv(3), tv(3);
cv::Mat rvec(rv),tvec(tv);
cv::Vec3d eav;

// Labelling the 3D Points derived from a 3D model of human face.
// You may replace these points as per your custom 3D head model if any
std::vector<cv::Point3f > modelPoints;
modelPoints.push_back(cv::Point3f(2.37427,110.322,21.7776));    // l eye (v 314)
modelPoints.push_back(cv::Point3f(70.0602,109.898,20.8234));    // r eye (v 0)
modelPoints.push_back(cv::Point3f(36.8301,78.3185,52.0345));    //nose (v 1879)
modelPoints.push_back(cv::Point3f(14.8498,51.0115,30.2378));    // l mouth (v 1502)
modelPoints.push_back(cv::Point3f(58.1825,51.0115,29.6224));    // r mouth (v 695)
modelPoints.push_back(cv::Point3f(-61.8886f,127.797,-89.4523f));  // l ear (v 2011)
modelPoints.push_back(cv::Point3f(127.603,126.9,-83.9129f));     // r ear (v 1138)

// labelling the position of corresponding feature points on the input image.
std::vector<cv::Point2f> srcImagePoints = {cv::Point2f(442, 442), // left eye
                                           cv::Point2f(529, 426), // right eye
                                           cv::Point2f(501, 479), // nose
                                           cv::Point2f(469, 534), //left lip corner
                                           cv::Point2f(538, 521), // right lip corner
                                           cv::Point2f(349, 457), // left ear
                                           cv::Point2f(578, 415) // right ear};


cv::Mat ip(srcImagePoints);

cv::Mat op = cv::Mat(modelPoints);
cv::Scalar m = mean(cv::Mat(modelPoints));

rvec = cv::Mat(rv);
double _d[9] = {1,0,0,
                0,-1,0,
                0,0,-1};
Rodrigues(cv::Mat(3,3,CV_64FC1,_d),rvec);
tv[0]=0;tv[1]=0;tv[2]=1;
tvec = cv::Mat(tv);


double max_d = MAX(img.rows,img.cols);
double _cm[9] = {max_d,     0, (double)img.cols/2.0,
                 0    , max_d, (double)img.rows/2.0,
                 0    ,     0,                  1.0};
cv::Mat camMatrix = cv::Mat(3,3,CV_64FC1, _cm);

double _dc[] = {0,0,0,0};
solvePnP(op,ip,camMatrix,cv::Mat(1,4,CV_64FC1,_dc),rvec,tvec,false,CV_EPNP);

double rot[9] = {0};
cv::Mat rotM(3,3,CV_64FC1,rot);
Rodrigues(rvec,rotM);
double* _r = rotM.ptr<double>();
printf("rotation mat: \n %.3f %.3f %.3f\n%.3f %.3f %.3f\n%.3f %.3f %.3f\n",
       _r[0],_r[1],_r[2],_r[3],_r[4],_r[5],_r[6],_r[7],_r[8]);

printf("trans vec: \n %.3f %.3f %.3f\n",tv[0],tv[1],tv[2]);

double _pm[12] = {_r[0],_r[1],_r[2],tv[0],
                  _r[3],_r[4],_r[5],tv[1],
                  _r[6],_r[7],_r[8],tv[2]};

cv::Mat tmp,tmp1,tmp2,tmp3,tmp4,tmp5;
cv::decomposeProjectionMatrix(cv::Mat(3,4,CV_64FC1,_pm),tmp,tmp1,tmp2,tmp3,tmp4,tmp5,eav);
printf("Face Rotation Angle:  %.5f %.5f %.5f\n",eav[0],eav[1],eav[2]);

输出:

                       **X**     **Y**    **Z**

Face Rotation Angle:  171.44027 -8.72583 -9.90596

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用OpenCV绘制3D坐标轴以进行人脸姿势估计?

来自分类Dev

如何在C ++中的3D数组中获得三维数组?

来自分类Dev

如何在 dlib 的 array2d<rgb_pixel> 图像上从 dlib::rectangle 创建 cv::Mat?

来自分类Dev

如何在Objective-C中使用dlib的shape_predictor?

来自分类Dev

DLIB C ++如何制作dlib ::矩阵的std ::向量

来自分类Dev

如何在Ubuntu 14.04中为python3安装dlib

来自分类Dev

如何在MATLAB中乘以绘图坐标轴之一上的刻度标签?

来自分类Dev

如何在dlib正面人脸检测器中拆分级联水平?

来自分类Dev

如何安排共享坐标轴的图?

来自分类Dev

如何在C中返回坐标结构

来自分类Dev

如何在不更改图形尺寸的情况下将坐标轴放置在图形中?[Python,matplotlib]

来自分类Dev

如何在ThreeJS中获得3D对象尺寸?

来自分类Dev

在C / C ++中,如何在stdout中编辑某个“坐标”?

来自分类Dev

如何在C ++中获得类型的大小?

来自分类Dev

如何在C中获得任意根?

来自分类Dev

如何在C ++中存储3D浮点数组?

来自分类Dev

我如何在Unity 3D中包含SWIG包装的C ++?

来自分类Dev

如何在Unity 3D中执行C#代码?

来自分类Dev

如何在C#中估计创建zipfile的时间

来自分类Dev

如何在C ++中“ sscanf”?

来自分类Dev

如何在C中截断

来自分类Dev

如何在 C 中解析

来自分类Dev

如何在共享坐标轴的子图上消除多余的空白?

来自分类Dev

如何为标题,坐标轴设置matplotlib字体,

来自分类Dev

Matplotlib:如何更改坐标轴的颜色和宽度

来自分类Dev

如何在C中检测ctrl + D?

来自分类Dev

如何在MATLAB中从3D点云中提取xyz坐标

来自分类Dev

如何在c3.js图表库中绘制x,y坐标?

来自分类Dev

如何在C#(Unity3d)中获得正方形上的点的内切圆的点

Related 相关文章

  1. 1

    如何使用OpenCV绘制3D坐标轴以进行人脸姿势估计?

  2. 2

    如何在C ++中的3D数组中获得三维数组?

  3. 3

    如何在 dlib 的 array2d<rgb_pixel> 图像上从 dlib::rectangle 创建 cv::Mat?

  4. 4

    如何在Objective-C中使用dlib的shape_predictor?

  5. 5

    DLIB C ++如何制作dlib ::矩阵的std ::向量

  6. 6

    如何在Ubuntu 14.04中为python3安装dlib

  7. 7

    如何在MATLAB中乘以绘图坐标轴之一上的刻度标签?

  8. 8

    如何在dlib正面人脸检测器中拆分级联水平?

  9. 9

    如何安排共享坐标轴的图?

  10. 10

    如何在C中返回坐标结构

  11. 11

    如何在不更改图形尺寸的情况下将坐标轴放置在图形中?[Python,matplotlib]

  12. 12

    如何在ThreeJS中获得3D对象尺寸?

  13. 13

    在C / C ++中,如何在stdout中编辑某个“坐标”?

  14. 14

    如何在C ++中获得类型的大小?

  15. 15

    如何在C中获得任意根?

  16. 16

    如何在C ++中存储3D浮点数组?

  17. 17

    我如何在Unity 3D中包含SWIG包装的C ++?

  18. 18

    如何在Unity 3D中执行C#代码?

  19. 19

    如何在C#中估计创建zipfile的时间

  20. 20

    如何在C ++中“ sscanf”?

  21. 21

    如何在C中截断

  22. 22

    如何在 C 中解析

  23. 23

    如何在共享坐标轴的子图上消除多余的空白?

  24. 24

    如何为标题,坐标轴设置matplotlib字体,

  25. 25

    Matplotlib:如何更改坐标轴的颜色和宽度

  26. 26

    如何在C中检测ctrl + D?

  27. 27

    如何在MATLAB中从3D点云中提取xyz坐标

  28. 28

    如何在c3.js图表库中绘制x,y坐标?

  29. 29

    如何在C#(Unity3d)中获得正方形上的点的内切圆的点

热门标签

归档