UE4ぷちコンデビュー奮闘記 振り返りPart2 ~OpenCVによる画像更新~
前回はぷちコンに際してどういう思考の順番を辿ったか、というところをざっくりとまとめてみましたが、今回はその中で(個人的に)最も苦戦したOpenCVの導入+記述についてまとめます。
※まだ試行錯誤中のため、内容に誤りがある可能性があります※
※知識がアップデートされ次第、更新していきたいと思います※
今回でいうところの下記のシーンに適用しています。
カメラで撮った写真を、バックモニターを通して見返す※という実際に僕が(というかカメラ持ちさん皆かな?)やる動きを、今回の作品で再現しようと思いました。
※これ(愛用機:D7000)↓
必要な機能をざっくりまとめると
・マップ移動中、ボタンひとつでバックモニターを呼び出したい
・バックモニターには、「それまで撮った写真を見返す」機能をつけたい
・新しい写真を撮るたび、モニターで見返せる写真が更新されていく
└ 表示する1枚目は最新のスクリーンショットファイルを参照
└ モニター内で画像をめくっていくと、過去の写真に遡れる
という感じ。普段自分が撮りたい場所にカメラを持って行って、写真を撮り、それを見返すという一連の動作を再現してみたかったんです。
しかしUE4の仕様上、スクリーンショットは連番式にローカルに保存され、都度更新されていくため事前に画像をEditor上にImportしていなければならないという前提のBlueprintでは対応できない…?
=HUD上にImageを配置し、DynamicMaterialを都度更新していくような関数を作成しなければならない・・・?
という壁にぶつかり、色々調べていたら下記に辿りつきました。
Integrating OpenCV Into Unreal Engine 4 - Epic Wiki
どうやら(現段階での私の知識量・スキル&残り作成時間を考えて、)C++は避けられないらしい…ということで期せずしてUnreal C++デビュー。
導入に際してのだいたいの手順はIntegrating OpenCV Into Unreal Engine 4に記載されているので、今回辿った手順をざっくりとまとめる。
1.外部プラグインであるOpenCVの導入
Unreal Engine | UE4 に Visual Studio を設定する方法
)で丁寧な説明がなされているのでそちらを参照して頂ければと。
下記は「Integrating OpenCV Into Unreal Engine 4」にて記述されている目次を抜き出したものです。
Using the Plugin
-[プロジェクト名].Build.CS内のPublicDependencyModuleNamesを書き換え
Copying the OpenCV Files
-説明の通り、当該ファイルを指定のフォルダ内にコピーすればOK
Adding OpenCV Dependencies
-[プロジェクト名].Build.CSのinclude部にSystem.IOを追加
-それ以降はpublic class [プロジェクト名]内部に記載
Copying the DLL's to the Build
-同上、ファイルのコピー
※
余談ですが、上記URLで紹介されているWebcamReaderを最後まで実装するとPC内に搭載されている(ノートPCであれば恐らく内蔵カメラが検出優先度高?)Webカメラで撮りこんだ映像をUE4内で表示できるようになります。
Webカメラの映像をVideoTextureに変換し、毎Tick更新してDynamicMaterialに代入する仕組みのよう。
2.Visual Studio側で実装
ここはもうC++の記述経験もなく、UnrealC++も初だったので聞きまくることに。
やったこと一覧だけまとめてみる。
・ヘッダーファイルのincludeにopencv2シリーズ記載
・ヘッダーファイル内で関数宣言
・C++ファイル側でusing namespace std/cvを記述
・C++ファイル側で文字列を引数とし、特定のフォルダ(=スクリーンショットファイルがあるフォルダ)を参照し、WebcamReaderでも使われていたMat2TextureによってTextureを変換する関数を記述
⇒「文字列を引数とする、スクリーンショットファイル参照関数」が出来上がった
3.Blueprint側で実装
2で作成した関数(LoadPic)を用いて、
・ボタンを押した際にHUDが表示され、
・HUD表示とともに、HUD上に配置してあるimageファイルのマテリアルを更新
・更新する際、「スクショ1枚撮影するたびに1増えるカウンター」を用意し、最新のスクショファイル名を指定するためのパラメータに用いる
という感じ。
取り急ぎ今回はここまでに止め、最低限必要な機能のみ(見栄えも考えて)盛り込みました。ただOpenCVで呼び出されている画像の見え方がLocalのモノと異なるとか、バックモニター1ページに画像6~9枚くらい表示させたいよね、過去に遡りたいよね、アニメーションつけたいよね、…と今後盛り込みたい機能は沢山。