Search code examples
pythonopencvcamera-calibrationaruco

Why is detection rate of Charucos in cv2.aruco.detectMarkers() so poor?


I am in trouble figuring out why cv2.aruco.detectMarkers() has problems in finding more than just a few markers with my calibration board. Playing around with the paramters didn't essentially improve the quality. The dictionary is correct as I tried it with the digital template before printing. Here is, what I do to detect CHAruco markers from a real image:

import cv2
from cv2 import aruco
#ChAruco board variables
CHARUCOBOARD_ROWCOUNT = 26
CHARUCOBOARD_COLCOUNT = 26
ARUCO_DICT = cv2.aruco.Dictionary_get(aruco.DICT_4X4_1000)

#Create constants to be passed into OpenCV and Aruco methods
CHARUCO_BOARD = aruco.CharucoBoard_create(
    squaresX=CHARUCOBOARD_COLCOUNT,
    squaresY=CHARUCOBOARD_ROWCOUNT,
    squareLength=5, #mm
    markerLength=4, #mm
    dictionary=ARUCO_DICT)

 #load image     
 img = cv2.imread('imgs\\frame25_crop.png', 1)

test image with CHAruco markers

#initialize detector
parameters =  aruco.DetectorParameters_create()
parameters.adaptiveThreshWinSizeMin = 150
parameters.adaptiveThreshWinSizeMax = 186

#Find aruco markers in the query image
corners, ids, _ = aruco.detectMarkers(
    image=img,
    dictionary=ARUCO_DICT,
    parameters=parameters)   

#Outline the ChAruco markers found in our image
img = aruco.drawDetectedMarkers(
    image=img, 
    corners=corners)

The result is the following: only 3 are markers are found, which is bad.

resulting image with found markers

Does anyone has an idea how to considerably improve the results of the detector?


Solution

  • Your image is flipped.

    Fix it with this line of code:

    img = cv2.flip(img, 0)