[technology]COZMO SDKを使って、COZMOのカメラ映像をOpenCVに読み込ませる
COZMOは日本ではタカラトミーから発売されているAIロボットトイです。
www.takaratomy.co.jp
残念ながら開発元の米ANKI社は事業を畳むらしいのですが、我が家では小学生の息子の良い遊び相手として現役で活躍しています。
さて、このCOZMO、python経由でリモート制御するためのSDKが公開されており、またCOZMOの顔部分にはカメラも付いているのでそのうちのディープラーニングとか使って自律走行させたいと思っていました。
で、手始めにCOZMO君のカメラ画像をpythonスクリプトで読み出し、OpenCVで扱えるnumpyのベクトルに変換する方法を調査しました。
APIリファレンスは公開されているので、これを調べれば良いですが、APIリファレンスを読んでもなかなか全体像を把握しずらく、SDKについているサンプルソースから調査します。
cozmosdk.anki.com
SDKのサンプルソースにtutorials/02_cozmo_face/02_cozmo_face_mirror.pyに参考になる実装があります。
while True: duration_s = 0.1 # time to display each camera frame on Cozmo's face latest_image = robot.world.latest_image 〜中略〜 time.sleep(duration_s)
抜粋すると上記の様な感じで、COZMOの制御用クラスcozmo.robot.Robotのインスタンスのworld.latest_imageというオブジェクトを定期的に参照することで、COZMOのカメラ画像を取得出来ます。
実際のカメラ画像はPillowのイメージフォーマットでworld.latest_imageのraw_imageをいうメンバー変数に格納されています。
COZMOのカメラ自体はモノクロですが、このraw_imageはRGBのカラーデータを格納する形式になっています。
このraw_imageをnumpyのarrayに変換すればOpenCVで扱えます。
下記はとりあえずOpenCVにカメラ画像を渡して表示するだけのサンプルです。
最終的にはOpenCVの物体検出器とかと組み合わせてCOZMOの制御を出来る様にしたいと思っています。
#!/usr/bin/env python3 # Example to pass COZMO camera image to OpenCV function # Copyright (C) RC30-popo,2019 import sys import time import cv2 from PIL import Image import numpy as np import cozmo def cozmo_camera_test(robot: cozmo.robot.Robot): robot.camera.image_stream_enabled = True # Enable COZMO camera capture head_action = robot.set_head_angle(cozmo.util.Angle(degrees=0.0),in_parallel=False) head_action.wait_for_completed() firstTime = True try: while True: duration_s = 0.1 latest_image = robot.world.latest_image if latest_image != None: gray_image = latest_image.raw_image.convert('L') cv_image = np.asarray(gray_image) if firstTime: height, width = cv_image.shape[:2] print('*** Start captureing COZMO camera') print('image height = ',height) print('image width = ',width) firstTime = False cv2.imshow('frame',cv_image) cv2.waitKey(1) time.sleep(duration_s) except KeyboardInterrupt: print('Keyboard Interrupt!!') print('Exit Cozmo SDK') cv2.destroyAllWindows() pass cozmo.run_program(cozmo_camera_test)