OpenCV 项目点在投影之前如何执行转换?

2023-12-31

我有两个 3d 点,我试图使用它们将其投影到 2d 图像平面上cv::projectPoints()。最初这些点不在相机的参考系中,所以我必须转换它们。我正在测试该方法转换的有效性。

首先,我手动将平移应用于我的点,并通过旋转矩阵绕 x 轴进行 -90 度旋转matr.

import numpy as np
import math
import cv2

# center of projection
cop = np.array([-14.45194, 34.59882, 19.11343])

# get rotation
r_vec = cv2.Rodrigues(np.array(matr))[0]
print([round(math.degrees(i),2) for i in r_vec])

# init arrays
coords = np.array([[4.27874, 115.15968, 18.1621], [27.52924, 113.3441, 17.70207]])
transformed_coords = np.zeros(coords.shape)

# transform coords
for b, _ in enumerate(coords):

    arr = np.array([0,0,0])

    # translate
    for r in range(3):
        arr[r] = coords[b][r] - cop[r]

    # rotate
    transformed_coords[b] = np.dot(matr, arr)

接下来我将转换后的坐标传递到projectPoints()并将生成的 2d 点与通过将转换传递到方法中获得的点进行比较。

points_2d = cv2.projectPoints(np.array(transformed_coords), np.array([0.0,0.0,0.0]), np.array([0.0,0.0,0.0]), cam_matrix, distortion)[0]
print("Manual Transformation Projection: ")
print(points_2d )

points_2d = cv2.projectPoints(np.array(coords), np.array(r_vec), np.array(cop), cam_matrix, distortion)[0]
print("\nOpenCV Transformation Projection: ")
print(points_2d )

Output:

[-90.0, 0.0, 0.0] # matr rotation 

Manual Transformation Projection: 
[[[596.41419111 538.38054858]]

 [[159.74685131 557.65317027]]]

OpenCV Transformation Projection: 
[[[1101.1539809  -274.07081182]]

 [[ 738.45477039 -281.42273082]]]

为什么它们不同?

顺便说一下,如果你想重新创建它,这里是凸轮矩阵和畸变:

cam_matrix = np.array([[1561.9015217711233, 0, 944.3790845611046], [0, 1557.8348925840205, 538.3374859400157], [0, 0, 1]])
distortion = np.array([-0.2136432557736835, 0.20055112514542725, 0.00054631323043295, -0.00067835485282051, -0.07781645541334031])

澄清一些事情:

  • projectPoints预计 rvec 和 tvec 是object's在相机坐标系/框架中姿势(将点从对象框架转换为相机框架)
  • 如果您已经转换了点并且它们是相机本地的,则应该传递空/全零 rvec 和 tvec
  • RVEC 是NOT欧拉角。它是一种轴角编码。它的长度等于旋转量(以弧度为单位,而不是度数)。该矢量本身就是旋转轴。

您应该调查的问题:

  • 假设你的cop数组应该是tvec,你应该加上它,而不是减去它。
  • Present matr。它不包含在您的代码中。
  • use numpy有效地。不要迭代和分配数组的各个元素。

如果你有一个世界坐标系,并且你的相机和物体都在世界坐标系中定义,那么你就有T_world_cam and T_world_obj.

For projectPoints(), you need T_cam_obj, or camTobj (math notation).

这个转变...

  • 将几何体从对象框架(输入,右侧)转换为相机框架(输出,左侧)
  • 表达物体相对于相机框架的姿势

方程:

T_cam_obj = T_cam_world @ T_world_obj
T_cam_obj = inv(T_world_cam) @ T_world_obj # np.linalg.inv

编写在 rvec、tvec(对于 OpenCV)和 4x4 矩阵表示(用于计算而不发疯)之间进行转换的实用函数:

def rtvec_to_matrix(rvec=(0,0,0), tvec=(0,0,0)):
    "Convert rotation vector and translation vector to 4x4 matrix"
    rvec = np.asarray(rvec)
    tvec = np.asarray(tvec)

    T = np.eye(4)
    (R, jac) = cv.Rodrigues(rvec)
    T[:3, :3] = R
    T[:3, 3] = tvec.squeeze()
    return T

def matrix_to_rtvec(matrix):
    "Convert 4x4 matrix to rotation vector and translation vector"
    (rvec, jac) = cv.Rodrigues(matrix[:3, :3])
    tvec = matrix[:3, 3]
    return rvec, tvec
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCV 项目点在投影之前如何执行转换? 的相关文章

