pythonではARマーカーを簡単に作ったり、検知することができます。
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マーカーの種類を決める必要があります。
種類は以下のリンクを参考にしてください。
例えば、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スキルが身に付いたら、ぜひスキルを生かして稼いでいきましょう!