调用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
相关产品推荐
相关产品推荐

