来自 cv::solvePnP 的世界坐标中的相机位置

2023-12-06

我有一个校准过的相机(固有矩阵和畸变系数),我想知道相机的位置,知道一些 3d 点及其在图像中的对应点(2d 点)。

我知道cv::solvePnP可以帮助我,阅读后this and this我知道我的输出solvePnPrvec and tvec是物体在相机坐标系中的旋转和平移。

所以我需要找出世界坐标系中相机的旋转/平移。

从上面的链接来看,代码似乎很简单,用Python编写:

found,rvec,tvec = cv2.solvePnP(object_3d_points, object_2d_points, camera_matrix, dist_coefs)
rotM = cv2.Rodrigues(rvec)[0]
cameraPosition = -np.matrix(rotM).T * np.matrix(tvec)

我不知道 python/numpy 的东西(我正在使用 C++),但这对我来说没有多大意义:

  • solvePnP 的 rvec、tvec 输出是 3x1 矩阵,3 个元素向量
  • cv2.Rodrigues(rvec) 是一个 3x3 矩阵
  • cv2.Rodrigues(rvec)[0] 是一个 3x1 矩阵,3 个元素向量
  • cameraPosition 是一个 3x1 * 1x3 矩阵乘法,即 3x3 矩阵。我怎样才能在opengl中使用这个简单的glTranslatef and glRotate calls?

如果“世界坐标”指的是“对象坐标”,则必须对 pnp 算法给出的结果进行逆变换。

有一个反转变换矩阵的技巧,可以让您节省反转操作,这通常是昂贵的,并且解释了 Python 中的代码。给定一个变换[R|t],我们有那个inv([R|t]) = [R'|-R'*t], where R'是转置R。因此,您可以编写代码(未测试):

cv::Mat rvec, tvec;
solvePnP(..., rvec, tvec, ...);
// rvec is 3x1, tvec is 3x1

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 = cv::Mat::eye(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

// T is a 4x4 matrix with the pose of the camera in the object frame

Update:以后要用到T对于 OpenGL,您必须记住 OpenCV 和 OpenGL 之间相机框架的轴不同。

OpenCV 使用计算机视觉中常用的参考:X 指向右侧,Y 指向下方,Z 指向前方(如这个图片)。 OpenGL 中相机的坐标系是:X 指向右侧,Y 指向上方,Z 指向后方(如左手边所示)这个图片)。因此,您需要绕 X 轴旋转 180 度。该旋转矩阵的公式为维基百科.

// T is your 4x4 matrix in the OpenCV frame
cv::Mat RotX = ...; // 4x4 matrix with a 180 deg rotation around X
cv::Mat Tgl = T * RotX; // OpenGL camera in the object frame

这些转换总是令人困惑,我可能在某些步骤上是错误的,所以对此持保留态度。

最后,考虑到 OpenCV 中的矩阵在内存中以行优先顺序存储,而 OpenGL 矩阵以列优先顺序存储。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

来自 cv::solvePnP 的世界坐标中的相机位置 的相关文章

