UE4でOpenCV使う
Integrating OpenCV Into Unreal Engine 4 - Epic Wiki
そのままガイドがあるのだ、作者が配布してるPluginを導入してBuild.CSを書き換えたら自分で別にOpenCV用意しなくても、もうそれだけで使えるようになる。プラグイン使わない方法も乗っているので、4.9以外でも使えるはず
そこのページではWebCameraをテクスチャにしているけど、もっと簡単に昨日わからなかったpngファイルを読み込んでからのDynamicTextureの実装や、適当な関数をつかってみる
はじめに、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突っ込んだら落ちる