You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用cv.solvePnP计算相机位姿时触发cvConvertScale断言失败错误的技术求助

解决OpenCV solvePnP触发的cvConvertScale断言错误

嘿,我帮你排查了这个报错的根源,其实是传入的参数形状不符合OpenCV solvePnP的要求,具体问题和修复方法如下:

问题分析

你遇到的(-215:Assertion failed) src.size == dst.size && src.channels() == dst.channels()错误,核心原因是相机矩阵(cameraMatrix)的形状不对,同时图像点和物体点的维度也可以调整得更规范,避免潜在问题。

具体修复步骤

1. 修正相机矩阵的形状

你现在把cameraMatrix定义成了1维数组,但solvePnP要求它必须是3x3的二维矩阵(对应相机内参的标准结构)。你需要把一维的内参数据重新组织成3行3列的矩阵形式。

2. 优化图像点与物体点的维度(可选但推荐)

虽然OpenCV支持3维的点数组(比如(1,4,2)),但更常规且不易出错的写法是使用2维数组(比如(4,2)表示4个图像点,每个点2个坐标)。

修复后的完整代码

import cv2 as cv
import numpy as np

# 调整为2维数组:4个图像点,每个点包含x、y坐标
imagePoints = np.float32([[544, 337], [886, 337], [886, 781], [544, 781]])
# 调整为2维数组:4个世界坐标点,每个点包含x、y、z坐标
objectPoints = np.float32([[430, -210, 90], [430, -110, 90], [580, -210, 90], [886, -110, 90]])

# 将一维内参重塑为3x3的相机矩阵(符合OpenCV要求的结构)
cameraMatrix = np.float32([
    [1.5968554012182622e+04, 0., 5.9163145834154648e+02],
    [0., 1.0919346214593939e+04, 8.3519145165493478e+02],
    [0., 0., 1.]
])

# 畸变系数保持5个元素,1维数组或(1,5)二维数组都可以正常工作
distCoeffs = np.float32([3.1817705820413217e+01, -2.4334106040843017e+03, -5.7690325903983741e-01, -8.4352650966664180e-02, -1.9337299660588971e+04])

# 调用solvePnP,若你的箱体是平面,可添加flags=cv.SOLVEPNP_IPPE_SQUARE提升精度
success, rotation_vector, translation_vector = cv.solvePnP(objectPoints, imagePoints, cameraMatrix, distCoeffs)

# 验证计算结果
if success:
    print("相机位姿计算成功!")
    print("旋转向量:\n", rotation_vector)
    print("平移向量:\n", translation_vector)
else:
    print("相机位姿计算失败,请检查点的匹配关系或内参准确性")

额外提示

如果你的箱体面是平面结构,调用solvePnP时可以指定flags=cv.SOLVEPNP_IPPE_SQUARE,这个算法专门针对平面物体优化,能给出更稳定的位姿结果。

内容的提问来源于stack exchange,提问作者Nour Morsi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 15:59:07