📌

ARマーカーで遊んでみる

2024/06/02に公開

やること

ARマーカーを最近知りました。
ARマーカーの作成から検出までをまとめます。

参考記事

https://less-ar.jp/media/column/marker
https://qiita.com/koichi_baseball/items/d51373e7fd6dddb57d1f
https://hituji-ws.com/code/python/python-armarker/

python/ライブラリーのバージョン

  • Python 3.9.6
  • opencv-contrib-python 4.9.0.80
  • opencv-python 4.9.0.80

ARマーカーを作成

  1. 以下のコマンドを実行し、ライブラリーをinstallする
pip install opencv-python
pip install opencv-contrib-python
  1. 以下のコードを実行する
import cv2
import numpy as np
from cv2 import aruco

# サイズとオフセット値
size = 150
offset = 10
x_offset = y_offset = offset // 2

# マーカーの個数
num_markers = 6
grid_size = int(np.ceil(np.sqrt(num_markers)))

# 辞書を取得して画像を生成
dictionary = aruco.getPredefinedDictionary(aruco.DICT_4X4_50)

# 白い画像を作成(すべてのマーカーを収めるために適切なサイズにする)
img_size = grid_size * (size + offset)
img = np.zeros((img_size, img_size), dtype=np.uint8)
img += 255

# マーカーを生成して画像に重ねる
for marker_id in range(num_markers):
    ar_img = aruco.generateImageMarker(dictionary, marker_id, size)
    row = marker_id // grid_size
    col = marker_id % grid_size
    y_start = row * (size + offset) + y_offset
    x_start = col * (size + offset) + x_offset
    img[y_start:y_start + ar_img.shape[0], x_start:x_start + ar_img.shape[1]] = ar_img

cv2.imwrite("markers_0_to_5.png", img)


  1. 画像が作成されたことを確認

ARマーカーを読み込み検出する

  1. 以下のコードを実行する
import cv2
from cv2 import aruco

# get dictionary and parameters
dictionary = aruco.getPredefinedDictionary(aruco.DICT_4X4_50)
parameters = aruco.DetectorParameters()

# Create ArucoDetector object
detector = aruco.ArucoDetector(dictionary, parameters)

# read from image
input_file = "markers_0_to_5.png"
output_file = "markers_0_to_5_drawing.png"
input_img = cv2.imread(input_file)

# detect and draw marker's information
corners, ids, rejectedCandidates = detector.detectMarkers(input_img)
print(ids)
ar_image = aruco.drawDetectedMarkers(input_img, corners, ids)

cv2.imwrite(output_file, ar_image)

  1. 検出されたことを確認

WebカメラでARマーカーを読み込み検出する

  1. 以下のコードを実行する
import cv2
from cv2 import aruco

# マーカー種類を定義
dictionary = aruco.getPredefinedDictionary(aruco.DICT_4X4_50)
parameters = aruco.DetectorParameters()

# ArucoDetectorオブジェクトを作成
detector = aruco.ArucoDetector(dictionary, parameters)

# Webカメラをキャプチャ
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)

if not cap.isOpened():
    print("Webカメラが見つかりません")
    exit()

while True:
    # フレームを取得
    ret, frame = cap.read()
    if not ret:
        break

    # グレースケールに変換
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # マーカーを検出
    corners, ids, rejectedCandidates = detector.detectMarkers(gray)

    # 検出したマーカーを描画
    if ids is not None:
        frame = aruco.drawDetectedMarkers(frame, corners, ids)
        print(f"検出されたマーカーID: {ids.flatten()}")

    # フレームを表示
    cv2.imshow('frame', frame)

    # 'q'キーで終了
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# リソースを解放
cap.release()
cv2.destroyAllWindows()
  1. 検出されたことを確認

まとめ

ARマーカーで遊んでみました。
ARマーカーで物体のトラッキングができそうで面白そうだなーと思いました。

ヘッドウォータース

Discussion