Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

ArUco マーカーの検出

More than 3 years have 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.]]]

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

mkisono
2016年にPython覚えました 他には、Java, JavaScript, C++を少々 React, Redux, Material-UI も覚えました Elasticsearch, AWSも使えます
https://kifu.me/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away