2010年2月8日月曜日

そしてバーコードの読み取り機能

さて、最大の目玉機能であるバーコードスキャンの件。

下調べはamazonアクセス実験なんかと並行して実施してたけど、amazon接続がうまく行くことを確認したので、本格的にバーコードの読み取り機能をつけていこうとした。

下調べ中にわかったんだけど、iPhoneのバーコード読み取り機能ってアプリで販売されている。(RedLaser)
しかも、このアプリは大ヒットらしく、TechCrunchにこの件について記事になっていたくらいだ。
それから、このアプリの会社は、このバーコードスキャン機能を有償でライブラリ提供しているようで、会社のwebサイトにライセンス料金が書いてあった。それによると、、、
  • デベロッパ登録は $50
  • 最低$2,500
  • 5万本以上売ったら、そこからパーセンテージでライセンス料ね。
とのこと。
100本とか200本売れれば御の字だぜ!と思っている身に $2,500はきびしーー。
てか、仕事がなくて貧乏になっているのに、ここで払える金なんぞありません!

とはいえ、バーコード読み取り機能がついてないと、当初の構想の達成にはならないので、最悪、金を払ってでもライセンスを受ける覚悟だけ決めて、まずは自分でバーコードスキャン機能を作ってみることにした。

まずはバーコードとはどのようなもので、ISBNとはどのようなもので、ISBNとバーコードとはどんな風に絡んでいるのか?ってのをwebなどで調べて、それぞれの規格を把握。
これをもとにバーコードの読み取りコードを書いていこうとしたのだけで、その前にiPhone固有の大問題が発覚した。

実はAppleから提供されるドキュメントや前述の「iPhone SDKアプリケーション開発ガイド」にはiPhoneカメラのリアルタイムでの画像取り込み、処理の方法がまったく書いてない。
カメラで写真やムービーを撮る方法はいくらでも解説がありサンプルコードが存在するのに、カメラ機能だけ有効にして写真をとらずに表示されているカメラの映像をプログラムに取り込む方法がまったくわからなかったのだ。
これはバーコードスキャンするほうからすると致命的な問題。だってバーコードの写真をいちいち撮影した上でそれをアプリに読ませて認識されるなんてしたくないじゃない?バーコードにカメラをかざしたら「ピッ!」とかいって即でamazonに飛びたいじゃない?

いやぁ、延々調べましたよ。セカイカメラやUStreamアプリ、それに上記のRedLaserもリアルタイムで画像処理してるんですよ。でもその公式APIが存在しない。まじで途方にくれました。
で、その探しいる途中ですごくヒントになるwebの書き込みを見つけました。

これですべてわかりましたよ。
そうなのです!カメラのリアルタイム画像を取り込むAPIはまったく存在しないのです。そんなものはもともとないんですよ!
カメラの画像を取り込むのではなく、カメラが写したiPhone上の画像を連続でキャプチャすればいいわけだ。
で、キャプチャもAPIがあるわけでもなく、いま現在iPhoneに写っている画像のビットマップメモリを直接参照(実際には一旦、別のCGImageにコピーしたものだけど)すればいいわけです。

実はこの機能も非公開APIなのだけどUStreamが審査を通過してからはその利用が暗黙のうちにOKになったようで、おかげでセカイカメラやそれにつづくAR/VR/リアルタイムカメラエフェクトなアプリも軒並み審査を通過している。
すごく合点がいきました。いっきに視界が晴れ上がった気がしました。

で、さっそくその機能をつかってバーコードをキャプチャし、仕様書をもとにオリジナルで考えたアルゴリズムでバーコードデータをリアルタイムで2値化、補正してみることにした。
それがこれ。
 
画像のが上半分が実際にリアルタイムスキャンしているバーコード。
その中段にあるのが2値化直後の画像。
そして下段、タブバーの上にある細い白黒画像が実際にバーコードとして認識させようとして補正を加えたもので、非常に鮮明にバーコードが二値化された。
で、これをバーコードの規格(JANコード)にそって読み出すと、ISBNコードを取得することができた。
やったね! これで下手にライセンス料を払わないで済むことになるよ!

と、バーコードが読めた瞬間、
「オレって天才! いま、世界はオレを中心に廻っている!」
と、いつもの勘違いを味わっていました。
その後に、まさかあんなことがおきようとは。。。


ちなみに、このバーコードの読取コーディングをはじめてから実際にISBNが読めるようになるまで約2日くらい。結構楽勝!

1 件のコメント:

  1. iOS4になってこのリアルタイムで画像をキャプチャするAPI(UIGetScreenImage)は、また非公開になってしまいました。

    代替手段としてAVCaptureVideoPreviewLayerを使ってね!と、Appleから指示がでています。

    これも一筋縄じゃいかないんだけど、まぁ出来なくはない。http://ohneta-blogger.blogspot.com/2010_08_01_archive.html で概要だけ紹介したので、参考にするならがんばってね :)

    返信削除