LoginSignup
2

UnrealEngine5.2.0でOpenCVを使ってみる

Posted at

UnrealEngine5.2.0でEngine付属のOpenCVプラグインを利用してOpenCVを使ってみました。

試してみたプロジェクトのサンプルは以下となります(SceneCapture2DでキャプチャしたARマーカーを認識をして書き出すだけです、OpenCVArUcoDetectMarkers使った方が良さそう)。
https://github.com/mechamogera/UnrealEngineOpenCVSample

ここではそこで気付いた内容をメモしておきます。

detect.png

やり方

直接プロジェクトで利用する場合は.uprojectファイルに、プラグインにする場合は.upluginファイルでEngineのプラグインを利用するために以下のように記述します。

	"Plugins": [
		{
			"Name": "OpenCV",
			"Enabled": true
		}
	]

Build.csでは以下のようにOpenCVHelperとOpenCVモジュールを指定します。

PrivateDependencyModuleNames.AddRange(
			new string[]
			{
				...
                "OpenCVHelper",
                "OpenCV"
            }

C++コードでopencvのヘッダをincludeする場合は以下のようにPreOpenCVHeaders.hPostOpenCVHeaders.hで囲む必要があるみたいです。
読み込み時に出るwarningを無視したりとヘッダ読込に必要な処理を行っているようです。

#include "PreOpenCVHeaders.h"
#include <opencv2/core/mat.hpp>
#include <opencv2/aruco/dictionary.hpp>
#include <opencv2/aruco.hpp>
#include <opencv2/highgui/highgui.hpp>
#include "PostOpenCVHeaders.h"

OpenCVのバージョン

以下を見るとopencv_world455.lib/dllがあるのでOpenCVのバージョンは4.5.5のようです。
UE_5.2\Engine\Plugins\Runtime\OpenCV\Source\ThirdParty\OpenCV\lib\Win64

OpenCVHelper

メモリ確保と解放

素のままのOpenCVを使うとメモリ確保と解放がEngine側と異なるためにstd::vectorの受け渡しをしたりするとクラッシュする場合があります。
OpenCVHelperではOpenCVに独自に埋め込んだメモリ確保と解放方法の設定関数を利用して、UnrealEngineのメモリ確保と解放方法を指定してこの問題を解消しているようです。

OPenCVでのメモリ確保と解放方法の設定関数部分
OpenCVHelperでのメモリ確保と解放方法の設定

参考になりそうなコード

OpenCVHelpr.cppにcv::MatからUTexture2Dを作成するコードがあったり
OpenCVBlueprintFunctionLibrary.cppでChessboardやArucoの認識(+オプションでカメラ位置に対するマーカーの3D姿勢推定)する関数があるので参考になりそうです。

UnrealEngine4.27での利用について

Engine付属のOpenCVLensDistortionプラグインを利用することで同じように利用できる感じです。
ただし、OpenCVのバージョンは3.3.1になります。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
2