論文本文 - 中京大学

2014年度
卒
業
論
文
ARの拡張性の研究
指導教員 白井英俊 教授
中京大学 情報理工学部 機械情報工学科
学籍番号 H411023 太田 智章
(2015 年 1 月)
卒業論文要旨
題目
学籍番号
H411023
氏名
AR の拡張性の研究
太田 智章
指導教員
白井
英俊
本研究は Augmented Reality(以降 AR と呼ぶ)に対する自分自身の理解を深
めることを目的として、AR の拡張性について研究を行ったものである。昨今 AR
に対する注目が集まっているように感じたことがこの研究背景にある。CG を用
いたアニメーションや地図機能の拡張、マーカを用いた CG の表示による指示な
ど、AR の多彩な扱い方を知って、AR にはまだまだ新たな利用方法があると考え
た。どのような利用方法があるか、その拡張性を考えるために AR を学び、いろ
いろな拡張性を検討することにした。
AR の白黒マーカとは Web カメラと白と黒の2色のみを用いたマーカにより AR
を実現するものである。扱いやすく AR の初心者に適していると考えたので、本
研究ではこれを採用した。AR のプログラム作成には Processing を用いた。
Processing は比較的少ない文量でプログラムを作れるため、バグを軽減できる。
さらに AR を扱える NyAR4spg ライブラリがあるので、AR 作成環境の整備は容易
である。
我々は次のように研究を進めた。まず AR についての調査を行い、白黒マーカ
の扱い方を学んだ。その後、自分自身の AR の理解度を測るため、Boe-Bot とい
う自動二輪の三輪車のロボットを無線(Bluetooth)制御するシステムを AR を用
いて作成した。なお、このロボットの無線制御は 2013 年度の卒業研究を参考に
した。本研究ではスマートフォンでの制御を AR で代用することが特徴である。
つまり、白黒マーカを用い CG を表示するためでなく、ロボットを動かすコント
ローラとして用いた。具体的には、Web カメラからマーカを隠すことで、そのマ
ーカに対応する命令が無線通信でロボット側に送られる。ロボットのコントロ
ールには Arduino を用い、無線で送られた命令を元に左右の車輪の速度を変化
させてロボットが前後左右に動くようにした。このシステムは設計通り機能し、
操作性も満足行くものであった。
ロボット制御の研究から得られた知識を元に、AR の拡張の次の試みとして、
防犯カメラの機能を AR で代用することを考えた。防犯カメラという身近であり、
かつその機能が十分理解できるものに AR を応用することにより、AR の拡張性を
追求しようとしたのである。また、AR はカメラを用いる必要があるため、防犯
カメラとして利用することは自然な拡張であるとも考えた。この防犯カメラシ
ステムでは、警報音を鳴らすことや記録を残す(ログを取る、画像を保存する)
ことをその機能として取り入れた。その動きは次のようなものである。通常時
1
は Web カメラがマーカを認識しており、そのときには指定された CG が表示され
ている。ここで、マーカが認識できなくなったとき、つまり侵入者などによっ
てカメラからマーカが隠されたときに、防犯カメラに付随する機能が作動する。
これにより、一般的な防犯カメラでは常時録画されているが、このシステムで
は必要なときだけ作動させることができる。すなわち、Web カメラがマーカを認
識しなくなったときにだけ画像を保存することにより、必要とされる記憶容量
を低く抑えられるのが利点である。また、警報音を鳴らすことで使用者に通知
することもできる。このシステムも完成し、いくつかの確認実験により、設計
通りの機能を持つことが確認できた。
以上の研究内容をまとめる。まず、最初のシステム製作により、リモコンロ
ボットの操作制御を AR で代用することができた。それにより AR についての知
識を深めることができた。次の防犯カメラとして AR を用いたシステム製作によ
り、AR の拡張可能性について考察することができた。これらの結果として、我々
は AR を理解できたと考える。
しかし、問題点もいくつか残った。その一つは、白黒のマーカと防犯カメラ
の組み合わせが実用性に乏しいのではないかということである。ただし、この
問題に対してはマーカレスの利用による解決策が考えられる。マーカレスは白
黒マーカとは違い、チラシやポスターの一部をマーカとして利用することであ
る。これによりデザインや色による制約がかなり緩和される。マーカレスなら
ば、壁などに貼り付けても、白黒マーカと異なり環境に調和した使用が可能で
ある。また、本研究では 1 台と仮定していたカメラを複数台用いる、マーカの
数を増やしてそれぞれに個別の機能を追加する、またカメラの解像度を上げマ
ーカの認識範囲やスクリーンショットの効果を向上するなどの方法が考えられ
る。AR 全体の拡張方法としては、キーボードなどのインターフェイスとして使
用する。また、音を鳴らすことに着目するとピアノのようなシステムを作るこ
とが可能である。また、Bluetooth を用いることでテザリングした家電製品の起
動スイッチとしても使用することができると考えている。
2
目次
第一章
はじめに
1
第二章 研究の基本構成
2.1 AR について
2.1.1 白黒マーカを用いた AR について
2.1.2 Web カメラについて
2.2 Processing について
2.3 研究の基本構成
3
3
4
4
5
5
第三章 コントローラとしての AR
3.1 AR の研究
3.2 リモコンロボットについて
3.3 リモコンロボットの制御
3.4 Processing からの制御
3.5 認識プログラムの追加
3.6 コントローラとしての動作実験
6
6
7
8
9
11
12
第四章 防犯カメラとしての AR
4.1 使用例
4.2 機能
4.2.1 音を鳴らす
4.2.2 記録を残す
4.2.3 画像の保存
4.3 防犯カメラシステムの動作実験
14
14
14
15
15
16
17
第五章 結果と展望
5.1 結果
5.2 実際の家庭での使用例
5.3 展望
5.3.1 防犯カメラの展望
5.3.2 AR 全体の展望
18
18
18
19
19
20
i
参考文献
22
謝辞
24
付録 1. Boe-Bot のプログラム
付録 2. 防犯カメラのプログラム
25
33
ii
第一章
はじめに
昨今 Augmented Reality(以降 AR と呼ぶ)に対しての注目が集まっているよ
うに感じる。例えば観光地ではプロジェクションマッピングという CG を用いた
アニメーションを目玉にするようになってきている。また、スマートフォンの
カメラと GPS を用いた地図の公共施設の表示なども話題になっている。そのど
ちらも AR という技術の一部だと知った私は AR に可能性を感じ、AR に興味を持
つようになった。AR には様々な種類があるが、その中で白黒のマーカを用いた
AR というものを見つけた。これは Web カメラと白黒のマーカだけで研究を進め
ることができるので、AR に対して初心者の我々には最適なものといえる。
我々は次のように研究を進めた。まず AR についての調査を行い、白黒マーカ
の扱い方を学んだ。その後、自分自身の AR の理解度を測るため、Boe-Bot とい
う自動二輪の三輪車のロボットを無線(Bluetooth)制御するシステムを AR を用
いて作成した。なお、このロボットの無線制御は 2013 年度の卒業研究を参考に
した。本研究ではスマートフォンでの制御を AR で代用することが特徴である。
つまり、白黒マーカを用い CG を表示するためでなく、ロボットを動かすコント
ローラとして用いた。具体的には、Web カメラからマーカを隠すことで、そのマ
ーカに対応する命令が無線通信でロボット側に送られる。ロボットのコントロ
ールには Arduino を用い、無線で送られた命令を元に左右の車輪の速度を変化
させてロボットが前後左右に動くようにした。このシステムは設計通り機能し、
操作性も満足行くものであった。
ロボット制御の研究から得られた知識を元に、AR の拡張の次の試みとして、
防犯カメラの機能を AR で代用することを考えた。防犯カメラという身近であり、
かつその機能が十分理解できるものに AR を応用することにより、AR の拡張性を
追求しようとしたのである。また、AR はカメラを用いる必要があるため、防犯
カメラとして利用することは自然な拡張であるとも考えた。この防犯カメラシ
ステムでは、警報音を鳴らすことや記録を残す(ログを取る、画像を保存する)
ことをその機能として取り入れた。その動きは次のようなものである。通常時
は Web カメラがマーカを認識しており、そのときには指定された CG が表示され
ている。ここで、マーカが認識できなくなったとき、つまり侵入者などによっ
てカメラからマーカが隠されたときに、防犯カメラに付随する機能が作動する。
これにより、一般的な防犯カメラでは常時録画されているが、このシステムで
は必要なときだけ作動させることができる。すなわち、Web カメラがマーカを認
識しなくなったときにだけ画像を保存することにより、必要とされる記憶容量
1
を低く抑えられるのが利点である。また、警報音を鳴らすことで使用者に通知
することもできる。このシステムも完成し、いくつかの確認実験により、設計
通りの機能を持つことが確認できた。
以上の研究内容をまとめる。まず、最初のシステム製作により、リモコンロ
ボットの操作制御を AR で代用することができた。それにより AR についての知
識を深めることができた。次の防犯カメラとして AR を用いたシステム製作によ
り、AR の拡張可能性について考察することができた。これらの結果として、我々
は AR を理解できたと考える。問題点として白黒のマーカと防犯カメラの組み合
わせは実用性に乏しいのではないかということが挙げられる。
本論文の構成は以下の通りである。第二章では本研究で用いる AR の概要や白
黒マーカを用いた AR、使用した Web カメラの詳細、AR を扱う Processing につ
いての説明をする。また、本研究の簡単な流れも説明する。第三章では AR の作
成環境の整備、AR の使用方法について説明する。その後、リモコンロボットの
コントローラとして AR を用いた制御について説明をする。また、リモコンロボ
ットとして用いた Boe-Bot や制御用に用いた Arduino についても合わせて解説
する。第四章では前章で培った知識を元に防犯カメラとして AR を作成した。そ
の使用例を想定し、必要な機能を作成した。その一連の流れを説明する。第五
章では本研究の結果と実際の使用例、防犯カメラシステムの展望とともに AR 全
体の展望について述べる。
2
第二章
研究の基本構成
本研究では Augmented Reality(以降 AR と呼ぶ)の拡張性の研究を主題とし
ている。本章では研究に使用した AR の概要から始まり、本研究で使用した AR
の種類や Web カメラ、Processing についても説明する。その次に基本構成につ
いて述べる。
2.1 AR について
AR とは「現実世界を何らかの手段で増強、拡張する」ための技術の総称。AR
で特徴的な点は情報が偏在するだけでなく、現実世界の視界と電子的な情報を
重畳(オーバレイ)して表示することにある(暦本,2012)。
AR にはいくつか種類があり広く知られているものとして、プロジェクションマ
ッピングがある。プロジェクターから建物などに電子的な情報を表示し、アニ
メーションを楽しむというものである(図 2.1a)。また GPS を用いた地図機能の
拡張などもある。スマートフォンのカメラ機能を用いることで、周囲の情報を
CG で分かりやすく表現するというものである(図 2.1b)。
図 2.1(a) 城に対してプロジェ
クションマッピングしたもの
(うつくしま観光プロモーション
振興機構, 2013)
図 2.1(b) GPS を用いた AR
(愛知県地域振興部情報企画課、
2014)
3
2.1.1
白黒マーカを用いた AR について
白黒マーカとは、画像認識による AR の一つで、モバイル端末で処理するシス
テムに分類されるものである。白黒マーカは周囲と調和しない不自然さがある
(加藤, 2012)ものの、白と黒の二色のみを用いているので比較的少ない計算
量で正確な認識が可能であり、容易に扱うことができるため、本研究ではこれ
を使用した。(白黒マーカは以降単に AR マーカと呼ぶことにする)
図 2.2 白黒マーカの写真(左)とそのマーカから CG を表示した状態(右)
2.1.2
Web カメラについて
AR にはマーカを認識するカメラが必要であるが、AR マーカを認識することだ
けが要求用件なので、カメラの性能については特に考慮せず、USB に接続するだ
けですぐに使えるという手軽さから、本研究では UCAM-DLV300T(図 2.3)を使用
した。
図 2.3 UCAM-DLV300T
4
2.2 Processing について
Processing は Java を元にしたプログラミング言語で、図形などを簡単に描画
できる関数が多数ある(図 2.4)。プログラムが短く簡単に書け、ライブラリも豊
富で AR を扱える NyAR4spg というものがあるため使用した。
図 2.4 左は box()、右は sphere()という関数で表示できる
2.3 研究の基本構成
初めに AR の理解を深めるため AR の研究をする。その後、研究室で学習してい
たリモコンロボットを用い AR の拡張性を調べる。次に AR の利用方法として身
近で扱いやすいものに対して AR を用いる。
5
第三章 コントローラとしての AR
本章では AR の理解のために、去年の先輩の卒業研究の内容を AR で実現する
ことにした。AR の勉強は橋本直(2012)を参考に、蟹井翔貴(2013)のリモコ
ンロボットの制御を AR を用いて行う。
3.1 AR の研究
AR を用いたプログラムには ARToolKit というライブラリを使うのが一般的で
ある。Processing の場合はそれを元にした NyAR4psg というライブラリを用いて
AR のプログラムを作っていく。その際の開発環境は表 3.1 の通りである。
Quike Time と VDIG を用いることで、Web カメラの映像をキャプチャすること
ができるようになる。キャプチャした映像から AR マーカの有無を判別し、AR マ
ーカを認識したときに CG を表示する。
AR マーカは簡単に自作できるため本研究でも用いている。黒と白の割合が
1:2:1 になるように黒の枠を作るとマーカとして扱える。windows に標準搭載さ
れているペイントソフトで容易に作成可能である。その後、Processing にマー
カの情報を入れるために画像ファイルから黒と白を 2 値化したデータファイル
にする。その 2 値化に使用したソフトウェアは表 3.2 の通りである。
表 3.2 のソフトウェアを用いて出力されたファイルを用いることで、AR マーカ
として扱うことができる。
次に扱えるマーカの数を増やすことにした。一つのマーカには基本的に一つ
の CG しか表示できないのは仕様のせいである。同じマーカを複数認識するか実
験したが、最初に認識したマーカにしか CG を表示しなかったため、複数のマー
カを利用するということにした。
しかし、この場合、マーカを Processing 側に登録する場合に変数名を変えた
だけのほぼ同じプログラムを書く必要がある。この問題を克服するため、橋本
直(2008)の MultiMarker からヒントを得て、Owed (2013)と gutugutu30(2013)
を用いることで、連番になっているマーカファイルを一度に複数読み込むよう
にした。
AR はプログラミング言語の条件文の正論理を用い CG を表示している。しかし
負論理の部分を活用していないことに我々は気付いた。本研究で用いられてい
る AR はこの負論理を用いた内容である。本章のリモコンロボットに対して AR
を用いたプログラムに関しても条件文の負論理を用いてリモコンロボットのコ
ントローラとしている。その説明に関しては 3.4 で説明する。
6
表 3.1 開発環境
使用したソフトウェア
バージョン
Processing
1.5.1
Quike Time
7.5
VDIG
1.0.1
表 3.2 2 値化に使用したソフトウェア
使用したソフトウェア
バージョン
ARToolKit Marker Generator(図 3.1)
0.1
Adobe air
14.0.0.110
図 3.1 ARToolKit Marker Generator が 2 値化する白黒マーカを見つけている
3.2 リモコンロボットについて
リモコンロボットは、Parallax 社から発売されている Boe-Bot(図 3.2)を使用
した。これは Servo モータが二つ付いている自動二輪の三輪車であり、組み立
て式で比較的安価で買えるものである。
7
3.3 リモコンロボットの制御
リモコンロボットの制御用に Arduino を使用した。Arduino は AVR マイコンを
搭載したマイコンボードでいろいろな種類があるが、本研究では広く一般的に
使われている Arduino Uno(図 3.3)を用いた。この Arduino を用いて、Boe-Bot
の制御や PC 側の AR と Bluetooth 通信を行った。
図 3.2 Boe-Bot
リモコンロボットは、2 つの Servo モータを動かすことで車輪を回転させ、前進・
後退・左旋回・右旋回・停止の 5 つの動作が可能である。プログラム中では
writeMicroseconds()という Arduino の関数を用いることで Servo モータを制御
する。表 3.2 に示すように引数の値(パルス幅)を両方とも 1500 とすればモー
タは停止する。そして、その値よりプラス・マイナス 200 以内(1300 から 1700)
の値を引数に与えるとモータが回転する。引数の値と 1500 との差の絶対値が大
きいほどモータの回転速度は増える。ここで前進時や後退時の左右のモータの
値が、一方が 1500 より大きくもう一方が 1500 よりも少ない理由は、Boe-Bot に
モータを取り付ける際の向きが逆向きだ(いわば背中合わせにモータを取り付
けている)からである。つまり一方が時計回りで、もう一方が反時計回りに回
ることで、ロボット全体として両方のモータが同じ方向に回転する。ロボット
を左右に旋回するには、一方を停止させ、もう片方のモータを回転させるとい
う(停止した車輪を中心とする)回転を行うようにした。したがって、左回転
の場合は左のモータを停止させて右のモータを前進方向(時計回り)に回転さ
せる。右回転の場合はこの逆を行う(その場合は、左のモータが反時計回りに
なる)。
8
図 3.3 Arduino Uno
表 3.2 リモコンロボット動作
動作
左のモータのパルス幅
右のモータのパルス幅
前進
1700
1300
後退
1300
1700
左旋回
1500
1300
右旋回
1700
1500
停止
1500
1500
3.4 Processing からの制御
前述のリモコンロボットの動作に合わせ、ロボット操作用の AR マーカを 5 つ
用意した(図 3.4)。ここでの AR は負論理を用い、Web カメラが認識していると
きに AR マーカにより CG を表示する。しかし、指など障害物によって AR マーカ
が隠され、Web カメラが AR マーカを認識しなくなったときにはその隠された AR
マーカに対応する命令をリモコンロボットに送る(表 3.3)。命令は Processing
側からの一方通行で、AR マーカを隠している間は命令を送り続ける。AR マーカ
の配置やマークは一目で分かりやすいようにしたり停止用の AR マーカを大きく
したりするなど扱いやすいようにした。
PC の Processing プログラムとリモコンロボットを操作する Arduino とをシリ
アル通信するため、近距離無線通信規格の一つである Bluetooth を使用した。
Arduino で使用した Bluetooth シールドは Bluetooth Shield V2.2 であり、PC
で使用した機器は BT-MicroEDR2X(図 3.5)である。BT-MicroEDR2X は特別な設定
が不要で PC の USB ポートに接続するだけで利用可能である。
9
図 3.4 リモコンロボットを制御するために用いたマーカ
表 3.3 マーカを隠したときに送る命令
隠すマーカ
送る命令
上
前進
下
後退
左
左旋回
右
右旋回
I
停止
図 3.5 BT-MicroEDR2X
10
3.5 認識プログラムの追加
本研究で用いている AR の負論理使用には問題がないわけではない。その一つ
は、プログラムを起動したとき、Web カメラから映像をキャプチャできていない
状態が生じて、そのためにシステムが AR マーカを認識していないと判断される
という問題である。つまり、その場合は認識されていない AR マーカに付けられ
た命令をリモコンロボットに送ってしまい、使用者の望まない行動を起こす危
険性があるのである。言い換えれば、Web カメラが AR マーカを認識していない
ときにプログラムを実行するという負論理を適用するには、予め Web カメラが
全てのマーカを認識している必要があるのである。
この問題点を克服するために「認識プログラム」を追加した。これは Web カ
メラが AR マーカを認識しているかどうかを使用者が確認するためのものである。
そして、プログラムを起動した場合、この認識プログラムが最初に実行される
ものとした。その後の手順は以下のとおりである:
1. AR マーカを見つけた時には立方体を表示する。
2. 全てのマーカを認識したら、AR マーカの内の一つだけに球体を表示する
(図 3.6)。
3. その後カウンターを起動し適当な時間後に、本来実行すべきプログラム
に移行する。
ここでカウンター起動後から本来のプログラムに移行する時間は変更可能であ
る。また、認識プログラムが作動中に AR マーカを一つでも見失った場合は球体
の表示を消して、どのような状態であるか、使用者が一目で分かるようにして
いる。
なお、この認識プログラムは第四章で述べる「防犯カメラとしての AR」にも
用いている。
11
図 3.6 認識プログラムが全ての AR マーカを認識している状態
3.6 コントローラとしての動作実験
2014 年 8 月に中京大学のオープンキャンパスがあり、我々の研究室の出し物
として本章で述べた「AR を用いたリモコンロボットの制御」を一日約7時間、
計二日間展示した。使用環境は大学の教室の教卓の窓際で、AR マーカは紙に印
刷し図 3.4(および図 3.6)のように並べ教卓のホワイトボードに磁石を用いて固
定した。また、リモコンロボットは床に置き Web カメラは全ての AR マーカを認
識できる高さに固定した。Web カメラと AR マーカの間に障害物はなくマーカを
隠す際は差し棒を使用した。
この結果は、総使用時間が約 6 時間、連続使用時間は 3 時間程で、使用感も
満足のいくものだった。しかしいくつか問題があることがわかった。まず、全
てのマーカが隠されたときに、プログラムはマーカ全てに対応する命令をロボ
ットに送信したため、ロボットがこれらの行動をすべて行うようになっていた
ことである。つまり、複数の動作が指定されることを想定せず、そのため動作
には優先順位を設けなかったのである。この結果、全てのマーカが隠されてい
る間中、ロボットは小刻みに色々な動作をしていた。ロボットの動作は移動だ
けであり、特に危険な状態にはならなかったものの、この問題に対処する必要
性を感じた。別な問題としては、細い指し棒を用いていたにもかかわらず、隠
すべきマーカ以外のマーカも隠してしまうことが度々あったことである。これ
はマーカの配置の位置関係が悪かったせいである。見た目の分かりやすさを重
視した配置を採用したつもりであったが、操作性の面で扱いづらいものとなっ
12
ていた。もう一つの問題は、教卓のホワイトボードに固定されたマーカとリモ
コンロボットの位置関係が悪く、人間がその両方を同時に認識できなかったこ
とである。これはリモコンロボットの仕様として、別な命令が送られてこない
限り、前に送られた命令を繰り返すようにしたため、ロボットが停止せずに壁
に何度も衝突したりして危険な状態になった。
どの問題もリモコンロボットを用いた AR の研究の拡張を考えるのなら、危険性
のないよう対処する必要がある。しかし、この方式の良い点も明らかになった。
差し棒を用いてマーカを隠してモコンロボットを操作するという方法は、オー
プンキャンパスに来た初見の学生でも容易に行えるものであったということで
ある。この、初めて使用する人でも容易に扱えるということはとても重要だと
考えた。そして、この研究は、我々がさらに AR の拡張の方向性をつきつめて考
えるきっかけとなった。
13
第四章
防犯カメラとしての AR
三章「コントローラとしての AR」では AR を用いてロボットを制御した。その
技術の応用として、AR を用いた防犯カメラのシステムを作成した。防犯カメラ
は我々の生活に身近であり、かつその機能が十分理解されていることから、性
能の評価がしやすく AR の応用として最適だと考えたためである。さらに、Web
カメラと AR マーカだけで実現可能という簡潔さ、性能がプログラムの機能に依
存するという高い拡張性も大きな理由になっている。
本章では防犯カメラとしての AR の使用例と機能について述べる。
4.1 使用例
防犯カメラの使用例として図 4.1 の状況を考えた。そこでは、開閉式の扉が
障害物となるような位置に AR マーカを配置する。そして、その壁の AR マーカ
を写すように Web カメラを配置する。もっともここでは、AR の拡張性の研究の
一つとして考えているため、実際の環境下で使用できるかは考慮していない。
図 4.1 Web カメラが AR マーカを認識している状況(左)と、扉が開いて AR マー
カが認識されない状況(右)
4.2 機能
ここで考える防犯カメラは、大まかに次の三つの機能を実現している:
1. 警報を鳴らすこと
2. 記録を残すこと
3. 画像を保存すること
基本的に AR マーカを認識しているときは CG を表示するものとし、AR マーカが
14
隠れたときに上記の機能が作動する。
4.2.1 音を鳴らす
防犯カメラとして警報を鳴らすために、Processing のプラグインの Minim ラ
イブラリを用いた。これにより Processing から音を鳴らすことができる。具体
的には、AR マーカを認識している場合は音を鳴らさず、AR マーカが隠れている
ときは指定の音を連続再生する。
鳴らせる音は、基本的な音声ファイルならどのようなものでも可能である。
本研究では防犯カメラの機能として警報音を用いた。
4.2.2 記録を残す
AR マーカが Web カメラから隠されるという状態が起きることは、開いた扉や
侵入者などによってマーカが隠されたことを意味する。これを「イベント発生」
と呼ぶことにする。イベントは次に上げる4種類の記録を残すように設計した。
この内の2つはキャプチャした映像内に表示し(図 4.2 左)、残り2つは
Processing の print 文によりログに出力する(図 4.2 右)。
1. イベント発生回数(キャプチャした映像の左上部の上段)
2. イベント継続時間(キャプチャした映像の左上部の下段)
3. イベント発生時刻(Processing のログ)
4. イベント継続時間 (Processing のログ)
イベント発生回数の記録は、AR マーカが認識されなくなった状態から再度 AR
マーカが認識できるようになった間行われ、発生回数は 2 桁で表示される。し
たがって 99 回まではカウントできると思わるが、99 回を超える回数のイベント
発生実験は行っていないため、イベント発生が 3 桁を超える場合にどのような
ことが生じるかは不確かである。
イベント継続時間は AR マーカが認識されない状態が続いている場合、秒単位
で表示する。イベント発生回数と同様、2 桁で表示される。
イベント発生時刻の記録は 24 時間表記で行われる。またログに記録されるイ
ベント継続時間は分:秒の形式で 99:59 まで表記される。これらもこの値を超
過するような実験をしてないので、これより大きな値の記録を必要とされる場
合にどのようなことが起こるかは不確かである。なお、これらイベント発生時
刻とイベント継続時間は、AR マーカが再度認識されたときにログに記録される。
15
図 4.2 左上に隠された回数、その下に隠れている時間の表記(左)
Processing に出力される、隠されていたときの時刻と時間(右)
4.2.3 画像の保存
イベント発生、すなわち AR マーカが Web カメラから認識できなくなったとき
に、そのときのスクリーンショットも保存される(図 4.3)。このスクリーンショ
ットの画像は、AR マーカが認識されない間、1秒毎に1枚ずつ保存される。ま
た、再度 AR マーカが認識されるようになった時にも1枚だけ画像を保存するよ
うにしている。こうする理由は、イベント継続時間がごく短時間であったとき
にも適切に対処できるようにするためである
この方式は、AR マーカが認識されなくなったときに防犯カメラとして機能し、
AR マーカが認識されていない場合には画像の保存ができない。このことが防犯
カメラとして欠点となる可能性がある。しかし、画像を保存するための容量が
比較的少量で済むということから、この方式の利点としても考えられよう。
図 4.3 AR マーカが隠れたとき(左)と再度 AR マーカを認識したとき(右)
16
4.3 防犯カメラシステムの動作実験
防犯カメラシステムの動作確認のため、Windows フォト ビューアーを用いて
表示した PC 上のマーカを Web カメラにより約 1 時間認識させ続けた(図 4.4 左)。
この間システムの動作自体には問題は無かったものの、AR マーカが認識されな
くなった(イベント発生)時刻がその前のイベント発生時刻と同じ場合、シス
テムが作動しないという問題があることが分かった(図 4.4 右)。この問題が発
生する理由について考察してみる。
本システムは、1 秒間に約 3 回の割合で、カメラの映像をキャプチャし AR マ
ーカの認識をするという処理を行っている。1 秒以内に何回もマーカをカメラか
ら隠すということを行うと、その都度、マーカが認識されなくなった時(イベン
ト発生)の時刻、イベント発生の継続時間が記録される。またマーカが隠れてい
たときに値を初期化していたため、マーカを認識しているときでも計測した時
間の記録が残る、つまりはログに記録されることが起こった。このことを問題
と考えた我々は、その対処方法としてイベント発生時間を記録し、新しいイベ
ントの発生時刻が前回の時刻と違っていたときにだけ記録を残すようにした。
ところが今度はこれが、動作実験で新たな問題を引き起こす原因であったので
ある。ごく短い間隔でイベントが発生すると、新しく発生したイベントは無視
されてしまうのである。そもそも根本的な原因は記録を秒単位としたためと考
えられる。以上のことから、本システムを防犯カメラとして実際に使用するに
は、より細かい単位で時刻の記録を残す必要があると考えられる。
図 4.4 動作環境として、PC 上のマーカを認識している(左)
同じ時間を記録できない結果、ログに残っていない(右)
17
第五章
まとめと展望
本章では研究のまとめと展望について述べる。
5.1 研究のまとめ
今まで述べてきたように、我々は AR を用いてリモコンロボットを操作するこ
とができた。それにより AR についての知識を深めることができた。また、防犯
カメラという身近な道具に対して AR を用いて行ったシステム製作と実験により、
AR の拡張可能性を見出すことができた。以上のことから、我々は AR をよりよく
理解できたと言えよう。
5.2 実際の家庭での使用例
防犯カメラとして AR を用いたシステムを、現代の一般家庭で使用することに
ついて考察する。
大まかに 2 つの使い道があると考える:
1. 子供がいる家庭に用いる
2. ペットを飼っている家庭に用いる
子供がいる家庭に用いる場合、高層マンションのベランダに設置して子供の
ベランダからの落下を防ぐことができるのではないだろうか。そもそも小さな
子供がベランダから落ちないようにするには、まず窓に近づけなければよい。
この防犯カメラにより、保護者が子供から目を離しても、危険な位置に子供が
いたら警報音をならすなどすれば、親はそれ反応して直ぐに対処できるであろ
う。また、子供が一人で留守番しているときにもこのシステムは役に立つ。例
えば親が留守中に急な来客が訪れて子供が応対しようとする場合、玄関に来た
子供に注意を喚起する親の音声を鳴らすなどして、考えられる危険を未然に防
ぐことができよう。
ペットを飼っている家庭では、家主が外出しているときにペットが、部屋を
荒らす、台所などにおいてある食料を食い散らかすなど、悪さをすることがあ
るということをよく聞く。このような悪戯を防ぐために AR による防犯システム
が使える。このシステムを台所に設置して嫌いな音を鳴らすことにより、ペッ
トが台所に入ることを止めさせることができるであろう。
また、ペットを多頭飼いしている場合、どのペットが悪戯をしたかが分から
ないときがあるとも聞く。この問題も AR による防犯カメラを用いることで解決
できる。本システムにはスクリーンショットを保存する機能が付いているので、
どのペットが何時、何回台所に入ろうとしたかが分かるからである。
18
5.3 展望
本研究の防犯カメラの拡張と AR 全体の拡張についての展望を述べる。
5.3.1 防犯カメラの展望
防犯カメラの拡張方法として4つの手法を考えている。
1. マーカレスを用いた手法。
2. 複数台のカメラを用いた手法
3. マーカの数を増やし、個々に機能を追加する
4. カメラの解像度を上げ、マーカの認識範囲やスクリーンショットの効果
の向上
まず、マーカレスについて説明する。マーカレスとは白黒マーカに限らず多
彩な色が使える。そのため、チラシやポスターなどの一部として使える(図 5.1)。
白黒マーカならば、壁などに貼り付けていると違和感はあるが、ポスターやチ
ラシならば壁に貼り付けていても違和感無く扱えるだろう。
次に複数台のカメラを用いた手法だが、現時点では一つのカメラしか用いて
いない。しかし、AR 機能を使った複数台のカメラを同時に用いることで、防犯
カメラとして様々な角度や場所を同時に確認することができるようになる。そ
の結果、防犯カメラシステムの性能を向上できると考えている。
マーカの数を増やし、個々に機能を追加するというのも考えている。例えば
マーカを縦に並べ、マーカの隠れた位置に応じて身長の情報を表示する。欠点
として、隠れたマーカごとに個別に数字を表示するようにしてしまうと、記録
が複数の数字で溢れ、正確な値が分からなくなってしまう。これを回避する方
法も考えている。配置したマーカの上から順に優先順位を決めることで、過剰
に表示することは回避できるだろう。またカメラの欠点である、奥行きや高さ
の問題を解決できるので試す価値はある。また上記のカメラを複数台用いる手
法で、どのマーカが隠れたかを Processing 側に送る必要があるが、この手法を
用いることで解決することができると考えている。
最後にカメラの解像度を上げる手法について説明する。現在カメラの解像度
が低く狭い範囲しか表示できない。しかし、解像度を上げることで人の全身を
表示できるようになり実際の防犯カメラのように使える。
マーカの認識範囲については、OpenCV を用いた画像処理の研究が役に立つと
考えている。Web カメラがマーカを捉える性能を向上させる上で必要になるだろ
う。
スクリーンショットの効果の向上はプログラムの問題である。先に述べたが、
スクリーンショットは障害物がマーカを遮ったときに保存するものである。そ
の効果を向上のために例えば、1時間おきに何枚か画像を保存するなど、既存
19
のシステム部分以外を拡張していく必要があると考えている。
図 5.1 Google Play. (2013)(左)とプレコミュ. (2013)(右)
両方ともマーカレス AR として使用可能
5.3.2 AR 全体の展望
本研究を通して得られた知見にもとづき、AR 全体の展望について述べる。
本研究では Web カメラが AR マーカを認識できなくなったときに動作させる
「負論理」により、無線通信を用いたリモコンロボットの制御と、防犯カメラ
を実現した。つまり、マーカを隠すという行為は、一連の動作をさせるための
スイッチとみなせる。
具体的には次のような AR の使い方の可能性を考えている:
1. キーボードとしての利用
2. その他の利用法
「キーボードとしての利用」について説明する。一般的なキーボードでは、
出力の違う複数のボタンを押すことでいろいろな文字を入力している。本研究
で用いた AR マーカもキーボード同様、AR ごとに機能を追加することが可能であ
る。また、Shift キーのように、押し続けていることで入力する文字を変える、
ということもできる。この実現方法としては、例えば Shift キーの代わりとな
20
るマーカを用意し、その AR マーカを隠しているときに別の文字を出力するよう
にする、ということが考えられる。
キーボード代わりに AR を利用する利点としては次のものがある: AR マーカは
それぞれに機能を持たせることができる、マーカ配置を自由に変えられる、マ
ーカは紙に印刷して用いるため、市販のキーボードを買うよりもコストを削減
することができる、などなど。
しかし、欠点もいくつか存在する。まず、カメラの配置位置が問題となろう。
AR マーカを隠した時に文字を出力するのはよいが、入力したい AR マーカ以外を
も手のひらなどで隠してしまう可能性がある。また、隠している間の文字の入
力数も考える必要がある。キーボードは使用する人がボタンを押していること
を触覚で認識できるため、必要なければ同じボタンを押し続けないよう離すこ
とができる。これに対して、AR マーカの場合は、押し続けているという感覚が
起こらない。そのため、システム側ではマーカが隠されていると認識しても、
隠しているはずの人間がそのことを理解できないため、不要な文字を出力して
しまう可能性がある。
AR マーカの「その他の利用法」としては、ピアノなどを作れるのではないか
と考えている。AR マーカを隠すと音が鳴るようにし、個々の AR マーカに別々の
音を再生することができれば、作成は容易である。ピアノの場合横にキーを並
べるので、間隔さえ整えれば他の AR マーカを誤って隠してしまうことはないだ
ろう。ゆえにキーボードの場合と異なり、問題は起こらないとかんがえる。
また、別な利用法としては、最近のスマートフォンの代用となるだろう。最近
のスマートフォンでは Bluetooth を用いて家電製品と通信して家電製品を操作
すること可能になっている。これをまねて、AR を用いマーカに触れるだけで家
電製品を制御することもできるだろう。
21
参考文献
加藤晴久.(2012).「拡張現実感技術の最前線(第10回)てのひら AR」. 映
像情報メディア学会誌. 66(10). pp.866-871
蟹井翔貴.(2014).「Arduino による Boe-Bot 制御」. 中京大学情報理工学部
情報知能学科 2013 年度卒業論文.
橋本直.(2008)『3D キャラクターが現実世界に誕生! ARToolKit 拡張現実感プ
ログラミング入門』.アスキー・メディアワークス
橋本直.(2012). 『AR プログラミング-Processing でつくる拡張現実感のレシ
ピ-』.オーム社
暦本純一(2012).「拡張現実感技術の最前線(最終回)拡張現実感技術の将来
展望」.映像情報メディア学会誌. 66(12). pp.1048-1053
参考資料
catch.jp-wiki (2013). Processing でサウンド
http://www.catch.jp/wiki/index.php?Processing%A4%C7%A5%B5%A5%A6%A5%
F3%A5%C9 (2013 年 10 月参照)
Google Play. (2013). 初音ミク in ナレッジキャピタル.
https://play.google.com/store/apps/details?id=jp.kc_i.ar_miku&hl=ja
(2013 年 8 月参照)
gutugutu30. (2013). Processing NyAR4Psg でマルチマーカー .
https://sites.google.com/site/gutugutu30/ar/processingnyar4psgdemar
uchimaka (2013 年 10 月参照)
koeri. (2012). [Processing] 1 フレームごとに画像キャプチャ.
https://gist.github.com/koeri/2564228 (2014 年 10 月参照)
Owed, Amnon. (2013). Augmented Reality with #Processing – Tutorial.
http://www.creativeapplications.net/processing/augmented-reality-wi
th-processing-tutorial-processing/ (2013 年 10 月参照)
Parallax. (2012). Moving Backward, Rotating, and Pivoting.
http://learn.parallax.com/node/219 (2013 年 10 月参照)
Yahoo!知恵袋 (2013).Processing でストップウォッチを作っている…
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1289911587
(2013 年 10 月参照)
22
yoppa.org (2010). Processing で時計を作る.
http://yoppa.org/proga10/1419.html (2013 年 10 月参照)
yoppa.org (2013). 多摩美 – バイオメディアアート・ワークショップ 2013 年
度: Processing と Arduino を接続する.
http://yoppa.org/tau_bmaw13/4772.html (2014 年 8 月参照)
愛知県地域振興部情報企画課 (2014) ワクワクあいち: AR
http://www.pref.aichi.jp/joho/wakuwaku/ar/ (2014 年 12 月参照)
飯谷健太. (2012). ARToolKit を Processing で使う(2) .
http://monitorgazer.blogspot.jp/2012/08/artoolkitprocessing_2.html
(2013 年 10 月参照)
う つ く し ま 観 光 プ ロ モ ー シ ョ ン 推 進 機 構 . (2013). み ん な の 投 稿 フ ォ ト >
No.10287 鶴ヶ城プロジェクションマッピング (会津若松市).
http://www.tif.ne.jp/jp/photo/photo_disp.php?id=10287 (2014 年 12 月
参照)
工学ナビ. (2012). AR プログラミング Processing でつくる拡張現実感のレシ
ピ. http://kougaku-navi.net/AR-ProgrammingBook/ (2013 年 10 月参照)
吉村マサテル. (2011). Processing 学習ノート: b-07 時間を使う
http://www.d-improvement.jp/learning/processing/2011-b/07.html
(2013 年 10 月参照)
プレコミュ. (2013). MikuMikuHockey.
http://www.jp.playstation.com/software/title/jp9002pcsc00052_00miku
mikuhockey00.html (2013 年 12 月参照)
ポケットサウンド. (2013). ‘警告’カテゴリーのアーカイブ
http://pocket-se.info/archives/tag/%E8%AD%A6%E5%91%8A/ (2013 年 10 月
参照)
23
謝辞
本研究を進めるにあたり、指導教員の白井英俊教授に感謝します。また、研究
の兆しとなった研究室の先輩方にも感謝します。誠にありがとうございました。
24
付録 1.
Boe-Bot のプログラム
[Processing のプログラム]
int numMarkers = 5;
int changeMode = 0;
//マーカの数
//認識プログラム用の変数
//時間用の変数
int tm0=0;
int ms;
int s;
int m;
char F,B,R,L,N;
//Arduino に送る文字
//ライブラリの読み込み
import jp.nyatla.nyar4psg.*;
import processing.video.*;
import processing.serial.*;
Capture cam;
MultiMarker ar;
// キャプチャ
// AR マーカに関する処理をするオブジェクト
//マーカの読み込み先のファイルパス指定
String patternPath =
"C:/Users/rashin/Documents/Processing/Boebot5/data";
String[] patterns = loadPatternFilenames(patternPath);
Serial myPort;
//通信用の構造体
PMatrix3D trans[]=new PMatrix3D[2];
//マーカを連番で読み込むための行列
//本文
void setup() {
25
size(640,480,P3D); // 画面の設定
colorMode(RGB, 100);//色の設定
println(MultiMarker.VERSION);
//AR の情報の表示
cam = new Capture(this, width, height); // キャプチャの準備
// AR をやるための準備
ar = new MultiMarker(this, width, height, "camera_para.dat",
NyAR4PsgConfig.CONFIG_PSG); //AR の基本文
//マーカの連番読み込み
for (int i=0; i<numMarkers; i++) {
ar.addARMarker(patternPath + "/" + patterns[i], 80);
}
trans[0]=new PMatrix3D(1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1);//単位行列~
//フォント設定
PFont font;
font = loadFont("Arial-Black-30.vlw");
textFont(font);
//通信のポート設定
println( Serial.list() );
myPort = new Serial( this, Serial.list()[0], 115200 );
}
//ループ関数
void draw() {
if (cam.available() !=true) {
//カメラの有無確認
return;
}
cam.read();
// カメラ画像の読み込み
ar.detect(cam);
//マーカ認識
background(0);
// 画面の初期化
ar.drawBackground(cam);//frustum を考慮した背景描画
if(changeMode == 0){
26
//認識プログラム
if (ar.isExistMarker(0))
//マーカを見つけたとき
{
ar.beginTransform(0);
//マーカを座標の中心にする
fill(100, 0, 0); //色を付ける
translate(0, 0, 20);
//座標の移動(x,y,z)
box(40); //立方体の表示
ar.endTransform();
//座標変更処理の終了
}
if (ar.isExistMarker(1))
{
ar.beginTransform(1);
fill(0, 100, 0);
translate(0, 0, 20);
box(40);
ar.endTransform();
}
if (ar.isExistMarker(2))
{
ar.beginTransform(2);
fill(0, 0, 100);
translate(0, 0, 20);
box(40);
ar.endTransform();
}
if (ar.isExistMarker(3))
{
ar.beginTransform(3);
fill(255, 255, 0);
translate(0, 0, 20);
box(40);
ar.endTransform();
}
if(ar.isExistMarker(0)&&ar.isExistMarker(1)&&ar.isExistMarker(2)&&ar.i
sExistMarker(3)&&ar.isExistMarker(4))//全てのマーカを認識している場合
{
27
ar.beginTransform(4);
fill(0, 100, 100);
translate(0, 0, 20);
sphere(40);//球体の関数
ar.endTransform();
//時間のカウント
int hg = hour();
int mg = minute();
int sg = second();
int tm=millis()-tm0;
ms=tm%1000;
if (ms>=1){
s=(tm-ms)/1000;
}
text(nf(s,2),0,100);
if(s==6){
changeMode = 1;//リモコンロボットの制御プログラムに移行
}else if(s<=7){
changeMode = 0;//カメラの起動が間に合わないときに使用
}
}else{
tm0=millis();
//時間の初期化
}
//リモコンロボットの制御用プログラム
}else if(changeMode == 1){
if (ar.isExistMarker(0))
{
ar.beginTransform(0);
fill(0, 100, 0);
translate(-30, 0, 0);
rotate(PI/2);
//回転
28
triangle(-20, -20, 0, 0, 20,-20);
//三角形
scale(2.0);
ar.endTransform();
}else{
myPort.write('F');
//データ(文字)を送る
}
if (ar.isExistMarker(1))
{
ar.beginTransform(1);
fill(0, 100, 0);
translate(40, 0, 0);
rotate(PI/2);
triangle(20, 20, 0, 0, -20,20);
scale(2.0);
ar.endTransform();
}else{
myPort.write('B');
}
if (ar.isExistMarker(2))
{
ar.beginTransform(2);
fill(0, 100, 0);
translate(3, 30, 0);
triangle(-20, -20, 0, 0, 20,-20);
scale(2.0);
ar.endTransform();
}else{
myPort.write('R');
}
if (ar.isExistMarker(3))
{
ar.beginTransform(3);
fill(0, 100, 0);
translate(3, -30, 0);
rotate(PI);
triangle(-20, -20, 0, 0, 20,-20);
29
scale(2.0);
ar.endTransform();
}else{
myPort.write('L');
}
if (ar.isExistMarker(4))
{
ar.beginTransform(4);
fill(0, 100, 100);
translate(0, 0, 20);
box(40);
ar.endTransform();
}else{
myPort.write('N');
}
}}
//マーカの読み込み用の関数
String[] loadPatternFilenames(String path) {
File folder = new File(path);
FilenameFilter pattFilter = new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".poi");
}
};
return folder.list(pattFilter);
}
30
[リモコンロボットのプログラム]
#include <Servo.h>
//Servo モータ用のライブラリ
Servo servoRight;
Servo servoLeft;
void setup(){
Serial.begin(9600);
servoRight.attach(10);
servoLeft.attach(11);
//通信速度
//ピン番号の指定
}
void loop(){
char c;
if(Serial.available()>0){
c=Serial.read(); //文字の読み込み
//受け取った文字によって動作する
if(c == 'F'){
front();
//前進
}else if(c == 'B'){
back();
//後退
}else if(c == 'R'){
right();
//左旋回
}else if(c == 'L'){
left();
//右旋回
}else if(c == 'N'){
none();
//停止
}else{}
}}
//移動制御の関数
void front(){
servoRight.writeMicroseconds(1300); //モータの回転数
servoLeft.writeMicroseconds(1700);
}
31
void back(){
servoRight.writeMicroseconds(1700);
servoLeft.writeMicroseconds(1300);
}
void right(){
servoRight.writeMicroseconds(1300);
servoLeft.writeMicroseconds(1500);
}
void left(){
servoRight.writeMicroseconds(1500);
servoLeft.writeMicroseconds(1700);
}
void none(){
servoRight.writeMicroseconds(1500);
servoLeft.writeMicroseconds(1500);
}
32
付録 2. 防犯カメラのプログラム
int numMarkers = 3;
int changeMode = 0;
//時間を計るための変数
int tm0=0; //基準時間を保持
int ms;
int s;
int m;
int ss;
int mill;
//画像を保存するための変数
int sus = -5;
int sut = 0;
int suk = 0;
//画像のファイル名
int index_num = 0;
int num = 0;
import jp.nyatla.nyar4psg.*;
import processing.video.*;
import krister.Ess.*;
AudioChannel myChannel;
//音のライブラリ
Capture cam;
// キャプチャ
MultiMarker ar; // AR マーカに関する処理をするオブジェクト
String patternPath =
"C:/Users/rashin/Documents/Processing/bouhan6/data";
String[] patterns = loadPatternFilenames(patternPath);
33
PMatrix3D trans[]=new PMatrix3D[2];
void setup() {
size(640,480,P3D); // 画面の設定
colorMode(RGB, 100);
println(MultiMarker.VERSION);
cam = new Capture(this, width, height); // キャプチャの準備
// AR をやるための準備
ar = new MultiMarker(this, width, height, "camera_para.dat",
NyAR4PsgConfig.CONFIG_PSG);
for (int i=0; i<numMarkers; i++) {
ar.addARMarker(patternPath + "/" + patterns[i], 80);
}
trans[0]=new PMatrix3D(1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1);//単位行列~
PFont font;
font = loadFont("Arial-Black-30.vlw");
textFont(font);
Ess.start(this); //Ess をスタートさせる
//bush.wav を読み込んで、myChannel オブジェクトを作成
myChannel=new AudioChannel("alert.wav");
//読み込む音
}
void draw() {
if (cam.available() !=true) {
return;
}
cam.read();
// カメラ画像の読み込み
ar.detect(cam);
background(0);
// 画面の初期化
ar.drawBackground(cam);//frustum を考慮した背景描画
34
int hg = hour();
int mg = minute();
int sg = second();
if(changeMode == 0){
if (ar.isExistMarker(0))
{
ar.beginTransform(0);
fill(100, 0, 0);
translate(0, 0, 20);
box(40);
ar.endTransform();
}
if (ar.isExistMarker(1))
{
ar.beginTransform(1);
fill(0, 100, 0);
translate(0, 0, 20);
box(40);
ar.endTransform();
}
if (ar.isExistMarker(0)&&ar.isExistMarker(1)&&ar.isExistMarker(2))
{
ar.beginTransform(2);
fill(0, 100, 100);
translate(0, 0, 20);
sphere(40);
ar.endTransform();
int tm=millis()-tm0;
ms=tm%1000;
if (ms>=1){
s=(tm-ms)/1000;
}
35
text(nf(s,2),0,100);
if(s==10){
changeMode = 1;
}
}else{
tm0=millis();
}
}else if(changeMode == 1){
if (ar.isExistMarker(0)){
myChannel.pause(); //音の一時停止
ar.beginTransform(0);
fill(255, 0, 0);
translate(0, 0, 20);
box(40);
ar.endTransform();
}
if (ar.isExistMarker(1)){
myChannel.pause();
ar.beginTransform(1);
fill(255, 0, 0);
translate(0, 0, 20);
box(40);
ar.endTransform();
} if (ar.isExistMarker(0)&&ar.isExistMarker(1) ||
ar.isExistMarker(1)&&ar.isExistMarker(0)) {
myChannel.pause();
tm0=millis();
num = 0;
if(m+s == sut){ //前回の時間と比べる
}else{
println("時刻は "+hg+":"+mg+":"+sg); //時刻のログを出力する
println("時間は "+nf(m,2)+":"+nf(s,2));//時間のログを出力する
sut = m+s;
//隠れていた時間を記憶する
suk = suk + 1;
36
//画像の保存
String n="images/"+index_num+".jpg";
save(n);
index_num++;
}
}else{
myChannel.play(Ess.FOREVER);
//音を連続再生する
if(mg == sus){
}else{
sus = mg;
String n="images/"+index_num+".jpg";
save(n);
index_num++;
}
int tm=millis()-tm0;
ms=tm%1000;
if (ms>=1){
s=(tm-ms)/1000;
if(s%1 == 0 ){
if(num < s){
String n="images/"+index_num+".jpg";
save(n);
index_num++;
num = s + 1;
}
}}}
text(nf(s,2),0,100);//キャプチャした映像に回数を表示する
text(nf(suk,2),0,70);//キャプチャした映像に時間を表示する
}
37
if(s > 60){
myChannel.pause();
changeMode = 0;
sut = 0;
}
}
//マーカの読み込み用関数
String[] loadPatternFilenames(String path) {
File folder = new File(path);
FilenameFilter pattFilter = new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".poi");
}
};
return folder.list(pattFilter);
}
//音の関数
public void stop() {
Ess.stop();
super.stop();
}
38