当前位置:   article > 正文

solvepnp函数以及aruco二维码用的estimatePoseSingleMarkers得到的平移旋转是世界系在相机系下的平移旋转

estimateposesinglemarkers

solvepnp函数以及aruco二维码用的estimatePoseSingleMarkers得到的平移旋转是世界系在相机系下的平移旋转,不要反了

estimatePoseSingleMarkers函数是调用solvePnP函数实现的

modules/aruco/src/aruco.cpp · wanghanlin/opencv_contrib - Gitee.com

  1. void estimatePoseSingleMarkers(InputArrayOfArrays _corners, float markerLength,
  2. InputArray _cameraMatrix, InputArray _distCoeffs,
  3. OutputArray _rvecs, OutputArray _tvecs, OutputArray _objPoints,
  4. const Ptr<EstimateParameters>& estimateParameters) {
  5. CV_Assert(markerLength > 0);
  6. Mat markerObjPoints = _getSingleMarkerObjectPoints(markerLength, *estimateParameters);
  7. int nMarkers = (int)_corners.total();
  8. _rvecs.create(nMarkers, 1, CV_64FC3);
  9. _tvecs.create(nMarkers, 1, CV_64FC3);
  10. Mat rvecs = _rvecs.getMat(), tvecs = _tvecs.getMat();
  11. for each marker, calculate its pose
  12. parallel_for_(Range(0, nMarkers), [&](const Range& range) {
  13. const int begin = range.start;
  14. const int end = range.end;
  15. for (int i = begin; i < end; i++) {
  16. solvePnP(markerObjPoints, _corners.getMat(i), _cameraMatrix, _distCoeffs, rvecs.at<Vec3d>(i),
  17. tvecs.at<Vec3d>(i), estimateParameters->useExtrinsicGuess, estimateParameters->solvePnPMethod);
  18. }
  19. });
  20. if(_objPoints.needed()){
  21. markerObjPoints.convertTo(_objPoints, -1);
  22. }
  23. }

这个以二维码为中心点的世界系的xyz的指向,也可以确定出来。红色是x 绿色是y 蓝色是z,符合东北天坐标系。

我自己实际检测运行感觉像是得到的位姿是世界系在相机系下的位姿,真的是这样。
 

输入图片说明


如果是世界系下的位姿,此时得到的x应该是负的,但是实际是正的。

输入图片说明

难道solvepnp函数的输出也是这样的?

输入图片说明


看来我之前solvepnp函数都用错了啊,solvepnp得到的是世界系在相机系下的位姿。
 

输入图片说明


https://blog.csdn.net/weixin_46450859/article/details/133799263
 

输入图片说明

estimatePoseSingleMarkers输出的r,t到底代表了什么-CSDN博客

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
  

闽ICP备14008679号