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

cv2.solvePnP 报错 求相机位姿

目录

报错信息及解决:

cv2.solvePnP 使用例子:

设置初始值效果也不好

cv2.projectPoints 函数效果不好


报错信息及解决:

File "/shared_disk/users/lbg/project/human_4d/nlf_pose/render_demo_pkl2_cal.py", line 236, in <module> success, rotation_vector, translation_vector = cv2.solvePnP(vertices, vertices2d, camera_matrix, dist_coeffs) cv2.error: OpenCV(4.10.0) /io/opencv/modules/calib3d/src/solvepnp.cpp:823: error: (-215:Assertion failed) ( (npoints >= 4) || (npoints == 3 && flags == SOLVEPNP_ITERATIVE && useExtrinsicGuess) || (npoints >= 3 && flags == SOLVEPNP_SQPNP) ) && npoints == std::max(ipoints.checkVector(2, CV_32F), ipoints.checkVector(2, CV_64F)) in function 'solvePnPGeneric'

解决方法:

把所有数据都astype(np.float32)

cv2.solvePnP 使用例子:


import cv2
import numpy as np# 三维物体点在世界坐标系中的坐标
object_points = np.array([[0, 0, 0],[0, 1, 0],[1, 1, 0],[1, 0, 0]
]).astype(np.float32)# 这些三维点在图像平面上对应的二维像素坐标
image_points = np.array([[100, 100],[100, 200],[200, 200],[200, 100]
], dtype=np.float64)# 相机的内参矩阵
camera_matrix = np.array([[1000, 0, 320],[0, 1000, 240],[0, 0, 1]
], dtype=np.float64)# 相机的畸变系数
dist_coeffs = np.zeros((5, 1), dtype=np.float32)# 求解PnP问题
success, rotation_vector, translation_vector = cv2.solvePnP(object_points, image_points, camera_matrix, dist_coeffs)if success:print("旋转向量:")print(rotation_vector)print("平移向量:")print(translation_vector)
else:print("求解失败")

设置初始值效果也不好

import cv2
import numpy as np# 假设 vertices 和 vertices2d 已经准备好了
# vertices 是 3D 点集合 (Nx3)
# vertices2d 是对应的 2D 点集合 (Nx2)
# camera_matrix 是相机内参矩阵
# dist_coeffs 是畸变系数(如果有)# 相机的内参矩阵
f_x = 1000  # 焦距 fx
f_y = 1000  # 焦距 fy
c_x = 640   # 主点 cx
c_y = 360   # 主点 cy
camera_matrix = np.array([[f_x, 0, c_x],[0, f_y, c_y],[0, 0, 1]
])# 畸变系数(假设无畸变)
dist_coeffs = np.zeros(5)# 初始旋转向量(设为零)
rvec_init = np.zeros(3)  # 初始旋转为零(单位向量)
tvec_init = np.zeros(3)  # 初始平移为零# 使用 solvePnP 计算平移并强制旋转为零
success, rvec, tvec = cv2.solvePnP(vertices,        # 3D 点vertices2d,      # 对应的 2D 点camera_matrix,   # 相机内参矩阵dist_coeffs,     # 畸变系数rvec_init,       # 初始旋转向量(零)tvec_init,       # 初始平移向量(零)useExtrinsicGuess=True  # 使用提供的初始旋转和平移
)# 输出计算结果
print(f"旋转向量 (rvec): {rvec}")
print(f"平移向量 (tvec): {tvec}")

cv2.projectPoints 函数效果不好

import cv2
import numpy as np
from scipy.optimize import least_squaresdef project_without_rotation(t, object_points, camera_matrix, dist_coeffs):rvec = np.zeros((3, 1))  # 零旋转tvec = t.reshape(3, 1)projected, _ = cv2.projectPoints(object_points, rvec, tvec, camera_matrix, dist_coeffs)return projected.reshape(-1, 2)def residual(t, object_points, image_points, camera_matrix, dist_coeffs):projected = project_without_rotation(t, object_points, camera_matrix, dist_coeffs)return (projected - image_points).ravel()# 输入数据:3D点、2D点、相机矩阵、畸变系数
vertices = np.array([...], dtype=np.float32)  # 替换为实际3D点
vertices2d = np.array([...], dtype=np.float32)  # 替换为实际2D点
camera_matrix = np.array([...], dtype=np.float32)  # 替换为实际相机矩阵
dist_coeffs = np.array([...], dtype=np.float32)  # 替换为实际畸变系数,可为None# 初始猜测,例如零平移
t_initial = np.zeros(3)# 可选:使用线性解法获取更好的初始值(见注释部分)# 非线性优化
result = least_squares(residual, t_initial, args=(vertices, vertices2d, camera_matrix, dist_coeffs))
t_opt = result.xprint("优化后的平移向量:", t_opt)

http://www.lryc.cn/news/543902.html

相关文章:

  • Linux实操——在服务器上直接从百度网盘下载(/上传)文件
  • 2004-2024年光刻机系统及性能研究领域国内外发展历史、差距、研究难点热点、进展突破及下一个十年研究热点方向2025.2.27
  • 请求Geoserver的WTMS服务返回200不返回图片问题-跨域导致
  • ubuntu配置jmeter
  • 《Qt动画编程实战:轻松实现头像旋转效果》
  • 【Mac电脑本地部署Deepseek-r1:详细教程与Openwebui配置指南】
  • DeepSeek开源技术全景解析:从硬件榨取到AI民主化革命
  • WPF12-MVVM
  • 一个原教旨的多路径 TCP
  • 跟着AI学vue第十三章
  • labview中VISA串口出现异常的解决方案
  • StableDiffusion本地部署 2
  • unity学习61:UI布局layout
  • BRD4缺失通过GRP78灭活内质网应激,延缓脱氢表雄酮诱导的卵巢颗粒细胞凋亡
  • Jmeter插件下载及安装
  • 【Swift 算法实战】判断数组中是否存在重复元素
  • Spock框架:让单元测试更优雅的高效武器
  • 【前端基础】Day 4 CSS盒子模型
  • 补题蓝桥杯14届JavaB组第4题
  • kotlin的函数标准库使用
  • Visual Studio Code 跨平台安装与配置指南(附官方下载链接)
  • STM32学习【4】ARM汇编(够用)
  • Linux驱动开发实战(一):LED控制驱动详解
  • windows下安装pyenv+virtualenv+virtualenvwrapper
  • Cherno 游戏引擎笔记(91~111)
  • 0x02 js、Vue、Ajax
  • Windows 11【1001问】删除Win11左下角小组件的6种方法
  • 【动手学深度学习】基于Python动手实现线性神经网络
  • leetcode 912. 排序数组
  • 【芯片设计】NPU芯片前端设计工程师面试记录·20250227