はじめに
MAYAプラグイン(C++) でOpenCVを使おうとしてはまったのでメモ🔰🔰
注意
MAYAで映像を作成しているアーティストさんに自作プラグインを評価してもらうのが主目的なので、プログラマ視点では間違った対応方法の箇所があります。
ご注意ください。
CMakeLists.txtの書き方
cmake_minimum_required(VERSION 2.8)
# include the project setting file
include($ENV{DEVKIT_LOCATION}/cmake/pluginEntry.cmake)# specify project name
set(PROJECT_NAME helloCmd)
# set SOURCE_FILES
set(SOURCE_FILES
helloCmd.cpp)
# set linking libraries
set(LIBRARIES
OpenMaya
Foundation)
# Build plugin
build_plugin()
###############################
# OpenCVの設定は最後に追加する
###############################
find_package( OpenCV REQUIRED )
if(OpenCV_FOUND)
target_include_directories(${PROJECT_NAME} PUBLIC ${OpenCV_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})
#DLLの遅延読み込みを有効化する
#DLL名の取得方法がわからないためハ-ドコーディングしたよ😅😅
set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS_RELEASE /DELAYLOAD:"opencv_world410.dll")
set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS_DEBUG /DELAYLOAD:"opencv_world410d.dll")
endif()
自作プラグインから opencv_world410.dllを読み込む方法
やり方は二通りあります。
(1)について
自分の環境でテストする分には良いですが、ほかの方に配布するときにプラグインが動かないとトラブルの元になります。
(2)について
dllをコピーしただけでは認識しないので、以下2点の対応を行います。
- DLLを遅延読み込みする(CMakeLists.txt中でリンカーオプションを設定する)
- DLLの検索パスを自作プラグインのパスにする
DLL検索パスはプラグイン冒頭で以下のようにしました。
#include<windows.h>
#include<tchar.h>
MStatus MyPlugin::doIt(const MArgList &arg_list) {
//
//DLL検索パスを自作プラグインのパスに変更する
//{
TCHAR name[MAX_PATH + 8] = { 0, };
TCHAR* lastdelim = 0;
if (GetModuleFileName(MhInstPlugin, name, _countof(name)) == 0) {
return MStatus::kFailure;
}
lastdelim = _tcsrchr(name, '\\');
*lastdelim = '\0';
if (SetDllDirectory(name) == 0) {
return MStatus::kFailure;
}
}MStatus result;
try {
//プラグインのメイン処理
result = Main(arg_list);
}catch (...){//自作プラグイン中のC++例外はすべて無視してMAYAがクラッシュしないようにする。
//ハードウェア例外は普通に処理されるのでMAYAはいつも通りクラッシュするよ😙
//まぁ、MAYAは何もしなくてもクラッシュするけどね😨ははは・・・
result = MS::kFailure;
}
//
//DLL検索パスを元に戻す
//
SetDllDirectory("");
return result;
}
何かもっといい方法ないですかねぇ😢
環境
- Windows10 64bit
- MAYA 2019
- Visual Studio 2015 Update3
- OpenCV 4.1.0
- CMake 3.14.5
最後に
とりあえず、CMakeLists.txtを編集して自作MAYAプラグインからOpenCV(DLL版)を利用できるようになりました。
ただし、DLL読み込みパスの問題が残ったままなので、次のステップとしてOpenCVの静的リンクを試してみます。