Python
OpenCV
ArUco

ArUco マーカーの検出

More than 1 year has passed since last update.

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)

こんなものが出来ました!
download (1).png

マーカーを検出する

マーカーが写っている画像を用意して、以下のように呼び出します。
お試している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.]]]

他にも色々機能があるようなので、遊んでみようと思います。