題名:Java Diary-107章

五 郎の 入り口に戻る
日付:2012/8/5
目 次に戻る


Gozen - Part2

というわけで、少しずつだが文法定義と、それの処理をこれこれと書いて行く。動きがおかしくなれば、cold cold beerに逆戻りである。このcold beerの文法処理が消えたのは、大分たってからだった。

というわけで、入力したテキストファイルを解析することはできつつあるのだが、これはまだ話の半分である。解析されしかるべくばらばらになった文字列を、解釈して画面に表示しなければならない。えーっとえーっと画面表示ってどうやるんだっけ。それまでiOS上でのプログラムを多く書いていたのだが、本家たるべきMac OS Xでのプログラムは(完全に忘れていたのだが)ちょっと事情が違う。画面に表示する物の大本はiOSではUIView, Mac OS XではNSViewである。ちょっと名前が違うだけだが、内容はずいぶん違う。いや、もともと別物と割り切ればいいのだが、なまじ似ているぶんだけ勉強をさぼろうとするのが困る。

iOSでは、UIViewというものを使って簡単にアニメーションを表示できる。その便利さに慣れていた私はNSViewを調べて愕然とした。どうやら別のNSAnimationというものがあるのだが、自由度は相当低いらしい。それについて書かれた誰かのブログを読みながらこれでは表現の幅が狭まってしまうことに一抹の危惧を覚える。しかしとにかく動かす事のほうが重要だ。

というわけでしょこしょこプログラムをくみ続ける。やっていることは理屈の上では単純で、テキストで書かれたプログラムを読み込み、まず解釈できる形にする。次に表示画面に対して順番にその命令を送る。表示画面は送られた命令を解釈して画面をあれこれ変化させる、というものだ。

さて、ここで問題です。さらっと「命令を送る」と書いたけどここで命令はどうやって書けばいいでしょう。というわけであれこれ調べると、NSInvocationなるものがあることを知る。よくはわからんが、命令を伝えるのに使うのだそうな。調べながらしょこしょこ作る。

画面上に最初の「スライド」が表示されたのはいつだっただろうか。今回の売りは

「スライドを廃止する事」

なのだが、とりあえず今のプレゼンソフトと同じことができなくては困る。手探りで作りつづけているのだが、自分でも意外なほどそれっぽい画面が表示できた。ここで少し安心する。

しかし「今までのプレゼンソフトと同じ画面が表示できました!」だけでは発表にならん。もう一つの売りは

「プレゼンの主役はプレゼンターそのものなのだから、プレゼンターの姿を取り入れられるようにするべきだ」

というものだ。というわけでカメラから画像を取り込み、それを「スライド」に映せるようにする。こうやって文字にすると簡単だが、話はそれほど単純ではない。どこがややこしいかと言えば、「背景除去」にある。つまり人物だけを切り取り、それを画面に表示しようとしたのだ。

調べてみればいろいろな方法があるようだ。(本当の事を言えばそもそも「背景除去」という言葉を探し当てるまでにかなり苦労したが)方法は大きく2種類で、まず人物が居ない背景の画像をとっておく。次に人物が入ってきた画像から背景を引き算すれば、人だけが残るというもの。もう一つは最近はやっているKinectなるものを使い、映っている物体までの距離を測る。そしてプレゼンターより後ろにあるものは消去する、という方法だ。

原理はわかったが、問題はそれをどのようにしたら私が今作ろうとしているプログラムに取り入れられるかということにある。しかしインターネットは偉大だ。Mac OS上でまさしく似たような事をやろうとしている人がおり、プログラムを公開していてくれる。その人がやろうとしていたのは、逆に「映っている筈の人物を見えなくする」方法なのだが、これを簡単にすればやりたいことができるに違いない。

というわけなのだが、例によって話は簡単に進まない。それをやるためには、まずopen CVなる画像処理ライブラリを組み込まなくてはならんのだが、これがなぜかうまくいかない。もちろんインターネットの神様にお伺いを立てればいくつもの回答が見つかるのだが、Mac OSのバージョン、Open CVのバージョンによって微妙に手順が異なる。あれこれやった末なんとかそのゲームに打ち勝つと、今度は元のプログラムを読んで理解するという仕事が待っている。適当にあれこれいじるが当然のごとく動かない。いつもながら新しい事をやる時は「急がば回れ」という言葉を実感する。つまりちゃんと調べて勉強しないと結局は動かないのだ。と実感した3分後にはそれを忘れ

