#memo

indiedev太郎

UE4でOpenCV使う

https://embed.gyazo.com/661fb7ff85ef6533723012d210080c89.gif

Integrating OpenCV Into Unreal Engine 4 - Epic Wiki


そのままガイドがあるのだ、作者が配布してるPluginを導入してBuild.CSを書き換えたら自分で別にOpenCV用意しなくても、もうそれだけで使えるようになる。プラグイン使わない方法も乗っているので、4.9以外でも使えるはず

そこのページではWebCameraをテクスチャにしているけど、もっと簡単に昨日わからなかったpngファイルを読み込んでからのDynamicTextureの実装や、適当な関数をつかってみる


Dynamic Textures - Epic Wiki

はじめに、OpenCVで外部ファイルを読み込んで、UE4で扱えるテクスチャとして書き出す関数を作ってみる、MatからTexture2Dへの変換

UTexture2D* AYourClass::hoge() {

	// 画像読み込み
	Mat img = imread("importimg.png", 1);

	// Texture2Dに変換
	UTexture2D* Texture = Mat2Texture(img);
		
	return Texture;

}

BPからこのhogeを呼び出すとTextureが返ってくる関数を作る、画像のパスは相対だと、UE4でビルドし終わった時とかどうなるのか調べていない
Mat2Textureの実装がDynamicTextureなのだけれど、毎ティック更新しないようならの方で実装してみる

UTexture2D* AYourClass::Mat2Texture(Mat Src) {

	UTexture2D* Texture = UTexture2D::CreateTransient(Src.cols, Src.rows);
	Texture->CompressionSettings = TextureCompressionSettings::TC_VectorDisplacementmap;
	Texture->SRGB = 0;

	void* Data = Texture->PlatformData->Mips[0].BulkData.Lock(LOCK_READ_WRITE);

	const uint8 ch = 4;
	int32 DataSize = Src.cols * Src.rows * ch;
	uint8 *ColorData = new uint8[DataSize];

	for (int y = 0, i = 0; y < Src.rows; ++y)
	{
		for (int x = 0; x < Src.cols; ++x, ++i)
		{
			ColorData[i * ch + 0] = Src.data[i * 3 + 0];
			ColorData[i * ch + 1] = Src.data[i * 3 + 1];
			ColorData[i * ch + 2] = Src.data[i * 3 + 2];
		}
	} 

	FMemory::Memcpy(Data, ColorData, DataSize);
	Texture->PlatformData->Mips[0].BulkData.Unlock();
	Texture->UpdateResource();

	return Texture;
}

これで動いてはいる、ここも参考にした
Procedural Materials - Epic Wiki

これはCV_8UC3→RGBA変換なので、グレスケのMatとか32FC3突っ込んだら落ちる