UVCCameraリポジトリのライブラリを使ってUVCカメラからの映像をリアルタイムにOpenCVで映像処理して表示するサンプルをGitHubに上げた。
OpenCVwithUVC
いつものように安直な名前が付いとるけど気にせんように(笑)
このサンプルでは、次のようなことをしとります。
- UVCカメラから映像を受け取る
- MJPEG展開
- native側からSurface(SurfaceTextureでもTextureViewでもええけど)へ映像を書き込む
- OpenGL|ESのテクスチャで受け取る
- 必要ならOpenGL|ESで映像処理(これは今回はなし)
- ソース映像用途OpenCV用に分配描画
- PBO経由の非同期読み込みでcv::Matへコピー
- OpenCVでの映像処理(今回は単に白黒にしただけ)
- ダイレクトバイトバッファ経由でJava側へ映像を戻す
- ダイレクトバイトバッファからBitmapに変換
- BitmapをSurfaceへ描画
単に白黒にするだけなら、もっと簡単な方法がいくつもあるねんけどな(汗)
あと、手抜きなところがいくつかあってもう少しは効率上げれるねんけど、まぁサンプルやし気になる人は自分で治してんか。でもOpenCVのJavaバインディングは使ってないし、何回かコピーはしとるけど一度もJavaVM内のメモリーへはコピーしてへんから、OpenCVでの処理が重たすぎんかったら、そこそこなパフォーマンスがでるで。
あと、くれぐれもAndroidで動画のライブ映像処理をOpenCVのオフィシャルJavaバインディングで行おうなんて無謀なことを考えないようにな、瞬殺されかねんで。
どうしても普通のAndroid端末上で、OpenCV使ってライブ映像処理を行いたいんなら、このサンプルのようにnative側で行うしかあらへん。それでも処理をかなり選ばんと負荷高こうてアッチッチになるから注意してな。