「ここいじるだけで動くんじゃないかな」

と思うのもいつものことだが。

仕事の合間にちょこちょこ作っているものだから、進みは遅い。しかしある日とうとう画面が除去された映像がMac上に表示されることになる。ちょっと雲の加減がかわり、背景が明るくなると途端に動かなくなるが、とりあえず動いている。やれうれしや、というわけでその段階でカメラ画像合成をほったらかし次の問題に移る。

次に何をしようとしたかと言えば、「ハードウェアスイッチでのプレゼン操作」である。何を当たり前のことをと言われるかもしれないし、実際文字にするとそう思うのだが、これにはちゃんと理由がある。

プレゼンについてあれこれ考えているとき「あれ?そういえば昔の授業は黒板に書いていたぞ」と思い出す。プログラミングシンポジウムで同室になった人に聞いたのだが、数学科の論文発表は未だに黒板に書いて行われるの出そうな。考えてみればフェルマーの定理を発表した時の写真にも黒板が映っていたように記憶する。これはどういうことだろう?

そう考えていると、今度はNHKの番組でどこかの先生が説明しているのを見る。どうやら手元のタブレットに直接絵を描いているようだ。イメージとしては黒板に書くものに近いのだろう。

こういう表示方法がとれないものだろうか。もちろん手書きは論外である。私の手書き文字はたいていの場合読めないし、漢字を知らないからひらがなだらけなのだ。(大学のころある家に礼状を書いた。それを読んだ娘さんが一言「漢字が少ない」と言ったとか)

であれば、例えばホワイトボード上に物理的なスイッチを配置しておき、それを書くようなふりして押しながらプレゼンを進めることはできないか。本来はここで「書くような振りをして押しながら」のところを考えるべきなのだが、私はここで「UI開発失敗パターン」の「デバイス原理主義」に陥ってしまう。つまりとにかく押しボタンで入力することに凝り始めたのだ。

Google先生にお伺いを立てるといくつかの方法があるようだ。テンキーをばらして改造する方法、それにPCゲーム用のゲームパッドを改造する方法がある。そして例によって私は馬鹿なことをやった。いくつかの記事にのっていたPCゲームパッドをいきなり購入したのだ。きっとUSBだからつなげばキーとして認識されるだろう、とか思いながら。

しかし例によって現実はそれほど簡単ではない。USBを差し込んでみたが、キーをがちゃがちゃやっても全く認識されない。これはどうしたことか、と思い再度Google先生にお伺いを立てる。するとどうもゲーム用の入力デバイスというのは、それ専用の認識方法があるらしい。しかも素早い応答を要求されるものだから、どうも話は簡単ではない。

しばらくコードを眺め首をひねっていたが、とうとう諦める。ここでの諦めは自分のコードでなんとかすることを諦めるという意味だ。つまりPC用のゲームパッドをMacで認識させるためのソフトウェアを金をだして購入することにしたのである。調べてみれば2種類ほど存在しているようだ。微妙に値段が違い「安物買いの銭失い」という言葉が頭をよぎるが貧乏な私は安い方にする。どきどきしながらコントローラをつないであれこれ試行錯誤の末、ようやく

「ゲームパッドでスイッチを押すと、エディタに1が入力される」

状態になった。

スイッチはコントローラから取り外し、長いビニール線で接続する。両面テープで磁石をはっつけたから、鉄板があるところならスイッチが設置できるだろう。これでどうにか道具立てはそろった事になる。

というわけで、やることは論文書き及びデモビデオ作成になる。論文は「現状のプレゼンテーションソフトの問題点」をかくところは景気よく進のだが

「それを私はこう解決しました」

のところで腰砕けになる。いや、自分では「スライドを廃止し、プログラムで記述する」というのは良い事だと思っているのだけど、文字にするとそれが今一のように思えてくるのだ。そして今更のように

「そもそもプレゼンテーションとは何のためにするのか」

を考えたりする。いろいろな本や論文にあたる。正面から取り上げたものはあまりないことに気がつく。しかしぐでぐで言っている場合ではない。論文を書きながらも「こういう機能が必要ではないか」という部分は機能を追加していくことになる。

