Debian 9.5下OpenCV-Python 2.7调用cv2.aruco.detectMarkers()参数报错问题
解决Debian 9.5下Python 2.7环境中cv2.aruco.detectMarkers()参数报错问题
这问题我碰到过好多次,核心就是OpenCV版本差异导致的接口不兼容!
问题根源
你在Windows上能用的cameraMatrix和distCoeff参数,是OpenCV 3.4及以后版本才新增到cv2.aruco.detectMarkers()里的。而Debian 9.5默认软件源里的OpenCV版本比较老旧(大概率是3.2或更早),这个版本的detectMarkers()根本没有这两个参数,自然会报错。
两种可行解决办法
办法1:升级Debian上的OpenCV版本到兼容版本
因为你用的是Python 2.7,要找适配的最后一批支持版本,推荐安装opencv-contrib-python 3.4.x系列(这个包包含完整的aruco模块):
- 先卸载系统自带的旧版OpenCV:
sudo apt remove python-opencv - 用pip2安装适配的稳定版本:
这个版本是支持Python 2.7的最后一批稳定版本之一,且包含完整的aruco功能。pip2 install opencv-contrib-python==3.4.13.47 - 验证安装成功:
输出python2 -c "import cv2; print(cv2.__version__)"3.4.13就说明没问题了,之后你原来的代码就能直接正常运行。
办法2:不升级OpenCV,调整代码逻辑
如果不想折腾版本升级,可以拆分检测和姿态估计的步骤——旧版本的cv2.aruco.estimatePoseSingleMarkers()是支持传入相机参数的,修改代码如下:
# 先只检测标记角点,不传入相机参数 corners, ids, rejectedImgPoints = cv2.aruco.detectMarkers(image=gray, dictionary=aruco_dict, parameters=parameters) # 如果检测到有效标记,再单独计算姿态 if ids is not None: # marker_size是你的Aruco标记实际尺寸(比如0.1米,要和相机标定的单位一致) rvecs, tvecs, _ = cv2.aruco.estimatePoseSingleMarkers(corners, marker_size, camera_matrix, camera_distortion) # 这里可以继续处理姿态参数rvecs和tvecs,和你原来的业务逻辑保持一致
这样就能绕过detectMarkers()的参数限制,实现和原代码一样的功能。
补充说明
Windows上能正常运行,是因为你安装的OpenCV版本比较新(比如3.4+或4.x),已经支持在detectMarkers()里直接传入相机参数,而Debian 9.5的系统包更新节奏慢,版本跟不上才导致了接口差异。
内容的提问来源于stack exchange,提问作者Loris
相关产品推荐
相关产品推荐

