UnrealEngine5.2.0でEngine付属のOpenCVプラグインを利用してOpenCVを使ってみました。
試してみたプロジェクトのサンプルは以下となります(SceneCapture2DでキャプチャしたARマーカーを認識をして書き出すだけです、OpenCVArUcoDetectMarkers使った方が良さそう)。
https://github.com/mechamogera/UnrealEngineOpenCVSample
ここではそこで気付いた内容をメモしておきます。
やり方
直接プロジェクトで利用する場合は.uprojectファイルに、プラグインにする場合は.upluginファイルでEngineのプラグインを利用するために以下のように記述します。
"Plugins": [
{
"Name": "OpenCV",
"Enabled": true
}
]
Build.csでは以下のようにOpenCVHelperとOpenCVモジュールを指定します。
PrivateDependencyModuleNames.AddRange(
new string[]
{
...
"OpenCVHelper",
"OpenCV"
}
C++コードでopencvのヘッダをincludeする場合は以下のようにPreOpenCVHeaders.hとPostOpenCVHeaders.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になります。