opencv / opencv/opencv-python

Inconsistent orientation of detected/generated ArUco and AprilTags

Open
#1,195 4 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Python
Stars
5.4k
Forks
1k
Avg merge
22h 17m
Merged PRs (30d)
3

Description

ArUco and AprilTag detection both uses a clockwise orientation, however, AprilTag corners start with bottom right while ArUco starts with upper left. See the example below:

Image Image

Code:

import cv2


def draw_markers_with_corners(img, corners):
    for i, marker_corners in enumerate(corners):
        # Get the corners of the marker
        corner_points = marker_corners.reshape((4, 2))
        corner_points = corner_points.astype(int)

        # Draw each corner with its ordinal position
        for j, corner in enumerate(corner_points):
            # Draw corner point
            cv2.circle(img, tuple(corner), 5, (0, 0, 255), -1)
            # Label the corner with its ordinal position (0, 1, 2, 3)
            cv2.putText(
                img,
                str(j),
                (corner[0] + 10, corner[1] + 10),
                cv2.FONT_HERSHEY_SIMPLEX,
                0.5,
                (255, 0, 0),
                2,
            )

    return img


img = cv2.imread("markers.jpeg")

parameters = cv2.aruco.DetectorParameters()

april_dict = cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_APRILTAG_36h11)
april_detector = cv2.aruco.ArucoDetector(april_dict, parameters)
aruco_dict = cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_4X4_250)
aruco_detector = cv2.aruco.ArucoDetector(aruco_dict, parameters)

img_marked = img.copy()
april_corners, _, _ = april_detector.detectMarkers(img)
img_marked = draw_markers_with_corners(img_marked, april_corners)

aruco_corners, _, _ = aruco_detector.detectMarkers(img)
img_marked = draw_markers_with_corners(img_marked, aruco_corners)

cv2.imwrite("markers_detected.jpeg", img_marked)

The same issue persists (likely due to pre-defined dictionary configurations) for generation:

The generated AprilTag 36h11 - 0 (wrong orientation, see above)
Image

The generated ArUco 4x4_250 - 0 (correct orientation, see above)
Image

Code:

import cv2

april_dict = cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_APRILTAG_36h11)
aruco_dict = cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_4X4_250)

img = cv2.aruco.generateImageMarker(aruco_dict, 0, 200, borderBits=1)
cv2.imwrite("aruco.png", img)

img = cv2.aruco.generateImageMarker(april_dict, 0, 200, borderBits=1)
cv2.imwrite("april.png", img)

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the provided Python reproduction using ArucoDetector.detectMarkers and generateImageMarker for the AprilTag and ArUco dictionaries. Trace how each dictionary defines corner ordering and generated marker orientation; done means detection and generation use a consistent orientation for both marker families, with the reproduction confirming the corrected ordering.

Written by the indexing model from the issue text.

Assessment

Tech stack
opencv, python
Domain
computer-vision
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.