茨城エンジニアのPython開発日記

茨城のITベンチャー企業ではたらく2年目エンジニア。Pythonで色々なものを作成中。

AIをARに応用するぞ会 → (第9回) ~カメラプレビュー~


ブログから記事を見つけたい場合はこちら

ブログ地図 - 茨城エンジニアのPython開発日記



こんにちは。

開発メンバーのKです。
先日COVID-19のワクチンの2回目を摂取しました。
副反応(熱、頭痛、寒気、倦怠感)がつらかったです。
副反応が出ている中で金曜ロードショーの『風立ちぬ』を見ましたが、
あまり頭に入ってきませんでした。そら~に~あっこがれて~

さて今回は、スマホでAIを入れたARを使うために、
スマホのカメラで取得した映像を画面上にプレビューすることに挑戦しました。


以下、目次です。

0. 前回まで

↓前回のブログ
https://tottorisnow33.hatenablog.com/entry/2021/08/08/161317

前回までは
Camera2 APIを使って、カメラで取得した映像をプレビューすることを試みていました。

しかし今回実際にプレビューしようとすると、カメラの接続が切れてしまったエラーが出てで止まってしまいました。。。
いろいろ原因を探りましたが、最終的にはCameraX apiを使うことでプレビューすることができました。

1. たくさんあるCamera api

Camera apiは古い順に、camera api、camera2 api、cameraX apiとあるようです。
camera apiとcamera2 apiはどちらもonResume() と onPause()で明示的に開始と停止メソッドを呼び出します。
この2つのうちcamera2 apiが推奨されています。
一方で、cameraX では、cameraProvider.bindToLifecycle() を使用して、カメラを関連付けるライフサイクルを指定するようです。
また、そもそもcameraXは「ユースケースを導入」しているそうなのですが、それがどういうことなのかまだ理解していなので、これから理解していきます。
ただ1つ言えることは、cameraXのほうがcamera2よりも扱いやすいということです。

そこで今回、cameraXを使いました。

2. 参考にしたソース

以下のサイトを参考にしました。
https://iotes.lk/2020/12/13/camerax-android-in-java/

我々はJavaを使って実装していて、上記の参考サイトもJavaで実装しているのでとてもありがたいページです。
(公式のチュートリアルや他の多くの参考サイトではKotlinを使っているので、Javaの参考サイトはありがたい。)

このソースを参考にして、xmlやMainAcitivityを書いたところ、無事にカメラの映像をandroid studioのシミュレータ上で表示することができました。
※ソースは上記の参考サイトを見てください。

f:id:tottorisnow33:20210904134725p:plain
シミュレータのスクリーンショット

90度回転しているのは、スマホのカメラをPCにつないでwebカメラと使っていて、スマホを横にしているからです。
回転した画像だとAIで推論するときに悪影響となるので、のちのち修正しようと思います。

3. build.gradleに依存関係を追加する

今回、ポイントとなるのはbuild.gradle(:app)に依存関係を書くということです。
具体的にどうしたかと言うと、build.gradle(:app)内のdependencies { } 内に、

      implementation "androidx.camera:camera-view:1.0.0-alpha19"

を追記しました。
これにより、androidx.cameraのview関連のメソッドを使えるようになります。
特に今回cameraXを使うにあたって、activity_main.xml内にPreviewViewをレイアウトに追加する必要があるのですが、
そこでandroidx.camera.view.PreviewViewを呼び出すためには、上記の依存関係を書いておく必要がありそうです。

依存関係を追加するというのは、andriod アプリを作る上でとても大切な基礎知識となると思うので頭に入れておこうと思います。

4. 次回やること

cameraX apiを使ってカメラの映像をプレビューすることはできるようになったので、
次は、
(1) プレビューしている映像から画像を抽出して
(2) 学習済みモデルに入力して推論させる
ことをやりたいと思います。