Detection of ArUco Markers を参考にやってみる。
環境: Max OS X El Capitan
OpenCV 3.2
準備
ArUcoの機能は、OpenCV の contribに入っています。なので、homebrewでOpenCVをインストールしているなら、--with-contrib オプションを付けてインストールしましょう。
% brew install opencv3 --with-contrib
少し前のOpenCV では、ArUcoのPython対応は完全では無いようでした。ですが現在はバリッと使える感じがします。
import cv2
aruco = cv2.aruco
dir(aruco)
このように出力されました。
['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’]
辞書を作る
予め定義されている辞書を使って dictionary オブジェクトを作ります。この場合はマーカーのサイズが4x4で、マーカーの数は50です。
dictionary = aruco.getPredefinedDictionary(aruco.DICT_4X4_50)
次にマーカーを描画します。2番目のパラメータがマーカーの保持する値で、3番目のパラメータはマーカー画像の大きさです。
marker = aruco.drawMarker(dictionary, 4, 100)
マーカーを検出する
マーカーが写っている画像を用意して、以下のように呼び出します。
お試しているjupyterの画面をキャプチャし、画像を20分の1に縮小して検出させてみました。
img = cv2.imread('スクリーンショット.png')
img = cv2.resize(img, None, fx=0.05, fy=0.05)
corners, ids, rejectedImgPoints = aruco.detectMarkers(img, dictionary)
マーカーのサイズが十数ピクセルでも正しく検出できています。優秀ですね!
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.]]]
他にも色々機能があるようなので、遊んでみようと思います。