OpenCV ArUco代码运行报getCornerInCameraWorld未定义错误
NameError: name 'getCornerInCameraWorld' is not defined 问题解决 错误根因
getCornerInCameraWorld 不属于OpenCV、NumPy、UR官方SDK或任何公开可安装的Python依赖的内置函数,是康奈尔大学ECE5725绘图机器人项目教程中省略实现的自定义辅助函数,教程仅展示了函数调用逻辑,未附源码,直接复用调用代码就会触发该未定义错误。
解决步骤
- 明确函数预期作用
该函数用于衔接ArUco标记检测结果与后续坐标转换逻辑:输入检测到的角点像素坐标、相机标定参数、ArUco标记位姿估计结果,输出角点在相机坐标系下的物理坐标,为后续单应性透视变换、机械臂坐标映射提供输入。 - 补全自定义函数实现
把以下函数代码放到你项目代码的全局位置,或者单独存为工具模块导入即可,参数可以直接对接你现有代码里的ArUco检测、相机标定相关变量:
import numpy as np import cv2 def getCornerInCameraWorld(corner_pixel, camera_matrix, dist_coeffs, rvec, tvec, marker_length=0.05): """ ArUco角点像素坐标转相机坐标系物理坐标 参数: corner_pixel: 单个检测到的ArUco角点像素坐标,格式为shape(2,)的float型numpy数组 camera_matrix: 相机标定得到的3*3内参矩阵 dist_coeffs: 相机标定得到的畸变系数数组 rvec: 对应ArUco标记解算得到的旋转向量 tvec: 对应ArUco标记解算得到的平移向量 marker_length: 实际打印的ArUco标记边长,单位与标定、机械臂坐标系保持一致,默认0.05(即5cm) 返回: 对应角点在相机坐标系下的三维物理坐标 """ # ArUco标记自身坐标系下的四个角点坐标,标记平面z=0 marker_local_corners = np.array([ [-marker_length/2, marker_length/2, 0], [marker_length/2, marker_length/2, 0], [marker_length/2, -marker_length/2, 0], [-marker_length/2, -marker_length/2, 0] ], dtype=np.float64) # 构建标记坐标系到相机坐标系的变换矩阵 rot_mat, _ = cv2.Rodrigues(rvec) trans_mat = np.eye(4) trans_mat[:3, :3] = rot_mat trans_mat[:3, 3] = tvec.flatten() # 计算标记角点在相机坐标系下的坐标、对应投影像素坐标 cam_corners = [] proj_pixels = [] for local_corner in marker_local_corners: local_homo = np.array([*local_corner, 1]) cam_corner = (trans_mat @ local_homo)[:3] cam_corners.append(cam_corner) proj_pixel, _ = cv2.projectPoints(local_corner, rvec, tvec, camera_matrix, dist_coeffs) proj_pixels.append(proj_pixel.flatten()) cam_corners = np.array(cam_corners) proj_pixels = np.array(proj_pixels) # 匹配输入像素点距离最近的投影点,返回对应相机坐标 match_idx = np.argmin(np.linalg.norm(proj_pixels - corner_pixel, axis=1)) return cam_corners[match_idx]
- 适配现有代码逻辑
- 将函数参数
marker_length的默认值替换为你实际使用的ArUco标记的物理边长,单位建议统一为米,和相机标定、UR机械臂坐标系单位保持一致 - 如果你后续单应性变换只需要工作平面的二维坐标,可以直接简化函数,跳过三维坐标计算,直接用平面点对计算单应矩阵即可
- 将函数参数
- 功能验证
补全函数后先单独运行ArUco检测模块,打印函数输出的角点坐标,和实际测量的角点相对相机的物理位置比对,误差控制在5mm以内即可正常运行后续去畸变、透视变换、UDP通信逻辑。
注意:不要尝试通过pip安装第三方包获取该函数,公开PyPI源不存在包含该函数的官方依赖,第三方同名实现基本都是其他课程项目的自定义代码,安装后极易引发OpenCV、NumPy版本冲突。
内容的提问来源于stack exchange,提问作者Manpreet
相关产品推荐
相关产品推荐

