Error: AttributeError: module ‘cv2.aruco’ has no attribute ‘drawAxis’
This error occurs when trying to call the “drawAxis” function from the cv2.aruco module in OpenCV, but the function does not exist or is not accessible in the current version of OpenCV being used.
The “drawAxis” function is used to draw a 3D coordinate axis on a detected ArUco marker image. It helps visualize the pose estimation of the marker. However, this function might not be available in older versions of OpenCV or in some specific distributions.
Possible Solutions:
- Check OpenCV Version: Make sure you are using a version of OpenCV that supports the “drawAxis” function. You can check the version installed by running the following code:
- Upgrade OpenCV: If the current version is not compatible, you can try upgrading OpenCV to a newer version that includes the “drawAxis” function. You can use the following command to upgrade OpenCV using pip:
- Alternative Solutions: If upgrading is not an option or the function is not available in any version, you can consider the following alternatives:
- Use a different function: Explore other functions within the cv2.aruco module or OpenCV itself that can help visualize the ArUco marker pose or achieve the desired outcome.
- Manually implement the functionality: If no built-in function suits your needs, you can manually implement the desired functionality using OpenCV’s drawing functions along with the detected marker’s pose information.
- Search for external libraries or resources: Look for external libraries or resources that provide the functionality you require.
import cv2
print(cv2.__version__)
pip install --upgrade opencv-python
Examples:
Here are a few examples of drawing the pose of an ArUco marker without using the “drawAxis” function:
Example 1: Using OpenCV drawing functions
import cv2
import numpy as np
# Assuming you have already detected and estimated the ArUco marker pose
# Use the detected corner points and pose estimation matrix
# Generate 3D coordinate axis points
axis_length = 100
axis_points = np.float32([[0, 0, 0], [axis_length, 0, 0], [0, axis_length, 0], [0, 0, -axis_length]]).reshape(-1, 3)
# Draw the axis lines
image = cv2.imread("marker_image.png") # Replace with your marker image
rvec = np.array([[0], [0], [0]]) # Replace with your rvec pose estimation
tvec = np.array([[0], [0], [0]]) # Replace with your tvec pose estimation
K = np.eye(3)
dist = np.zeros((4, 1))
axis_points_2d, _ = cv2.projectPoints(axis_points, rvec, tvec, K, dist)
axis_points_2d = tuple(axis_points_2d.reshape(4, 2).astype(int))
cv2.line(image, axis_points_2d[0], axis_points_2d[1], (0, 0, 255), 3) # X-Axis (Red)
cv2.line(image, axis_points_2d[0], axis_points_2d[2], (0, 255, 0), 3) # Y-Axis (Green)
cv2.line(image, axis_points_2d[0], axis_points_2d[3], (255, 0, 0), 3) # Z-Axis (Blue)
cv2.imshow("Marker with Axis", image)
cv2.waitKey(0)
Example 2: Using external library (pyrender)
Another option is to use external libraries like pyrender, which allows you to render 3D objects, including ArUco marker poses. Here’s an example using pyrender:
import cv2
import numpy as np
import pyrender
# Assuming you have already detected and estimated the ArUco marker pose
# Use the detected corner points and pose estimation matrix
# Create a pyrender scene
scene = pyrender.Scene()
# Create a camera
camera = pyrender.PerspectiveCamera(yfov=np.pi / 3.0)
# Set the camera pose
rvec = np.array([[0], [0], [0]]) # Replace with your rvec pose estimation
tvec = np.array([[0], [0], [0]]) # Replace with your tvec pose estimation
camera_pose = np.eye(4)
camera_pose[:3, :3] = cv2.Rodrigues(rvec)[0]
camera_pose[:3, 3:] = tvec
# Add the camera to the scene
scene.add(camera, pose=camera_pose)
# Create an ArUco marker
marker_size = 100
marker_vertices = np.float32([
[-marker_size / 2, -marker_size / 2, 0.0],
[marker_size / 2, -marker_size / 2, 0.0],
[marker_size / 2, marker_size / 2, 0.0],
[-marker_size / 2, marker_size / 2, 0.0]
])
marker_indices = np.array([[0, 1, 2], [0, 2, 3]], dtype=np.int32)
marker_color = np.array([1.0, 0.0, 0.0, 1.0])
# Set the marker pose
marker_pose = np.eye(4) # Replace with your marker pose estimation
# Add the marker to the scene
scene.add(pyrender.Mesh.from_trimesh(
pyrender.Trimesh(vertices=marker_vertices, faces=marker_indices),
material=pyrender.materials.MetallicRoughnessMaterial(baseColorFactor=marker_color)),
pose=marker_pose
)
# Create a light source
light = pyrender.SpotLight(color=np.ones(3), intensity=3.0, innerConeAngle=np.pi / 16.0)
light_pose = np.eye(4)
light_pose[:3, 3] = np.array([[0], [0], [10]]) # Adjust position as needed
# Add the light to the scene
scene.add(light, pose=light_pose)
# Create a pyrender viewer and display the scene
viewer = pyrender.Viewer(scene, use_raymond_lighting=True)
These examples demonstrate alternative approaches to visualize ArUco marker poses in case the “drawAxis” function is not available or suitable for your requirements.