Essayez-le en vous référant à Détection des marqueurs ArUco.
Environnement: Mac OS X El Capitan OpenCV 3.2
Les fonctionnalités d'ArUco sont incluses dans la contribution OpenCV. Donc, si OpenCV est installé avec homebrew, installez-le avec l'option --with-contrib.
% brew install opencv3 --with-contrib
Dans OpenCV il y a quelque temps, le support Python d'ArUco ne semblait pas parfait. Mais maintenant, on a l'impression qu'il peut être utilisé avec précision.
import cv2
aruco = cv2.aruco
dir(aruco)
C'était une sortie comme ça.
['Board_create',
'CharucoBoard_create',
'DICT_4X4_100',
'DICT_4X4_1000',
'DICT_4X4_250',
'DICT_4X4_50',
'DICT_5X5_100',
'DICT_5X5_1000',
'DICT_5X5_250',
'DICT_5X5_50',
'DICT_6X6_100',
'DICT_6X6_1000',
'DICT_6X6_250',
'DICT_6X6_50',
'DICT_7X7_100',
'DICT_7X7_1000',
'DICT_7X7_250',
'DICT_7X7_50',
'DICT_ARUCO_ORIGINAL',
'DetectorParameters_create',
'Dictionary_create',
'Dictionary_create_from',
'Dictionary_get',
'GridBoard_create',
'__doc__',
'__name__',
'__package__',
'calibrateCameraAruco',
'calibrateCameraArucoExtended',
'calibrateCameraCharuco',
'calibrateCameraCharucoExtended',
'custom_dictionary',
'custom_dictionary_from',
'detectCharucoDiamond',
'detectMarkers',
'drawAxis',
'drawDetectedCornersCharuco',
'drawDetectedDiamonds',
'drawDetectedMarkers',
'drawMarker',
'drawPlanarBoard',
'estimatePoseBoard',
'estimatePoseCharucoBoard',
'estimatePoseSingleMarkers',
'getPredefinedDictionary',
'interpolateCornersCharuco',
'refineDetectedMarkers’]
Créez un objet dictionnaire à l'aide d'un dictionnaire prédéfini. Dans ce cas, la taille du marqueur est de 4x4 et le nombre de marqueurs est de 50.
dictionary = aruco.getPredefinedDictionary(aruco.DICT_4X4_50)
Puis dessinez le marqueur. Le deuxième paramètre est la valeur détenue par le marqueur et le troisième paramètre est la taille de l'image du marqueur.
marker = aruco.drawMarker(dictionary, 4, 100)
J'ai fait quelque chose comme ça!
Préparez une image avec le marqueur et appelez-la comme suit. J'ai capturé l'écran du jupyter que j'essayais de réduire l'image à 1/20 et je l'ai détecté.
img = cv2.imread('capture d'écran.png')
img = cv2.resize(img, None, fx=0.05, fy=0.05)
corners, ids, rejectedImgPoints = aruco.detectMarkers(img, dictionary)
Même si la taille du marqueur est d'une dizaine de pixels, il peut être détecté correctement. C'est excellent!
for number, corner in zip(ids, corners):
print number, corner
[4] [[[ 11. 34.]
[ 26. 34.]
[ 26. 48.]
[ 11. 48.]]]
[4] [[[ 11. 6.]
[ 26. 6.]
[ 26. 20.]
[ 11. 20.]]]
Il semble qu'il existe diverses autres fonctions, je vais donc jouer avec.