さて、WISSに投稿する以上、論文と同じ程度に重要なのがデモビデオである。今回の場合デモビデオは作っているシステム自身で作り上げるしかない。話はその通りなのだが、ここで例によって困った問題にいくつかぶつかる。まずテクニカルなところから書こう。今回のシステムの売りとして、背景除去した上で、プレゼンターの姿をプレゼンに取り入れらることは前述した。問題はその背景除去があまりにも不安定な点だ。作っている時は

「わーい、これで背景除去できたもんね」

で満足していた。しかし実際にプレゼンテーションで使おうと思えばある程度安定して動いてもらわなくてはこまる。というか自分自身そう考えて、入力スイッチを有線式にしていたはずなのに、この背景除去がどう動くかは

「神様とその時の照明条件の御心のまま」

という状態だ。機材の都合から会社で撮影するしかないのだが、(この点については後述する)どの照明条件で行えば背景除去が行えるのか。外が曇りのとき、晴れのとき、蛍光灯をつけたりけしたり、ビデオの撮影はそのたびにやり直しになる。

それよりももっと深刻な問題は、デモビデオのシナリオそのものにあった。今から考えれば愚かなことだが、最初

「プログラムでプレゼンを記述しても、普通のスライドを使ったプレゼンテーションソフトと同じことができるんだもんね」

ということを一生懸命書いていた。実際作り上げたところで一回流してみる。そして愕然とする。「同じことができた」ところでなんだというのだ。新しい物を作るからには、「こういった利点があります」とアピールせねばならない。それはなんなのだ。

落ち込んだり、知らんぷりをしてみたりすること数日。そんなことをしても何の解決にもならない。あれこれ修正し、アピールポイント(と思しき物)を作り上げ、デモビデオ用の「プログラム」を作り上げる。あれこれやった末に

「よし、これで録画しよう」

と思い立つ。ここで新たな問題が発覚する。プレゼン画面の録画をどうするか。今まではスクリーンに映っているものをそのまま動画にしてくれるソフトを使っていた。デモを動かしているPC上で、録画まで行うので、多少動作がのろくなるが、ほとんどの場合これで用が足りる。

ところがぎっちょん。今回のプレゼンソフトは特に背景除去で無茶苦茶CPUを酷使している。結果として、同じPC上で録画まで行う事はとてもできないことが判明する。ようやく録画できた動画を再生すると、コマ落ちがひどく見られたものではない。こんなビデオを添付された論文なら、執筆者の私であっても問答無用で

「不採録」

の判断を示すであろう。

がびーんとなるが、すぐに善後策を考えなくてはならない。あれこれ頭を捻ったあげく、

「プレゼンをディスプレイに映し出し、そのディスプレイをビデオカメラで録画しよう」

という方法にたどり着く。画質はPCで直接動画を作成するのに比べ悪くなるがこの際贅沢は言っていられない。というわけでデモビデオ撮影機材はだんだん大掛かりになっていく。早朝誰もいないオフィスで、ディスプレイを運び、照明条件が変わらない場所に陣取る。当然のことながら近くにコンセントがないので延長コードも必要だ。誰かが通れば間違いなく足をひっかけると思われる場所にコードを這わせるが、他に選択肢は無い。

さて、ということで動画の撮影を始める。ところがその瞬間、雲に隠れていた太陽が顔を出す。背景除去はおじゃんになり再度撮影をやりなおし。こんなことを何度も繰り返す。そもそもこんなに不安定な背景除去は最初から諦めるべきなのだが、撮影で頭が一杯の五郎ちゃんにはそうした声は届かない。

何度か(何日か)のトライの後、ようやくそれらしい動画ができあがった。再生してみる。そして再度愕然とする。画面の上での口の動きと音声がずれているのだ。これはある程度予見していたことではあるが、背景除去の処理量が多くなると、動画の処理が追いつかず、音声とずれてしまう。予想外だったのはその程度がはなはだしかったことだ。

今こうして落ち着いて文章にしてみれば

「とっとと背景除去を諦めろ」

と思うのだが、やっぱりそうした判断には至らない。ええい、もう時間がない。これで出してしまえ、と投稿してしまう。締め切りまであと三日の8/28日。論文のIDは004である。さて、この番号はどこまで大きくなるだろうか。そして結果は。

前の章 | 次の章


注釈