Android端末にUSBで接続したUVCカメラから静止画のキャプチャが出来るようになったよぉ\(^o^)/
って今までも出来てたやんって思った人、チッチッチのモンチッチ^^/
今まではカメラから受信している映像ストリーム(動画)から1フレームだけ切り出して静止画として保存していただけです。でもUVCクラスには映像ストリームとは別にカメラ側で静止画として映像を撮影して送ってもらえるような機能があるのです。今回(カメラがサポートしていれば)カメラ側で静止画を撮影できるように実装しました。
そんなん何が嬉しいんかって思ったそこのあなた、プレビュー画面とは違う解像度の静止画を取得できるんですよ^^ つまり今までだと解像度の高い映像を静止画として取得する場合にはプレビュー画面も解像度を上げる必要があり性能の低い機種だとパラパラ漫画状態になってしまってました。それがプレビュー画面と静止画の解像度を別々にできるようになったことでプレビュー画面は少し低めの解像度にしてリアルタイム性を優先して、必要な時だけ高解像度の静止画を撮影できるようになったってことです。
ちなみに、UVCでのカメラ側での静止画撮影機能はこんな感じの定義になっておりまする。
- メソッド0:
カメラ側での静止画キャプチャに対応していない機種 - メソッド1:
カメラ側での静止画キャプチャには対応していないけど、ハードウエアトリガをサポートする機種 - メソッド2:
カメラ側での静止画に対応、ただし通常の映像ストリームと排他使用のみ可 - メソッド3:
カメラ側での静止画に対応、通常の映像ストリームと同時使用可
今までは例えカメラ側がサポートしていたとしても常にメソッド0扱いにしてアプリ側で処理してました。
でもメソッド2に対応したカメラだとカメラ側での静止画撮影が可能になりました。
もっともハードウエアトリガー機能には対応していないので、メソッド1もメソッド0と同じ処理をします。またメソッド3はメソッド2と同じ処理をします(一旦プレビューを止めて静止画撮影、その後プレビュー再開)。
でも悲しい事に市販されている多くのWEBカメラではカメラ側での静止画撮影に対応していないものが多いんです(´・ω・`) 普通の人より沢山のUVCカメラが転がっている自分ちでも対応しているのは8機種中わずか2機種(´・ω・`) もうすぐまた1機種増えるんだけどそれが対応しているかどうかは不明。
カメラ側での静止画撮影に対応していない機種でも一時的に映像ストリームの解像度を高くして撮影できるかどうかはまだ未確認。大抵のカメラは動画のストリーミング開始時の数フレームは映像が乱れる事が多いのでちょっと面倒くさいなぁなんて。まぁ最初の数フレームをスキップすれば良い話ですが。
ちなみにカメラ側での静止画キャプチャに対応したのは今のところオレオレライブラリのみで、libusb/libuvcでの実装は未定。だって見通しが悪くて超めんどいだもん↓ どっかいらうとあっちこっちで不具合が起こりそうな予感しかしません(-_-;)
GooglePlayで公開しているアプリで言うと、互換性設定が無効の時(チェックを外している時)のみ使える機能となる予定。まぁ要望が多ければlibusb/libuvcの方にもバックポートするかもしれないけどね。