2024.1.17 2020.6.1 Coskx Lab
同時に2つのカメラプレビューを表示(P10Lite) |
同時に2つのカメラプレビューを表示(Nexus5x) |
OpenCVを使って,プレビュー画像を同時に2画面に表示します。
2つのプレビュー画像はカメラからのイメージデータをもとに作成されています。(1入力2出力)
通常は,表示用の1つのMat画像が,MainActivityのonCameraFrame(CvCameraViewFrame inputFrame)で作成されます。
ここではonCameraFrame()がMat2個をMat配列で返すように変更しています。
2個のMat画像は異なる画像処理を加えることができます。
実行例では,カラー画像とグレースケール画像を表示するようにしています。
しかし,用途に応じてMainActivityのonCameraFrameの処理によって変えることができます。
例えばカラー画像と二値画像,カラー画像と輪郭抽出画像のような組み合わせもできます。
(1)MainActivity.javaをダウンロードしたファイルで置き換えます。
(2)次の2つのファイルをMainActivity.javaと同じフォルダに置きます。
CameraBridgeViewBaseDuo.java
JavaCamera2ViewDuo.java
オリジナルのパッケージ名を検索しながら,パッケージ名を適正に揃えます。
(3)AndroidManifest.xmlを置き換えます。横位置(landscape)固定のアプリにします。
パッケージ名が書かれているところがあるので,修正し揃えます。
(4)activity_main.xmlを置き換えます。
この中のView部品の名前にもパッケージ名が書かれているところがあるので,修正し揃えます。
ここで用いている
CameraBridgeViewBaseDuo.java
JavaCamera2ViewDuo.java
は,OpenCVライブラリのjava/org.opencv/android中の
CameraBridgeViewBase.java
JavaCamera2View.java
を書き換えたものです。
CameraBridgeViewBaseDuoでは,次のように流れを変更しています。
カメラが取得したイメージデータがdeliverAndDrawFrame()まで届けられるところまでは,CameraBridgeViewBaseと同じです。
その後の作業はこのdeliverAndDrawFrame()で行われます。
(1)MainActivityのonCameraFrame()に送って,その戻り値として2つのMat画像を配列で受け取ります。
(2)受け取った2つのMat配列から2つのBitmapを作ります。(Bitmapも,Matと同様に要素数2の配列にしています。)
(3)2つのBitmapを,大きさと位置を調整しながら,1つのCanvas上に載せます。
(4)出来上がったCanvasがスクリーンに,表示されます。
カメラのフレームサイズやBitmapの大きさ,拡大率を適正なものにするための変更が
JavaCamera2ViewDuo.java
に行われています。
デバイスによって利用可能なプレビューサイズが異なりますので,表示は機種によって異なります。(上のスクリーンショット参照)
同時に2つのカメラプレビューを表示するひな型アプリを作りました。