0

As I learned from tutorial videos, I tried this code:

import numpy as np
import cv2

ARUCO_DICT = {
    "DICT_4X4_50": cv2.aruco.DICT_4X4_50,
    "DICT_4X4_100": cv2.aruco.DICT_4X4_100,
    
} 
#In fact there are more dictionary keys than written above. I deleted them to shorten the question.


def aruco_display(corners, ids, rejected, image):
    if len(corners) > 0:
        
        ids = ids.flatten()
        
        for (markerCorner, markerID) in zip(corners, ids):
            
            corners = markerCorner.reshape((4, 2))
            (topLeft, topRight, bottomRight, bottomLeft) = corners
            
            topRight = (int(topRight[0]), int(topRight[1]))
            bottomRight = (int(bottomRight[0]), int(bottomRight[1]))
            bottomLeft = (int(bottomLeft[0]), int(bottomLeft[1]))
            topLeft = (int(topLeft[0]), int(topLeft[1]))

            cv2.line(image, topLeft, topRight, (0, 255, 0), 2)
            cv2.line(image, topRight, bottomRight, (0, 255, 0), 2)
            cv2.line(image, bottomRight, bottomLeft, (0, 255, 0), 2)
            cv2.line(image, bottomLeft, topLeft, (0, 255, 0), 2)
            
            cX = int((topLeft[0] + bottomRight[0]) / 2.0)
            cY = int((topLeft[1] + bottomRight[1]) / 2.0)
            cv2.circle(image, (cX, cY), 4, (0, 0, 255), -1)
            
            cv2.putText(image, str(markerID),(topLeft[0], topLeft[1] - 10), cv2.FONT_HERSHEY_SIMPLEX,
                0.5, (0, 255, 0), 2)
            print("[Inference] ArUco marker ID: {}".format(markerID))
            
    return image


img = cv2.imread('markers.jpg', 1) 

#the first parameter will change according to the name of the photo

aruco_type = ["DICT_4X4_50",
"DICT_4X4_100",
"DICT_4X4_250", 
]
for i in aruco_type:
    arucoDict = cv2.aruco.getPredefinedDictionary(ARUCO_DICT[i])

    arucoParams = cv2.aruco.DetectorParameters()

    corners, ids, rejected = cv2.aruco.ArucoDetector(arucoDict, arucoParams).detectMarkers(img)

    detected_markers = aruco_display(corners, ids, rejected, img)

    cv2.imshow("Image", detected_markers)


cv2.waitKey(0)

cv2.destroyAllWindows()

This code can detect most of codes but there is still problem due to not detecting some ArUco's like that:

ArUco1 ArUco2

How can I solve this issue?

I think if it can detect some of them, I don't understand why it cannot detect ArUco's on same image.

0 Answers0