AI要約
プラレールの電車にARマーカーを貼り付け、OpenCVを使って動画内で位置検出に挑戦しました。リアルタイム検出のためにはカメラの設定も重要です。自由研究にも最適な内容です。
やること
「プラレールを制御するシリーズ」が徐々に増えてきました。楽ちい!
今回は電車の位置を取得するために、OpenCVでARマーカーの検出を試してみます。
参考文献
「ArUco」で検索してください。先人の知恵をお借りします。

PythonでARマーカーを映像から探す - Qiita
#映像からARを見つけたいロボットとかをやってるとARマーカーをランドマークとしていろいろしたくなる。今回はpython3とopencvで簡単にカメラからARマーカーを見つけていく。環境py…

ArUcoマーカーの認識練習|Kan Hatakeyama
はじめに 本記事は、ロボットに化学実験をさせるための試行錯誤の記録です。 webに諸々の類似情報があるかもしれませんが、勉強のため、車輪の再発明をする覚悟で進めています。 本日は、ロボット分野で定番と...
ARマーカーの生成
こちらのコードでID=0, 1, 2のマーカーを生成しました。
import cv2
import matplotlib.pyplot as plt
#ArUco
aruco = cv2.aruco
#4x4マーカーの辞書
dictionary = aruco.getPredefinedDictionary(aruco.DICT_4X4_50)
#生成
img = aruco.generateImageMarker(dictionary, 0, 100) #第2引数がID、第3引数がピクセルサイズ
#表示
plt.imshow(img, cmap='gray')
plt.show()
#保存
cv2.imwrite('marker_0.png', img)
ID=0のマーカーです。

山手線、つくばエクスプレス、N700系に貼りました。マーカーは余白が必要なので印刷時はご注意を。

ARマーカーの動画検出
OpencvでWebカメラの映像をキャプチャしながらマーカー検出を行いました。「q」キーで終了。
import cv2
import numpy as np
#カメラ
cap = cv2.VideoCapture(0)
#カメラ設定
cap.set(cv2.CAP_PROP_FPS, 30)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
#露出などは別途設定
#ArUco
aruco = cv2.aruco
#4x4マーカーの辞書
dictionary = aruco.getPredefinedDictionary(aruco.DICT_4X4_50)
while 1:
#カメラキャプチャ
ret, frame = cap.read()
#表示
# cv2.imshow('frame', frame)
#マーカー検出
corners, ids, rejectedImgPoints = aruco.detectMarkers(frame, dictionary)
#写真に書き込み
aruco.drawDetectedMarkers(frame, corners, ids, borderColor=(0, 0, 255)) #BGR
#表示
cv2.imshow('frame', frame)
#qで終了
if cv2.waitKey(1) & 0xFF == ord('q'):
break
#カメラ解放
cap.release()
cv2.destroyAllWindows()
ほとんどフレーム落ちせず検出できていることが分かります。
ちなみにWebカメラはロジクールのC615、コスパがとても良かった製品です。こいつのフレームレートは最大30fpsなのでそのままでは電車がブレブレでまったくマーカーが反応しません。
そこで露出などを手動調整しておきます。ロジクール公式の調整ソフトがあるのですがほぼゴミ(似たソフトが多い、対応が謎、古い製品をなかったことにしすぎ)なのでサードパーティ製の優秀なソフト「NVCap_R」を使用しました。
こちらのサイトで紹介されています。(公式サイトが見つからず、すみません)
おわりに
これで材料は揃いました。
次回、いよいよQUBOアニーリングでプラレールの衝突回避(実物)です!
続編!