随机推荐

  • Selenium 中是否可以通过部分 id 匹配来定位元素

    我正在尝试使用生成的 id 来查找元素 其中 ID 的某些部分是已知的 例如 id page x002e x0023 default create firstname 其中最后 3 个单词 default create firstname
  • Jqgrid 以 inlineNav 样式添加新的空白行

    我想创建Add Edit Save And Delete我的 JqGrid 下方的按钮
  • 使用Angularjs的$http时读取响应头

    我在用 http进行 api 调用 发送一些自定义标头 例如X Foo 但是我还不知道如何阅读它们 在 的里面 http success function data status headers config 功能 headers是一个应该
  • 使用 Zxing 的 Android 条码扫描器

    我想将Zxing集成到android项目中 我是初学者 我已经看到这里描述的方式http bit ly nBszrL不鼓励 最好的方法是通过意图 如这篇文章所述http bit ly o29Uma PS 我不想要扫码机安装在我的设备上 我已
  • Ruby 中的三重单引号与三重双引号

    为什么你可能会使用 代替 as in 艰难地学习 Ruby 第 10 章学习练习 Ruby 中没有三引号 Two String并置的文字被解析为单个文字String文字 所以 Hello World gt HelloWorld 是相同的 H
  • R 中的轴标签:p(Y=y | theta = some)

    我已经搜索遍了 但找不到具有条件符号的代码 如 p a b 我使用的代码 通用 R 代码 而不是 ggplot 是 ylab bquote Pr Y y theta mytheta n n 这给了我一个标签 Pr Y y 0 2 n 10
  • 安装Anaconda后无法安装Python模块

    新注意 我无法通过 binstar 或 anaconda 安装 为什么我不能在 anaconda 之外的 python 中安装 当我不通过连续启动器专门 lunch 时 有没有办法让我的计算机停止使用 python 的 anaconda 安
  • SQL:ORDER BY 两列混合,不基于优先级

    我正在使用 mySQL 我必须按姓氏对联系人姓名进行排序 但如果没有姓氏 我会按名字排序 这看起来像 ORDER BY lastname lastname firstname 然而 这使得带有姓氏的出现在顶部 我想要的行为是将名字和姓氏混合
  • 示例函数中的替换是什么意思? [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 目前不接受答案 当我尝试从数据框中随机选择每组中的 10 个样本时 我试图弄清楚样本函数的工作原理 我有一个 5 列和 7000 行的数据框 我将数据集分成大约 200 个组 然后我想从每组
  • 在 UIButton 的选择器上传递参数

    我有一个detailDisclousurea 的标注上的按钮MKAnnotation 当按下此按钮时 我需要调用一个传递标识参数的方法annotation那叫它 怎么可能呢 这是我的注释视图 MKAnnotationView mapView
  • 如何使用 Git 恢复

    How is git revert used 这可能听起来像是一个重复的问题 但当人们问这个问题时 答案通常是 使用git reset as per 恢复到 Git 中 SHA 哈希的提交 然后当有人问如何使用时git reset人们回复说
  • 车把和异步调用

    我使用这个助手来检查图像是否存在 Handlebars registerHelper checkLogo function url UrlExists url function status if status 200 return new
  • Delphi w Indy 10:无法通过 Web 服务器上的 SSL“最佳实践”通过 TLS 1.2 连接

    问题 我们如何让 Indy 10 与强制执行最新 TLS 1 2 SSL 最佳实践的 Web 服务器配合使用 Microsoft 记录了最佳实践 https technet microsoft com library security ms
  • AvalonDock 现在失去 Alt 键装饰

    I ve been using AvalonDock 2 0 for some time now being key for managing documents in an IDE In the last month or so I ve
  • 如何给物体的旋转设置2个限制?

    当按住 D 向上 W 向下时 我需要使对象在 z 轴上旋转 但限制两个方向的旋转 使用下面提供的代码 我设法使对象在按下时旋转 但它不会停止当达到我的变量设置的两个限制中的任何一个时旋转 我是编码领域的新手 希望您能帮助我解决和理解我的问题
  • 最快的素性测试

    您能否建议一种可在实践中使用的快速 确定性方法来测试大数是否为素数 另外 我想知道如何正确使用非确定性素性测试 例如 如果我使用这样的方法 如果输出为 否 我可以确定一个数字不是素数 但是当输出为 可能 时 其他情况又如何呢 在这种情况下我
  • 为什么我的 Realm 对象不保存存储的值?

    我正在四处寻找一种解决方案 以在我的一个应用程序中实现小型离线数据存储 该解决方案使用起来既简单又快捷 无论如何 我遇到了Realm去做这个 但是 我遇到一个问题 每次启动应用程序时 数据库中的内容都是空的 我完成所有分配并调用开始写事务方
  • 在 R 中将星期几从整数转换为字符串

    我有一个数据集 其中包含一周中的事件数字 1 7 1 是星期一 7 是星期日 我已将其转换为用户可以理解的星期几 星期一 星期二等 只需将该行中的每个 1 实例替换为星期一 等 即可 有没有一个图书馆可以更干净地为我做这件事 set see
  • Django storages S3 - 存储现有文件

    我有 django 1 11 和最新的 django storages 使用 S3 后端进行设置 我正在尝试使用 AWS 图像链接作为起点 以编程方式实例化图像文件 我无法弄清楚如何通过查看源代码 文档来做到这一点 我假设我需要创建一个文件
  • 来自 cv::solvePnP 的世界坐标中的相机位置

    我有一个校准过的相机 固有矩阵和畸变系数 我想知道相机的位置 知道一些 3d 点及其在图像中的对应点 2d 点 我知道cv solvePnP可以帮助我 阅读后this and this我知道我的输出solvePnPrvec and tvec