OpenCV 4.9.0 カメラプレビュー同時左右2画面表示
(Android Studio)Camera2 API

2024.1.17 2020.6.1 Coskx Lab  

1 はじめに

同時に2つのカメラプレビューを表示(P10Lite)
同時に2つのカメラプレビューを表示(Nexus5x)

OpenCVを使って,プレビュー画像を同時に2画面に表示します。 2つのプレビュー画像はカメラからのイメージデータをもとに作成されています。(1入力2出力)
通常は,表示用の1つのMat画像が,MainActivityのonCameraFrame(CvCameraViewFrame inputFrame)で作成されます。 ここではonCameraFrame()がMat2個をMat配列で返すように変更しています。 2個のMat画像は異なる画像処理を加えることができます。
実行例では,カラー画像とグレースケール画像を表示するようにしています。 しかし,用途に応じてMainActivityのonCameraFrameの処理によって変えることができます。 例えばカラー画像と二値画像,カラー画像と輪郭抽出画像のような組み合わせもできます。

2 使用環境

3 準備

OpenCV4.9.0のカメラプレビュー」記事で「OpenCVモジュール」取り込みの手順はすでに終わっているものとします。

4 ダウンロードしたファイルをprojectに適正に配置

ダウンロード

(1)MainActivity.javaをダウンロードしたファイルで置き換えます。

(2)次の2つのファイルをMainActivity.javaと同じフォルダに置きます。
 CameraBridgeViewBaseDuo.java
 JavaCamera2ViewDuo.java
オリジナルのパッケージ名を検索しながら,パッケージ名を適正に揃えます。

(3)AndroidManifest.xmlを置き換えます。横位置(landscape)固定のアプリにします。
パッケージ名が書かれているところがあるので,修正し揃えます。

(4)activity_main.xmlを置き換えます。
この中のView部品の名前にもパッケージ名が書かれているところがあるので,修正し揃えます。

5 CameraBridgeViewBaseDuo.javaなどは何をしているのか

ここで用いている
 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
に行われています。

デバイスによって利用可能なプレビューサイズが異なりますので,表示は機種によって異なります。(上のスクリーンショット参照)

6 まとめ

同時に2つのカメラプレビューを表示するひな型アプリを作りました。