主要的问题还是随着opencv的版本升级,对aruco模块的函数命名变化挺大的,因此需要正确调用opencv对应版本下的aruco相关函数,不然程序无法运行,会报各种异常
在线ArUco工具
保存下来的是svg格式
环境
python 3.7.16
opencv 4.7.0
其实就只安装了两个包:
opencv_contrib_python-4.7.0.68-cp37-abi3-win_amd64.whl
opencv_python-4.7.0.72-cp37-abi3-win_amd64.whl
创建aruco标定图
markerImage = np.zeros((200, 200), dtype=np.uint8)
dictionary = cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_6X6_250)
#生成内部为6*6,加外围一层黑边实际为8*8的图
cv2.aruco.generateImageMarker(dictionary, 0, 200, markerImage, 1)
#dictionary:定义的标定图
#0:第几张aruco标定图
#200:标定图尺寸
#markerImage:要绘制的标定图
#1:aruco标定图外围黑边的尺寸
cv2.imwrite("marker22.png", markerImage)
检测aruco标定图
image = cv2.imread(r'ArUco\102_aruco.jpg')
dictionary = cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_6X6_250)
arucoParams = cv2.aruco.DetectorParameters()
corners, ids, rejected = cv2.aruco.detectMarkers(image, dictionary, parameters=arucoParams)
cv2.aruco.drawDetectedMarkers(image, corners, ids, (0, 0, 255))
cv2.imwrite("image11.jpg", image)
相机姿态估计
image = cv2.imread(r'102_aruco.jpg')
dictionary = cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_6X6_250)
arucoParams = cv2.aruco.DetectorParameters()
corners, ids, rejected = cv2.aruco.detectMarkers(image, dictionary, parameters=arucoParams)
rvec, tvec, _ = cv2.aruco.estimatePoseSingleMarkers(corners, 0.05, K, D)
#K相机内参、D畸变系数、坐标轴rvec旋转、 坐标轴tvec平移
for i in range(rvec.shape[0]):
cv2.drawFrameAxes(image, K, D, rvec[i, :, :], tvec[i, :, :], 0.03)
cv2.imwrite("image11.jpg", image)
报错
让那些狗屎的错误和解答博客都见鬼去吧
报错一
网上最常见的、关于aruco的代码是下面这段,来自链接
python下使用aruco标记进进行三维姿势估计_python aruco-CSDN博客
我用知乎,大模型得到的代码都是下面这段,但是我试了opencv3.4、opencv4.3、opencv4.5、opencv4.7多个版本的opencv,都没能将这段代码调用起来,我看评论区还有说opencv3.1的,但是我写这篇博客的时候opencv3.1的python安装包已经被禁没法使用了,因此这段代码基本上可以说是一个非常流行的废代码,一点作用没有,只会耽误时间
import cv2 import numpy as np dictionary = cv2.aruco.Dictionary_get(cv2.aruco.DICT_6X6_250) markerImage = np.zeros((200, 200), dtype=np.uint8) markerImage = cv2.aruco.drawMarker(dictionary, 22, 200, markerImage, 1) cv2.imwrite("marker22.png", markerImage)
报错二
AttributeError: module 'cv2.aruco' has no attribute 'Dictionary_get'
别听那些乱七八糟的博客鬼扯,这个函数已经被重命名了,直接舍
报错三
AttributeError: module 'cv2.cv2' has no attribute 'aruco'
我在尝试opencv4.3时报的这个错误,别信网上那些卸了重按的,类似下面的博客
pip install opencv-python
这个命名只会安装最新版本的opencv,他哪年哪月按的,你哪年哪月按呀,opencv版本怎么可能一样
参考链接
https://docs.opencv.org/4.9.0/d5/dae/tutorial_aruco_detection.html
Detection of ArUco Markers
还得是官方文档,虽然我只找到了C版本的代码
Augmented Reality using ArUco Markers in OpenCV (C++ / Python) | LearnOpenCV #