自習室

こもります

UnityでOpenCVを どう使うか - OpenCVSharp vs OpenCV dllを使う環境 vs スタティックライブラリ

はじめに

最近何編かにわたって、Unityで OpenCV を使う方法についてまとめてきました。

扱った手法は大きく分けて三つあります

  1. OpenCVSharp を使う
  2. OpenCV のDLLを使う前提で、必要な関数をラップした Native Pluginを作る
  3. OpenCVの staticlib を必要な分だけ取り込んだ Native Plugin を作る

どの手法を使うか、ちょっと考えてみました

それぞれの特徴

1. OpenCVSharp

長所

  • C# だけですんで楽
  • DLLのビルドとかない

短所

  • C++OpenCVに慣れているとちょいちょい混乱する。ちまたのリファレンスが基本 C++なだけに。
  • C++ のライブラリを全部ぶっ込み、OpenCVSharp の DLLもぶっこみ、とする必要があるのでオーバーヘッド大。特に配布を考えると。
  • あくまで有志の方が作った物で、公式の最新について行けるとは限らない

2. OpenCV のDLLを使う前提で、必要な関数をラップした Native Pluginを作る

長所

  • (OpenCVが事前にインストールしてある人にとっては) 配布物が最小になる
  • 標準の書き方 = C++ で書ける
  • 公式の最新をそのまま使える

短所

  • 利用者がOpenCVをインストールするか、配布物一式にOpenCVのDLLを同封する必要がある
  • ビルドの設定がちょっと複雑
  • デバッグが面倒

3. OpenCVの staticlib を必要な分だけ取り込んだ Native Plugin を作る

長所

  • OpenCVのDLLを使う必要が無いことまで加味すると、Native Plugin の容量が最小になる
  • そのため、おそらく起動も速い
  • 標準の書き方 = C++ で書ける
  • 公式の最新をそのまま使える

短所

どう使うか?

こう考えました。

  • OpenCV のたくさんあるリファレンスなどを生かせるので、標準の書き方(C++)にしておきたい
  • いろいろ取り込んでアプリが肥大化するのはかっこよくない

短所については

  • ビルドの複雑さは慣れでカバー

というわけで、 3. staticlib を使ってDLLを作る が良いと考えました。

デバッグが面倒、という件も

  • 一応前回の記事でクリアできたと思っている
  • そもそもDLLにする主旨は、役割の分担を明確にし極力疎結合にすることです。データの受け渡しなど界面をしっかりと設計し、OpenCVで行う画像処理などは C++ 単体でテストしておいて、使えることを確認した後Unityで使うようにすべきでしょう。つまりデバッグは普通にC++で完結して行う。

という感じの進め方で良いと思っています。

(前回の記事)