こんにちは、おかてんです。
今回は少しエンジニアらしくコードを書いてみました。
会社の勉強会でARマーカを認識しようというのがあったので、自分でも簡単に実装してみました。
今回の環境は
Max OS X El Capitan
Python
で実装します。
arucoというARマーカを読み取るライブラリがあるので、まずは使えるか確認してみました。
なんかエラーが出た。
ググってみると、どうやらopencv-pythonとopencv-contrib-pythonというパッケージが足りなかったようです。
ちなみにエラーが出てきたときにオススメなのがtaratailです。エンジニア向けのQ&Aサイトで、わからないエラーが出たらここで質問してみましょう。
それではそのパッケージを入れてみました。
もう一度arucoライブラリが使えるかを確認。
エラーが出ずうまく通りました。
ではAR認識ライブラリarucoを使って実装してみました。
出来上がったコードをこちらに載せます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Created on Wed Nov 15 21:45:45 2017 @author: okaten """ import cv2 import sys aruco = cv2.aruco #arucoライブラリ dictionary = aruco.getPredefinedDictionary(aruco.DICT_4X4_50) def arGenerator(): for i in range(50): generator = aruco.drawMarker(dictionary, i, 100) cv2.imwrite(str(i) + '.png', generator) def arReader(): cap = cv2.VideoCapture(0) #ビデオキャプチャの開始 while True: ret, frame = cap.read() #ビデオキャプチャから画像を取得 Height, Width = frame.shape[:2] #sizeを取得 #sizeを半分に縮小 halfHeight = Height / 2 halfWidth = Width /2 imghalf = cv2.resize(frame,(halfWidth,halfHeight)) corners, ids, rejectedImgPoints = aruco.detectMarkers(imghalf, dictionary) #マーカを検出 aruco.drawDetectedMarkers(imghalf, corners, ids, (0,255,0)) #検出したマーカに描画する cv2.imshow('drawDetectedMarkers', imghalf) #マーカが描画された画像を表示 cv2.waitKey(1) #キーボード入力の受付 cap.release() #ビデオキャプチャのメモリ解放 cv2.destroyAllWindows() #すべてのウィンドウを閉じる if __name__ == '__main__': args = sys.argv ar = args[1] if ar == "Generator": arGenerator() elif ar == "Reader": arReader() else: print("Please enter valid argument") |
このファイルを実行するのですが、引数をとって実行するようにしました。
引数→Generator:ARマーカ画像を出力
引数→Reader:ARマーカを認識するためにカメラを起動
というような設定になっています。
まずはARマーカを作らないといけないので、以下のコマンドをターミナルで以下を実行し、4×4のARマーカを50枚作成します。arMaker.pyはファイル名です。
1 |
$ python arMaker.py Generator |
出来上がったマーカがこんな感じ。こちらはid=0のARマーカです。
では、これを使って実際にARマーカを読み込んでみます。
我が家にプリンタがないので、スマホからARマーカを表示させてみました。
ターミナルで以下のコマンドを実行して、カメラを起動。
1 |
$ python arMaker.py Reader |
早速読み込ませてみました。
きちんと認識できてますね。idも0と表示されています。。
斜めに傾けても認識率は高そうです。
僕はスマホの画面からやりましたが、できるなら紙に印刷してやった方が認識率は高くなるでしょう。
これを何に使うかって話なのですが、1つはARアプリなどに応用できます。駅や空港などでスマホをかざすと、外国人に向けた翻訳なども可能に。
まあ、最近は光IDなどでもっと近未来的な開発も進んでいますが、原理としては似たようなものなので一応押さえておくこともありかなと。
Pythonを使った画像処理について学びたい方はUdemyのこちらの講座がオススメです。
【Pythonで学ぶ】OpenCVでの画像処理入門