Pythonを使ってArUcoマーカージェネレーターを作成する方法

拡張現実になると、仮想オブジェクトとオーバーレイの位置決めが重要になります。そこでArUcoマーカーが登場します。ArUcoマーカーは、デジタルコンテンツをオーバーレイするために現実世界のシーンに配置できる単純なバイナリパターンです。

紙に印刷したり、スクリーンに表示したり、実世界のオブジェクトに投影したりすることができます。この柔軟性により、コンピュータビジョンアプリケーションで人気のある選択肢となっています。

ArUcoモジュールとOpenCVライブラリ

ArUcoマーカーを生成するには、OpenCVライブラリの一部であるArUcoモジュールが必要です。OpenCVは、コンピュータビジョンのアプリケーションを開発するためのツールと関数を多数備えたライブラリです。

このモジュールを使用すると、ArUcoマーカーを生成、検出、認識することができます。また、ポーズ推定を実行することもできます。これにより、仮想オブジェクトを現実世界に合わせ、没入型でシームレスなユーザーエクスペリエンスを作成することができます。

環境の設定

新しいPython仮想環境を作成します。これにより、プロジェクトに必要なライブラリをインストールする際に、パッケージのバージョンが競合しないようにすることができます。その後、ターミナルに移動し、次のコマンドを実行してOpenCVをインストールします。

pip install opencv-contrib-python

上記のコマンドは、OpenCVcontribライブラリをインストールします。これには、マーカージェネレーターを作成するために使用するArUcoモジュールが含まれています。このバージョンをインストールしてください。OpenCV-pythonには必要な機能が含まれていないためです。

完全なソースコードはGitHubリポジトリで入手できます。

ArUcoマーカージェネレータープログラムの作成

ArUcoマーカープログラムの作成は非常に簡単です。AruCoモジュールが大部分の作業を代行してくれるためです。まず、OpenCVをインポートして、コードでその関数とツールを使用できるようにします。

import cv2

特定のIDを持つ単一のマーカーを生成する関数を定義します。これにより、マーカーを大量に必要としない場合に対応できます。

def generate_single_marker(aruco_dict):
marker_size = int(input("Enter the marker size: "))
marker_id = int(input("Enter the marker ID: "))
marker_img = cv2.aruco.generateImageMarker(aruco_dict, marker_id,
marker_size)
cv2.imwrite("marker_{}.png".format(marker_id), marker_img)
marker_img = cv2.imread("marker_{}.png".format(marker_id))
cv2.imshow("Marker", marker_img)
print("Dimensions:", marker_img.shape)
cv2.waitKey(0)

次に、一定数のマーカーをまとめて生成する関数を定義します。生成できるマーカーの数は、使用するOpenCVディクショナリによって異なります。一部のディクショナリは他のディクショナリよりも多くのマーカーの生成をサポートしているためです。

def generate_bulk_markers(aruco_dict):
marker_size = int(input("Enter the marker size: "))
num_markers = int(input("Enter the number of markers to generate: "))
marker_imgs = []
for marker_id in range(num_markers):
marker_img = cv2.aruco.generateImageMarker(aruco_dict, marker_id,
marker_size)
cv2.imwrite("marker_{}.png".format(marker_id), marker_img)
marker_imgs.append(cv2.imread("marker_{}.png".format(marker_id)))
for marker_img in marker_imgs:
cv2.imshow("Marker", marker_img)
print("Dimensions:", marker_img.shape)
cv2.waitKey(0)

最後に、プログラムの流れを制御し、ユーザーに目的の操作を尋ねるメイン関数を定義します。プログラムの実行時に最初に実行されるようにします。

def main():
aruco_dict = cv2.aruco.getPredefinedDictionary(cv2.aruco.DICT_4X4_50)
user_input = input("Press '1' to generate a single marker or "
"'2' to generate markers in bulk: ")
if user_input == "1":
generate_single_marker(aruco_dict)
elif user_input == "2":
generate_bulk_markers(aruco_dict)
else:
print("Invalid input. Please try again.")
if __name__ == "__main__":
main()

これで、プログラムを実行して単一のマーカーまたはバルクで生成することができます。プログラムの出力は次のようになります。

出力には、生成されたArUcoマーカーが表示されます。プログラムは、各マーカーをマーカーIDを表す番号を末尾に付けて保存します。

ArUcoマーカーを生成した後は何をするのか?

ArUcoマーカーを生成したら、独自のシンプルなコンピュータビジョンアプリケーションを作成することができます。これにより、マーカーを使用してデジタル情報を現実世界のビジュアルにオーバーレイする方法を学ぶことができます。また、マーカーがシームレスで没入感のあるユーザーエクスペリエンスにどのように貢献するかを理解するのにも役立ちます。