当前位置: 首页 > article >正文

相机检查内参 外参

目录

检查内参 外参

像素点投影到世界坐标系,再投回到2d坐标系:


检查内参 外参

import cv2
import numpy as np

# 假设我们有以下相机内参
K = np.array([[418.96369417, 0.0, 489.16315478],
              [0.0, 419.04813353, 267.88796254],
              [0.0, 0.0, 1.0]], dtype=np.float64)

# 假设相机外参矩阵 (旋转和平移)
R = np.array([[-3.9147413e-03, -9.9999213e-01, 6.7846401e-04],
              [9.3531040e-03, -7.1505480e-04, -9.9995601e-01],
              [9.9994862e-01, -3.9082235e-03, 9.3558291e-03]], dtype=np.float64)

t = np.array([1.0138103e-02, 1.2053192e+00, -2.1235154e+00], dtype=np.float64)

# 将旋转矩阵转换为旋转向量
R_vec, _ = cv2.Rodrigues(R)

# 假设我们有以下已知的三维点
object_points = np.array([[0, 0, 0],
                          [1, 0, 0],
                          [0, 1, 0],
                          [0, 0, 1]], dtype=np.float64)

# 对应的图像中的像素点 (实际检测到的图像点)
image_points_detected = np.array([[489.2, 267.9],
                                  [589.2, 267.9],
                                  [489.2, 367.9],
                                  [489.2, 267.9]], dtype=np.float64)

# 使用内参和外参将三维点投影到图像平面
image_points_projected, _ = cv2.projectPoints(object_points, R_vec, t, K, distCoeffs=None)

# 将 image_points_projected 从 (N, 1, 2) 转换为 (N, 2)
image_points_projected = image_points_projected.reshape(-1, 2)

# 计算重投影误差
error = cv2.norm(image_points_detected, image_points_projected, cv2.NORM_L2) / len(image_points_projected)
print(f"重投影误差: {error}")

像素点投影到世界坐标系,再投回到2d坐标系:

import numpy as np
import cv2

# 假设我们有以下相机内参矩阵 K
K = np.array([[418.96369417, 0.0, 489.16315478],
              [0.0, 419.04813353, 267.88796254],
              [0.0, 0.0, 1.0]], dtype=np.float64)

# 假设相机外参(旋转矩阵和平移向量)
R = np.array([[-3.9147413e-03, -9.9999213e-01,  6.7846401e-04],
              [ 9.3531040e-03, -7.1505480e-04, -9.9995601e-01],
              [ 9.9994862e-01, -3.9082235e-03,  9.3558291e-03]], dtype=np.float64)
t = np.array([1.0138103e-02, 1.2053192e+00, -2.1235154e+00], dtype=np.float64)

# 假设图像坐标系中的点 (u, v)
u, v = 500, 300

# 假设已知深度 Z
Z = 5.0  # 例如 5米

# 1. 图像坐标系 -> 世界坐标系
# 计算归一化相机坐标系中的点
p_n = np.linalg.inv(K) @ np.array([u, v, 1.0])

# 将归一化相机坐标系中的点转换为相机坐标系
P_c = p_n * Z

# 使用相机外参转换到世界坐标系
P_w = np.linalg.inv(R) @ (P_c - t)

# 2. 世界坐标系 -> 图像坐标系
# 从世界坐标系转换回相机坐标系
P_c_back = R @ P_w + t

# 再将相机坐标系转换回图像坐标系
p_n_back = P_c_back[:2] / P_c_back[2]  # 归一化相机坐标

# 通过内参转换到图像坐标系
pixel_coords = K @ np.array([p_n_back[0], p_n_back[1], 1.0])

# 规范化,以获得最终的图像坐标
u_back = pixel_coords[0] / pixel_coords[2]
v_back = pixel_coords[1] / pixel_coords[2]

print(f"原始图像坐标: ({u}, {v})")
print(f"转换回来的图像坐标: ({u_back:.2f}, {v_back:.2f})")


http://www.kler.cn/a/292576.html

相关文章:

  • AutoDL远程连接技巧
  • C++ —— 哈希详解 - 开散列与闭散列
  • 工作和学习遇到的技术问题
  • Mac intel 安装IDEA激活时遇到问题 jetbrains.vmoptions.plist: Permission denied
  • Spring Boot 2.x 和 Druid 多数据源整合 dm
  • Linux 常用操作指令大揭秘(下)
  • Github Codespaces Cmake项目使用
  • 实战项目十的更新代码
  • 三极管三模电
  • 代码随想录算法训练营第五十九天 | 图论part09
  • 2024数学建模国赛选题建议+团队助攻资料
  • 优化理论及应用精解【4】
  • GNU/Linux - 进程关联的控制终端
  • centos7.9搭建mysql5.6
  • 无论是速卖通、敦煌网、国际站,自养号测评就是提高曝光的利器!
  • 支付宝直付通与微信收付通分账产品:功能差异与适用场景
  • 感知机模型
  • springboot小儿推拿培训系统
  • 蓝牙--关于bta_av_api.cc 文件的讲解
  • java使用jedis连接redis
  • Mac剪贴板管理器:扩展你的复制粘贴能力
  • 卷积公式的几何学理解
  • 硬件工程师笔试面试——继电器
  • windows清理图标缓存
  • 如何实现对窗口window的viewtree进行dump Hierarchy-安卓framework实战开发
  • HarmonyOS开发实战( Beta5版)状态管理优秀实践