HD映像のリアルタイム処理 on iPhone
特に今回はCPUを音声処理で使用するので、画像処理は可能な限りGPUに任せたい。となると画像(映像のフレーム)をTextureとして次から次に、例えば20fps(毎秒20枚)といったスピードで処理しなくてはいけない。当然これはOpenGLの鉄則、Textureは起動時にロード、に違反し、ロードに時間がかかって使い物にならない。
OpenGL ES 2.0では、こういった場合にRender to Textureという、Textureに直接書き込む手法を2つ提唱している。詳細については以下を参照。
Render to Texture with OpenGL ES
iPhone 3GS, iPhone 4はOpenGL ES 2.0をサポートしているが、こういった手法は一切触れていない。しかし搭載されているGPU(POWERVR SGX)のマニュアルを見てみると、以下のようにある。
6.4. Render to Texture
OpenGL ES 2.0 offers two ways of rendering to textures. One is using EGL pbuffer surfaces; the other is attaching a renderable texture to a framebuffer object (FBO). The latter approach is the recommended one for POWERVR SGX.
さらにはSDKとデモまであった。
Khronos OpenGL ES 2.0 SDKs for POWERVR SGX
ということで、早速iPhone 4を申し込み。
Programmable Filter
iPhoneでレンズ越しに入ってくる映像をリアルタイムに加工できるというのはこういうイメージで、夜景とかスポーツとかデジカメやビデオカメラにあるいろんなフィルターを、自由にプログラムできるということかもしれない。
今回はいわば音感フィルタなるものを作っちゃおうということだ。
バスの時刻表の写真を撮っている人に
目の前がバス停なんでよく見かけるんですが、結構難しいんじゃないかと思います。斜めから撮ると歪むから端へ行く程読みにくくなるはずですから。ただ正面から撮ろうと何度も撮り直している様子はありませんから、きっと特定の時間帯だけ撮っているんでしょう。
一回これなんとかできないんだろうかと調べた事があって、そういう技術はあります。例えばナンバープレートの撮影。歪みを補正して、文字を認識させます。たぶん日本のNシステム(新宿鮫でそう呼ばれていた、ナンバー読み取り装置のこと)もそういうことをしているんだと思います。壁一面に描かれた古代の文字を研究している人なんか重宝らしいです。全体の写真を撮って、その歪みを直せば、紙に書いたように読むことが出来ます。
バス時刻表フィルター。これはニッチですぞ。
楽器やる人に応用すると、本になっている楽譜の1ページをコピーするとき、どうしても歪んじゃうことがあります。かといって普通の写真で撮ってもやっぱり歪みます。そんな時、
楽譜フィルター。これもニッチだなあ。
iPhoneのカメラからビデオフレームを取り出す方法
Technical Q&A QA1702 How to capture video frames from the camera as images using AV Foundation
確かに基本はこういうことなんでしょうが、相変わらずすんなりいかないようになっているので、Apple Developer Forumにまとめときました。