gpt4 book ai didi

ios - OpenCV + OpenGL : proper camera pose using solvePnP

转载 作者:可可西里 更新时间:2023-11-01 05:55:01 25 4
gpt4 key购买 nike

我在使用 OpenCV 从 iPad 相机获取正确的相机姿势时遇到问题。

我正在使用定制的 2D 标记(基于 AruCo library)- 我想使用 OpenGL 在该标记上渲染 3D 立方体。

为了接收相机姿势,我使用了 OpenCV 的 solvePnP 函数。

根据 THIS LINK我是这样做的:

cv::solvePnP(markerObjectPoints, imagePoints, [self currentCameraMatrix], _userDefaultsManager.distCoeffs, rvec, tvec);

tvec.at<double>(0, 0) *= -1; // I don't know why I have to do it, but translation in X axis is inverted

cv::Mat R;
cv::Rodrigues(rvec, R); // R is 3x3

R = R.t(); // rotation of inverse
tvec = -R * tvec; // translation of inverse

cv::Mat T(4, 4, R.type()); // T is 4x4
T(cv::Range(0, 3), cv::Range(0, 3)) = R * 1; // copies R into T
T(cv::Range(0, 3), cv::Range(3, 4)) = tvec * 1; // copies tvec into T
double *p = T.ptr<double>(3);
p[0] = p[1] = p[2] = 0;
p[3] = 1;

相机矩阵和距离系数来自 findChessboardCorners 函数,imagePoints 是手动检测到的标记角(您可以在下面发布的视频中看到它们是绿色方 block ),和 markerObjectPoints 是代表标记角的手动硬编码点:

markerObjectPoints.push_back(cv::Point3d(-6, -6, 0));
markerObjectPoints.push_back(cv::Point3d(6, -6, 0));
markerObjectPoints.push_back(cv::Point3d(6, 6, 0));
markerObjectPoints.push_back(cv::Point3d(-6, 6, 0));

因为标记在现实世界中有 12 厘米长,所以我在中选择了相同的尺寸以便于调试。

因此,我收到了 4x4 矩阵 T,我将在 OpenCV 中将其用作 ModelView 矩阵。使用 GLKit 绘图功能看起来或多或少像这样:

- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
// preparations
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
float aspect = fabsf(self.bounds.size.width / self.bounds.size.height);
effect.transform.projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(39), aspect, 0.1f, 1000.0f);

// set modelViewMatrix
float mat[16] = generateOpenGLMatFromFromOpenCVMat(T);
currentModelMatrix = GLKMatrix4MakeWithArrayAndTranspose(mat);
effect.transform.modelviewMatrix = currentModelMatrix;

[effect prepareToDraw];

glDrawArrays(GL_TRIANGLES, 0, 36); // draw previously prepared cube
}

我没有将所有东西都绕 X 轴旋转 180 度(正如之前链接的文章中提到的那样),因为我看起来没有必要。

问题是它不起作用!平移向量看起来不错,但是 X 和 Y 旋转搞砸了:(

我录制了一个视频来展示这个问题:

http://www.youtube.com/watch?v=EMNBT5H7-os

我几乎尝试了所有方法(包括一个一个地反转所有轴),但实际上没有任何效果。

我该怎么办?我应该如何正确显示该 3D 立方体?来自 solvePnP 的平移/旋转向量看起来很合理,所以我想我无法将这些向量正确映射到 OpenGL 矩阵。

最佳答案

感谢来自 http://answers.opencv.org/ 的 Djo1509我发现问题是不必要的转置旋转矩阵 R 矩阵用作矩阵 T 的一部分,以及不必要的 tvec = -R * tvec 操作。

更多信息请看there

关于ios - OpenCV + OpenGL : proper camera pose using solvePnP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19612704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com