Python Python 活用 プログラミング

【python できること】簡単!ARマーカーの作り方と検知する方法

 

pythonではARマーカーを簡単に作ったり、検知することができます。

ARマーカーをつけることで、カメラで製品や部材の認識ができます。

また、動くものであれば、トラッキングもできます。

 

本記事はこんな方におすすめです。

hituji
ARのマーカーの作り方、検知する方法を知りたい。

 

本記事の内容

  • インストール
  • ARマーカーの作成
  • ARマーカーの読み込み
  • 検知座標の取得

 

この記事を読むと、ARマーカーの作成から、その検知の方法について知ることができます。

 

サンプルコード

 

スポンサーリンク

ARマーカーについて

今回作るARマーカーは次のようなコードです。

OpenCVのArUcoを使っています。

 

QRコードに近いですね。

QRコードは文字やURLのリンクを情報として入れて使いますが、ARマーカーでは1-1000などの数値を紐づけています。

ARマーカーは遠くからでも認識ができ、同時に何個も検出することが可能です。

 

 インストール

ARマーカーを使うために、opencv-contrib-pythonをインストールします。

インストールは、下記のようにpipを使ってインストールできます。

pip install opencv-contrib-python

 

ライブラリの読み込み

画像読み込みと画像データを使うのにcv2,numpy

画像データ表示するのにmatplotを読み込みんでいます。

import numpy as np
import cv2
from cv2 import aruco
import matplotlib.pyplot as plt

 

ARマーカーの作成

ARマーカーの作り方を紹介します。

 

マーカーの種類

ARマーカーの種類を決める必要があります。

種類は以下のリンクを参考にしてください。

>> ARマーカーの種類 OpneCVドキュメント

 

例えば、DICT_4X4_50であれば、縦横4ビットで0-49の50個のマーカーを作ることができます。

 

DICT_ビット数_ID数となっています。

多いもので、1000個とかですね。

少ない場合は、2つ並べて組み合わせることで、1000個以上に対応することができます。

 

マーカーの作成

種類がわかったところで、マーカーを作っていきます。

ar_id: 作成するARマーカーの番号
img_size: ARマーカーのサイズ
ar_img: 作成されたAR画像

としています。

# マーカー種類を定義
aruco_dict = aruco.Dictionary_get(aruco.DICT_4X4_50)

# マーカー種類に応じて画像を
ar_id = 1
img_size = 150
ar_img = aruco.drawMarker(aruco_dict, ar_id, img_size)
print("画像サイズ", ar_img.shape)

# 画像表示
plt.imshow(ar_img, cmap = "gray")

# 画像保存
cv2.imwrite(f'{ar_id:02}.png', ar_img)

 

画像サイズや、ARマーカーの表示もしています。

 

これで1つのマーカーができました。

欲しい分の番号を繰り返し処理で作っていきましょう。

 

連結したARマーカーの作成

先ほど作成した、ARマーカーを並べれば、もし1000個以上IDが欲しい場合に有効です。

連結する場合の関数を紹介します。

# 連結したARマーカー
def create_concat_ar(no_list, img_size = 100):
    aruco_dict = aruco.Dictionary_get(aruco.DICT_4X4_50)
    
    space_x = np.zeros([100,10]) + 255
    img = space_x
    for l in no_list:
        img = np.concatenate([img, aruco.drawMarker(aruco_dict, int(l), 100)], axis = 1)
        img = np.concatenate([img, space_x], axis = 1)
    
    space_y = np.zeros([10,img.shape[1]]) + 255
    img = np.concatenate([space_y, img], axis = 0)
    img = np.concatenate([img, space_y], axis = 0)
    return img

 

これを使うと簡単に横並びに連結したマーカーを作ることができます。

試しに、30, 23, 40を横並びにします。

no_list = [30, 23, 40]
ar_img = create_concat_ar(no_list)
plt.imshow(ar_img, cmap="gray")

 

作成できました。

これを複数読む場合が、読んだ後、連結して読む必要があるかどうかは、座標などから判断が必要となります。

ARマーカーの読み込み

次のようなビンにARマーカーを貼ったものを検知してみます。
*実物に貼り付けてないのでイメージです。

 

検知には、aruco.detectMarkersを使います。

実際のコードで見ていきましょう。

# 画像読み込み 
frame = cv2.imread("ar_sample.png")
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
gray = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)

# ARマーカー検知
aruco_dict = aruco.Dictionary_get(aruco.DICT_4X4_50)
parameters =  aruco.DetectorParameters_create()
corners, ids, rejectedImgPoints = aruco.detectMarkers(gray, aruco_dict, parameters=parameters)

# 検知箇所を画像にマーキング
frame_markers = aruco.drawDetectedMarkers(frame.copy(), corners, ids)
plt.imshow(frame_markers)

 

検知できていますね。

何百とある部材の管理する場合に、これであれば、一発で有無チェックができます。

 

座標データの取得

検知できた位置情報などは、detectMarkersから受け取った、corners、idsに入っています。

ループで順番に取得していきます。

# 座標とidの確認
for i in range(len(ids)):
    # 検知したidの4点取得
    c = corners[i][0]
    x1, x2, x3, x4 = c[:, 0]
    y1, y2, y3, y4 = c[:, 1]
    
    print(f"id={ids[i]}")
    print("X座標", x1, x2, x3, x4)
    print("Y座標", y1, y2, y3, y4)
    print("中心座標", c[:, 0].mean(), c[:, 1].mean())
id=[7]
X座標 390.0 452.0 452.0 391.0
Y座標 292.0 292.0 353.0 353.0
中心座標 421.25 322.5
id=[6]
X座標 274.0 336.0 338.0 272.0
Y座標 290.0 289.0 352.0 356.0
中心座標 305.0 321.75
....

 

以上がARマーカーの作り方と検知の方法でした。

棚の部材や、工具など一発で確認できるようになれば便利ではないでしょうか?

 

他の活用方法は「python 活用 できることまとめ」も参考にしてください。

>> python 活用 できることまとめ

Pythonスキルが身に付いたら、ぜひスキルを生かして稼いでいきましょう!

>> Pythonでの副業の始め方紹介【隙間時間 で可能】

-Python, Python 活用, プログラミング