Versuchen Sie es unter Erkennung von ArUco-Markern.
Umgebung: Mac OS X El Capitan OpenCV 3.2
ArUco-Funktionen sind im OpenCV-Beitrag enthalten. Wenn Sie OpenCV mit Homebrew installiert haben, installieren Sie es mit der Option --with-Contrib.
% brew install opencv3 --with-contrib
In OpenCV vor einiger Zeit schien die Python-Unterstützung von ArUco nicht perfekt zu sein. Aber jetzt fühlt es sich an, als könnte es knusprig verwendet werden.
import cv2
aruco = cv2.aruco
dir(aruco)
Es wurde so ausgegeben.
['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’]
Erstellen Sie ein Wörterbuchobjekt mit einem vordefinierten Wörterbuch. In diesem Fall beträgt die Markergröße 4x4 und die Anzahl der Marker 50.
dictionary = aruco.getPredefinedDictionary(aruco.DICT_4X4_50)
Dann zeichnen Sie den Marker. Der zweite Parameter ist der Wert, den der Marker hält, und der dritte Parameter ist die Größe des Markerbildes.
marker = aruco.drawMarker(dictionary, 4, 100)
Ich habe so etwas gemacht!
Bereiten Sie ein Bild mit dem Marker vor und nennen Sie es wie folgt. Ich habe den Bildschirm des Jupyter aufgenommen, den ich versucht habe, das Bild auf 1/20 zu reduzieren, und es erkannt.
img = cv2.imread('Bildschirmfoto.png')
img = cv2.resize(img, None, fx=0.05, fy=0.05)
corners, ids, rejectedImgPoints = aruco.detectMarkers(img, dictionary)
Selbst wenn die Größe des Markers ein Dutzend Pixel beträgt, kann er korrekt erkannt werden. Es ist exzellent!
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.]]]
Es scheint, dass es verschiedene andere Funktionen gibt, also werde ich damit spielen.
Recommended Posts