Détection des marqueurs ArUco

Essayez-le en vous référant à Détection des marqueurs ArUco.

Environnement: Mac OS X El Capitan OpenCV 3.2

Préparation

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’]

Faire un dictionnaire

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! download (1).png

Détecter les marqueurs

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.

Recommended Posts

Détection des marqueurs ArUco
Flux de base de détection d'anomalies
Calcul de l'IoU moyen dans la détection d'objets
Exemple d'exécution de la détection d'objets blob avec OpenCV
Détection automatisée du répertoire de construction dans waf
J'ai essayé la détection 3D d'une voiture