追記
UE4.18にてWebカメラの取得に関して正式対応が入りました。その為、本記事は古い内容になりますので、UE4.18以降をお使いの方は以下の記事をご確認下さい。
pafuhana1213.hatenablog.com
はじめに
皆さん、カメラは好きですか!?僕は好きです!
ということで、UE4でWebカメラの画像を取得する方法について調べました(雑導入)
…Webカメラの画像を取得できると、昨今話題になっているAR, MR的なことがUE4上で可能になります。先日紹介したViveTrackerと併用すれば、こんな感じのことも簡単に?できるはず…?
www.youtube.com
Webカメラの画像を取得するには
2017/4/22現在で取れる手は以下の4つです。
OpenCVプラグインを使う
OpenCVプラグインに関しては以前の記事でご紹介しました。ただ対応しているバージョンが4.9とかなり古いため、今となってはあまりオススメできません…。
pafuhana1213.hatenablog.com
公式対応を待つ
公式対応は…今のところ4.17を予定しているようです。もうしばらくお待ち下さい…
Investigate Media Framework plug-ins for webcam support
https://issues.unrealengine.com/issue/UE-35406
がんばってコードかく
がんばって!
WebCameraプラグインの導入方法
まずは以下のページからプラグインを含むファイル一式をダウンロードします。
github.com
ダウンロードしたファイルの中に.uprojectがあるので、右クリックメニューの「Generate Visual Studio project files」からslnファイルを出力しダブルクリックで開いて下さい。そして、各コードに対して以下の対応を行います。
WebcameraPlugin.uproject
... "Name": "BlankPlugin", "Enabled": true ...
を
... "Name": "Webcamera", "Enabled": true ...
に変更(WebCameraがデフォルトで有効になるように)
WebcameraPluginCharacter.cpp
AWebcameraPluginCharacter::AWebcameraPluginCharacter() ... //FirstPersonCameraComponent->AttachParent = GetCapsuleComponent(); FirstPersonCameraComponent->SetupAttachment(GetCapsuleComponent()); ... //Mesh1P->AttachParent = FirstPersonCameraComponent; Mesh1P->SetupAttachment(FirstPersonCameraComponent); ... //FP_Gun->AttachTo(Mesh1P, TEXT("GripPoint"), EAttachLocation::SnapToTargetIncludingScale, true); FP_Gun->SetupAttachment(Mesh1P, TEXT("GripPoint")); ...
AttachToでビルドエラーになるので、SetupAttachmentに変更
WebCameraプラグインの使用方法
主な処理はプラグイン側で行っているので、プロジェクト側では特に複雑な対応は必要ありません。プラグイン付属のプロジェクトの場合、以下の対応だけで完了です。
(FirstPersonCharacter)
「Webカメラの画像を取得するだけなのにCharacter継承のBPを使うというのも…」という方は、C++のActor継承のクラスを新規作成し、以下のコードを追加して下さい。
h側
public: UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Webcamera") class UTexture2D* WebcameraTexture; virtual void BeginPlay(); virtual void BeginDestroy();
cpp側
コンストラクタに ANewActor::ANewActor() { WebcameraTexture = NULL; } void ANewActor::BeginPlay() { Super::BeginPlay(); // Webカメラからの画像取得。Connet関数の引数はデバイスID WebcameraTexture = IWebcamera::Get().Connect(0); } void ANewActor::BeginDestroy() { Super::BeginDestroy(); IWebcamera::Get().Disconnect(0); }
※ ANewActor部分は新規作成したクラス名に置き換えて下さい。
これで動作するはずです。接続するデバイスIDを変えたい場合はコードを直で修正するか、渡す引数部分をプロパティにして調整できるようにして下さい。IWebcameraにはデバイス数の取得関数などが用意されているので、必要に応じてコードに追加すると便利です。