とりあえず日記

VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ→VIM→秀丸エディタ(いまここ🍄)

MAYA2019のC++プラグインからOpenCVを利用する方法🔰🔰

はじめに

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. C:\Windows\System32にコピーする
  2. 自作プラグインと同じディレクトリに置く
(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;
}

 

何かもっといい方法ないですかねぇ😢

 

 環境

 

最後に

とりあえず、CMakeLists.txtを編集して自作MAYAプラグインからOpenCV(DLL版)を利用できるようになりました。

ただし、DLL読み込みパスの問題が残ったままなので、次のステップとしてOpenCVの静的リンクを試してみます。

 

後日談

ohtorii.hatenadiary.jp