📌
ARマーカーで遊んでみる
やること
ARマーカーを最近知りました。
ARマーカーの作成から検出までをまとめます。
参考記事
python/ライブラリーのバージョン
- Python 3.9.6
- opencv-contrib-python 4.9.0.80
- opencv-python 4.9.0.80
ARマーカーを作成
- 以下のコマンドを実行し、ライブラリーをinstallする
pip install opencv-python
pip install opencv-contrib-python
- 以下のコードを実行する
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)
- 画像が作成されたことを確認
ARマーカーを読み込み検出する
- 以下のコードを実行する
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)
- 検出されたことを確認
WebカメラでARマーカーを読み込み検出する
- 以下のコードを実行する
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()
- 検出されたことを確認
まとめ
ARマーカーで遊んでみました。
ARマーカーで物体のトラッキングができそうで面白そうだなーと思いました。
Discussion