随机推荐

  • 为什么在对话流中创建的丰富消息不会出现在 Slack 上测试的机器人中?

    我为默认欢迎意图创建了两个答案 一个是默认的 另一个是显示在 Slack 中的文本响应 另一个使用 Slack 作为我的机器人的通道 单击 添加响应 开始使用 Dialogflows UI 为 Slack 创建响应 第二个如下 blocks
  • 如何使用持久堆图像在 Isabelle/jEdit 中更快地加载理论?

    假设我有一个目录isabelle afp存储了很多理论的地方 该目录是一个库 我不打算更改其中的文件 我想加快 Isabelle jEdit 的启动时间 默认情况下 所有理论isabelle afp我当前的理论取决于重新处理 我怎样才能跳过
  • 强制 Windows 视频驱动程序重新加载。有可能吗?

    某些驱动程序在启动时加载时使用注册表中写入的参数来配置自身 我可以修改这些值然后重新启动 但我想知道是否可以强制重新加载驱动程序 使更改在不重新启动的情况下生效 具体来说 我正在谈论视频驱动程序 nvidia 我在某处读到 通过 pINvo
  • 设置字节编译目标文件函数

    我想使用相对路径设置 emacs lisp 字节编译的目标目录 例如 foo 我发现我应该使用byte compile dest file function 但不知道如何设置 我该如何设置呢 要设置byte compile dest fun
  • 如何使用十六进制表示法为 char* 赋值?

    我通常按 以下方式使用指针 char ptr malloc sizeof char 100 memset ptr 0 100 strncpy ptr cat 100 1 但这次我不想使用 cat 而是使用十六进制的 ASCII 等效值 猫
  • NLog v2 可以与 Common.Logging 一起使用吗

    我今天尝试将它们一起使用 但发现版本不匹配 因为它正在寻找 NLog v1 Common Logging 支持 NLog v2 吗 如果没有 有人知道是否可以安全地使用程序集版本重定向吗 您可以简单地在 app config 或 web c
  • 如何在 ES6 中创建主导入文件?

    我正在寻找使用创建一个主导入文件ES6句法 我有一个组件目录index js file 我想export如果有意义的话 进口 本质上 我想将各个组件文件导入然后导出到索引文件中 以便我可以解构我的imports来自任何其他文件 如下所示 i
  • jQuery 颜色 **样本** 选择器

    有没有人编写了一个 jQuery 查询颜色选择器 可以让您从预定的颜色列表中选择颜色 类似于电子商务网站上的产品颜色选择器 我所做的大部分搜索都揭示了许多通用目的 即在 RGB 光谱中选择任何颜色 但很少有用于选择特定颜色的选项 我制造了一
  • 调整 HTML5 画布大小以适合窗口

    如何自动缩放 HTML5
  • Firebase云功能自定义域[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何将 firebase 的新 HTTPS 云功能连接到自定义域 因此 例如 example com 将转到 us central1 MY
  • Tomcat 8 无法加载网站

    我是 java servlet 编程的新手 正在学习这一点 我的 debian 计算机上安装的 tomcat 最初可以显示默认的示例网页 但是将 var lib tomcat8 webapps ROOT 中的加载文件替换为示例页面后 网站无
  • Retrofit2 反序列化响应主体,即使响应不是 200

    我希望能够反序列化对同一 Java 对象的网络响应 即使响应不成功 目前 当我收到像 403 这样的错误响应时 响应正文为空 我希望使用 response errorBody 方法来读取已发回的任何内容 这是可以的 但是我想避免在改造回调中
  • Go 语言中的 >> 是什么意思?

    我正在寻找有关 Google Go 语言的信息 在 A Tour of Go 中 他们有这样的代码 const Big 1 lt lt 100 Small Big gt gt 99 但做什么 lt lt and gt gt mean 您可以
  • 如何在python jinja模板中输出loop.counter?

    我希望能够将当前循环迭代输出到我的模板 根据the docs https jinja palletsprojects com en 3 0 x templates 有一个loop counter我尝试使用的变量 ul for user in
  • android:camera.getParameters() 使应用程序崩溃

    我正在使用此代码将相机 LED 用作手电筒 但在服务启动时它崩溃了 使用 Log w 语句我发现它停在 param camera getParameters 处 我已将 android permission CAMERA 包含在我的清单中
  • .NET Core MVC - 带有前缀绑定的 AJAX POST 请求

    我想通过 AJAX 向带有模型前缀的控制器发送请求 我需要一个前缀 因为我在一页上有两个具有相似模型属性的表单 asp for 正在生成相似的 ID 和名称 我正在使用 NET Core 3 1 请求帖子无需前缀即可正常工作 当我使用如下例
  • 在 Swift 2.0 中创建 CMSampleBuffer 的副本

    之前已经有人问过这个问题 但自从问过这个问题以来 Swift 中肯定发生了一些变化 我正在尝试存储CMSampleBuffer从返回的对象AVCaptureSession待稍后处理 经过一些实验我发现AVCaptureSession必须重用
  • Tridion CME 如何从包含多个 AD-LDAP 的域中选择特定的 AD-LDAP?

    实施有AD SDL Tridion CMS MMC 控制台没有任何 AD LDAP 集成 无同步或任何其他功能 只是一个简单的香草安装 这意味着用户在 AD 中创建 然后在 CMS 中手动添加 并在 CME 中授予权限 访问权限 当我们添加
  • 如何使用反应形式设置单选按钮值?

    这是我的组件类 我尝试将表单单选按钮值设置为 1 import FormGroup FormControl from angular forms export class myComponent implements OnInit page
  • OpenCV 项目点在投影之前如何执行转换?

    我有两个 3d 点 我试图使用它们将其投影到 2d 图像平面上cv projectPoints 最初这些点不在相机的参考系中 所以我必须转换它们 我正在测试该方法转换的有效性 首先 我手动将平移应用于我的点 并通过旋转矩阵绕 x 轴进行 9