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

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

AIをARに応用するぞ会 → (第10回) ~OpenCV取り込み~


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

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



お久しぶりです。

開発メンバーのYです。
最近は諸事情(ワクチンとか)あって勉強会はしばらく休止していました。
9,10月は隔週だと予定が合わないことが多かったので今後は月2回をノルマとして開催していきます。


さて今回は、OpenCVの取り込みをやりました。
プレビューしている映像から画像を抽出して推論までやりたかったのですが、
色々あって再度カメラプレビューから実装が必要になり、今回はOpenCVの取り込みまでで時間が来てしまいました。

その過程で、画像の保存形式について学びがあったので書いていきます。

0. 前回まで

↓前回のブログ
https://tottorisnow33.hatenablog.com/entry/2021/09/04/135235

前回はCameraX APIを使って、カメラで取得した映像をプレビューすることに成功しました。
いざOpenCVをいれてみよう!ということで以下ブログを参考に実装を試みましたが、
qiita.com

残念ながらOpenCVの取り込みで手詰まりしてしまいました。。

原因は使用していたAndroidstudioのバージョンがよくなかったとのことで、
今回は諦めてブログで使用しているバージョンに合わせていきます。

1. カメラプレビュー(失敗)

ブログを参考に環境構築をしたところ、無事カメラプレビューのプログラムを動かすところまでいけました。

f:id:tottorisnow33:20211204105612p:plain
プレビュー失敗

何かがおかしい、、、
画像の輝度情報はとれてるけど色がなんだかおかしいようですね。

ソースコードを見る感じ、YUV形式で画像を扱っている箇所に問題がありそうなので原因を調査していきます。

2.原因

原因はどうやらYUV形式のフォーマット違いによるものでした。
YUVをRGBに変換する際に、指定するYUVフォーマットを誤っていたようです。

参考にしたコードはNV12形式を指定してRGBに変換をかけていましたが、本当はI420形式を指定しなければいけなかったようです。

変換フォーマットをI420形式に修正したところ、プレビューに成功しました。

f:id:tottorisnow33:20211204100724p:plain
プレビュー成功

3.画像の保存形式について

調べてみると、YUVというのは1つの形式ではなく、幾つかの形式の総称だということが分かりました。
YUVの中にもたくさんのフォーマットがあるそうで、メモリ構造に違いがあるそうです。

以下ブログを参考にYUV形式について学びました。
www.klab.com


今回のNV12とI420の違いについてまとめると以下のような感じです。

f:id:tottorisnow33:20211204110127p:plain
イメージ

4. 次回やること

今回、cameraX apiのカメラ映像プレビュー+OpenCVの取り込みができたので、
次回はついに学習済みモデルに入力して推論させてみたいと思います。

それではまた次回。