ぼっちプログラマのメモ

UE4とかVRとかについて書いたり書かなかったり。

UE4でWebカメラの画像を取得する方法について

はじめに

f:id:pafuhana1213:20170422234654j:plain
皆さん、カメラは好きですか!?僕は好きです!
ということで、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プラグインを使う

お待たせしました、今回紹介するのはこのプラグインです!
forums.unrealengine.com
このプラグインWebカメラからの画像取得に特化したプラグインです。4.12と少し古いバージョンが対象になっていますが、数行修正するだけで現時点で最新である4.15で問題なく動作します!また、プロジェクトの組み込みは比較的簡単なので、とてもオススメのプラグインです。

以降では、このプラグインの導入・使用方法について紹介します。C++コードを編集・ビルドする関係でVisualStudioのインストールはしておいて下さい。

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に変更

WebcameraPluginProjectile.cpp

AWebcameraPluginProjectile::AWebcameraPluginProjectile()
...
// CollisionComp->OnComponentHit.AddDynamic(this, &AWebcameraPluginProjectile::OnHit);
...

この部分でビルドエラーになるのでコメントアウト
プラグインのエラーではなく、サンプルプロジェクト側のエラーなので仮対応)


以上で対応完了です。ビルドしてプロジェクトを起動します。

WebCameraプラグインの使用方法

主な処理はプラグイン側で行っているので、プロジェクト側では特に複雑な対応は必要ありません。プラグイン付属のプロジェクトの場合、以下の対応だけで完了です。
f:id:pafuhana1213:20170422233550p:plain
(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にはデバイス数の取得関数などが用意されているので、必要に応じてコードに追加すると便利です。

おわりに

これでUE4でWebカメラの画像を取得できるようになりました。取得した画像に何か効果をかけたい場合はマテリアル側で行うことになります。もしマテリアルでは難しい処理を行いたい場合は…OpenCVプラグインの利用を検討してみても良いかもしれません…

気力があれば、次はViveトラッカと連携してMRっぽいことをしてみます