lanlalala 2024-06-04 20:25 采纳率: 0%
浏览 30
已结题

cv2.fisheye.stereoCalibrate报错

retval, cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2, R, T= cv2.fisheye.stereoCalibrate(objpoints, imgpoints_l, imgpoints_r, mtx_l, dist_l.T, mtx_r, dist_r.T, gray_l.shape[::-1], None, None, flags =  cv2.fisheye.CALIB_FIX_INTRINSIC, criteria=criteria_stereo)

cv2.error: OpenCV(4.9.0) D:\a\opencv-python\opencv-python\opencv\modules\core\src\arithm.cpp:650: error: (-209:Sizes of input arguments do not match) The operation is neither 'array op array' (where arrays have the same size and the same number of channels), nor 'array op scalar', nor 'scalar op array' in function 'cv::arithm_op'
请问怎么办啊?(opencv报错地方的源码查了,但还是不明白。网上其他人也没有出过这种错误)

  • 写回答

12条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-04 20:25
    关注

    引自免费微信小程序:皆我百晓生

    遇到这个错误,通常意味着输入参数的尺寸不匹配。在你的cv2.fisheye.stereoCalibrate调用中,确保所有输入数组的尺寸和数据类型都符合函数的期望。根据错误信息,这里可能存在几个常见问题点:

    1. objpointsimgpoints_l, imgpoints_r 的结构不匹配:确保每个图像对应的物体点(objpoints)和图像点(imgpoints)数量一致,并且它们是正确配对的。

    2. mtx_l, dist_l, mtx_r, dist_r 参数尺寸:这些参数应分别对应两个相机的内参矩阵和畸变系数。确保它们的形状正确,内参矩阵应为3x3,畸变系数为1x5或1x4的向量。

    3. gray_l.shape[::-1] 应该返回一个表示图像尺寸的元组,通常是(width, height)。确认这个尺寸与你的图像数据相匹配,且与你用于计算单目摄像机标定的图像尺寸一致。

    4. flagscriteria 参数:确保它们的数据类型和内容正确。特别是criteria应该是一个包含迭代终止条件的元组,如(cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 1e-6)

    基于上述分析,你可以尝试下面的步骤来修正问题:

    # 首先,确保objpoints, imgpoints_l, imgpoints_r的结构正确
    assert len(objpoints) == len(imgpoints_l) == len(imgpoints_r), "确保每对图像有相同数量的对应点"
    
    # 确保内参矩阵和畸变系数的维度正确
    assert mtx_l.shape == (3, 3) and mtx_r.shape == (3, 3), "内参矩阵应为3x3"
    assert dist_l.shape in [(1, 4), (1, 5)] and dist_r.shape in [(1, 4), (1, 5)], "畸变系数应为1x4或1x5"
    
    # 确认图像尺寸与输入相符
    image_size = gray_l.shape[::-1]  # 获取图像尺寸 (width, height)
    
    # 调整criteria确保它是正确的类型和值
    criteria_stereo = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 1e-6)  # 示例值
    
    # 修正函数调用
    try:
        retval, cameraMatrix1, distCoeffs1, cameraMatrix2, distCoeffs2, R, T = cv2.fisheye.stereoCalibrate(
            objpoints,
            imgpoints_l,
            imgpoints_r,
            mtx_l,
            dist_l.ravel(),  # 使用ravel将dist_l从(1,4/5)转换为(4/5,)
            mtx_r,
            dist_r.ravel(),  # 同上操作
            image_size,
            None, None,
            flags=cv2.fisheye.CALIB_FIX_INTRINSIC,
            criteria=criteria_stereo
        )
    except cv2.error as e:
        print(f"遇到错误: {e}")
    

    这段代码首先进行了基本的检查,然后修正了dist_ldist_r的形状,使用ravel()方法确保它们作为一维向量传递给函数。如果问题仍然存在,请再次检查所有输入数据的细节,确保没有遗漏的地方。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月5日
  • 赞助了问题酬金15元 6月4日
  • 创建了问题 6月4日

悬赏问题

  • ¥15 ansys fluent计算闪退
  • ¥15 有关wireshark抓包的问题
  • ¥15 需要写计算过程,不要写代码,求解答,数据都在图上
  • ¥15 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。