Go our for Creation

UE4始め3DCGとか、プログラミングとか、カメラとかとか。

UE4ぷちコンデビュー奮闘記 振り返りPart2 ~OpenCVによる画像更新~

 

前回はぷちコンに際してどういう思考の順番を辿ったか、というところをざっくりとまとめてみましたが、今回はその中で(個人的に)最も苦戦したOpenCVの導入+記述についてまとめます。

※まだ試行錯誤中のため、内容に誤りがある可能性があります※

※知識がアップデートされ次第、更新していきたいと思います※

 

今回でいうところの下記のシーンに適用しています。

 

f:id:shin_t_o:20170409183732g:plain

カメラで撮った写真を、バックモニターを通して見返す※という実際に僕が(というかカメラ持ちさん皆かな?)やる動きを、今回の作品で再現しようと思いました。

 ※これ(愛用機:D7000)↓

f:id:shin_t_o:20170409202115j:plain

 

必要な機能をざっくりまとめると

 ・マップ移動中、ボタンひとつでバックモニターを呼び出したい

 ・バックモニターには、「それまで撮った写真を見返す」機能をつけたい

 ・新しい写真を撮るたび、モニターで見返せる写真が更新されていく

  └ 表示する1枚目は最新のスクリーンショットファイルを参照

  └ モニター内で画像をめくっていくと、過去の写真に遡れる

という感じ。普段自分が撮りたい場所にカメラを持って行って、写真を撮り、それを見返すという一連の動作を再現してみたかったんです。

 

しかしUE4の仕様上、スクリーンショットは連番式にローカルに保存され、都度更新されていくため事前に画像をEditor上にImportしていなければならないという前提のBlueprintでは対応できない…?

=HUD上にImageを配置し、DynamicMaterialを都度更新していくような関数を作成しなければならない・・・?

という壁にぶつかり、色々調べていたら下記に辿りつきました。

UE4でOpenCV使う - #memo

Integrating OpenCV Into Unreal Engine 4 - Epic Wiki

どうやら(現段階での私の知識量・スキル&残り作成時間を考えて、)C++は避けられないらしい…ということで期せずしてUnreal C++デビュー。

 

 導入に際してのだいたいの手順はIntegrating OpenCV Into Unreal Engine 4に記載されているので、今回辿った手順をざっくりとまとめる。

 

1.外部プラグインであるOpenCVの導入

2.Visual Studio側で実装

3.Blueprint側で実装

 

1.外部プラグインであるOpenCVの導入

そもそものUnreal C++環境の構築については公式(

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

  -同上、ファイルのコピー

f:id:shin_t_o:20170409224841p:plain

余談ですが、上記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を変換する関数を記述

⇒「文字列を引数とする、スクリーンショットファイル参照関数」が出来上がった

f:id:shin_t_o:20170409232912p:plain

 

 

3.Blueprint側で実装

2で作成した関数(LoadPic)を用いて、

 ・ボタンを押した際にHUDが表示され、

 ・HUD表示とともに、HUD上に配置してあるimageファイルのマテリアルを更新

 ・更新する際、「スクショ1枚撮影するたびに1増えるカウンター」を用意し、最新のスクショファイル名を指定するためのパラメータに用いる

 

f:id:shin_t_o:20170409232426p:plain

 

という感じ。

 

取り急ぎ今回はここまでに止め、最低限必要な機能のみ(見栄えも考えて)盛り込みました。ただOpenCVで呼び出されている画像の見え方がLocalのモノと異なるとか、バックモニター1ページに画像6~9枚くらい表示させたいよね、過去に遡りたいよね、アニメーションつけたいよね、…と今後盛り込みたい機能は沢山。