赞
踩
solvepnp函数以及aruco二维码用的estimatePoseSingleMarkers得到的平移旋转是世界系在相机系下的平移旋转,不要反了
estimatePoseSingleMarkers函数是调用solvePnP函数实现的
modules/aruco/src/aruco.cpp · wanghanlin/opencv_contrib - Gitee.com
- void estimatePoseSingleMarkers(InputArrayOfArrays _corners, float markerLength,
- InputArray _cameraMatrix, InputArray _distCoeffs,
- OutputArray _rvecs, OutputArray _tvecs, OutputArray _objPoints,
- const Ptr<EstimateParameters>& estimateParameters) {
- CV_Assert(markerLength > 0);
-
- Mat markerObjPoints = _getSingleMarkerObjectPoints(markerLength, *estimateParameters);
- int nMarkers = (int)_corners.total();
- _rvecs.create(nMarkers, 1, CV_64FC3);
- _tvecs.create(nMarkers, 1, CV_64FC3);
-
- Mat rvecs = _rvecs.getMat(), tvecs = _tvecs.getMat();
-
- for each marker, calculate its pose
- parallel_for_(Range(0, nMarkers), [&](const Range& range) {
- const int begin = range.start;
- const int end = range.end;
-
- for (int i = begin; i < end; i++) {
- solvePnP(markerObjPoints, _corners.getMat(i), _cameraMatrix, _distCoeffs, rvecs.at<Vec3d>(i),
- tvecs.at<Vec3d>(i), estimateParameters->useExtrinsicGuess, estimateParameters->solvePnPMethod);
- }
- });
-
- if(_objPoints.needed()){
- markerObjPoints.convertTo(_objPoints, -1);
- }
- }
这个以二维码为中心点的世界系的xyz的指向,也可以确定出来。红色是x 绿色是y 蓝色是z,符合东北天坐标系。
我自己实际检测运行感觉像是得到的位姿是世界系在相机系下的位姿,真的是这样。
如果是世界系下的位姿,此时得到的x应该是负的,但是实际是正的。
难道solvepnp函数的输出也是这样的?
看来我之前solvepnp函数都用错了啊,solvepnp得到的是世界系在相机系下的位姿。
https://blog.csdn.net/weixin_46450859/article/details/133799263
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。