OpenCV
OpenCVDay 10

OpenCVのNuGetパッケージまとめ(2017年版)

More than 1 year has passed since last update.

はじめに

  • この記事はOpenCV Advent Calendar 2017の10日目の記事です.
  • 他の記事は目次にまとめられています.
  • この記事は現在公開されているOpenCVのNuGetパッケージの調査結果になります.どのNuGetパッケージを使うかを選択する際に参考になりましたら幸いです.
    • Windows環境じゃない人ごめんなさい
    • ソースからビルド派,インストーラ派の人ごめんなさい

NuGetとは

NuGetとは,.NET Framework対応のパッケージ管理システムです.また,Visual Studio 2012以降から標準でNuGetがインストールされているため,ユーザーはNuGetそのものを追加でインストールすることなくNuGetを利用できます.

NuGetパッケージ一覧

NuGetのパッケージ検索でOpenCVパッケージを探したところ,執筆時点(2017/12/9)では以下のOpenCVパッケージが公開されているようです.NuGetパッケージのインストール方法についてはOpenCVの環境構築(OpenCV 3.0/3.1)を参照ください.

ID NuGetパッケージ名
[1] opencv3
[2] opencv3.1
[3] opencv.win.native
[4] opencv.win.native.static
[5] opencvdefault
[6] opencvcontrib
[7] OpenCV31-vc12-x64
[8] opencvcuda-release

検証環境

本記事の検証は以下の環境で実施しました.

項目 内容
CPU Intel Core i7-6700HQ 2.60GHz
メモリ 64GB
GPU NVIDIA GeForce GTX 1060 / 6GB
OS Windows 10 Pro 64bit
Visual Studioバージョン Visual Studio 2013, Visual Studio 2015
CUDA CUDA 9.0

各NuGetパッケージの紹介

ここでは前述のNuGetパッケージに関する特徴をまとめます.

[1] opencv3

項目 内容
URL https://www.nuget.org/packages/opencv3/
OpenCVバージョン 3.0.0
Visual Studioバージョン VS2013
プラットフォーム x86, x64
opencv_contribの有無
ビルド可否

cv::getBuildInformation()の出力結果はこちらを参照下さい.

[2] opencv3.1

項目 内容
URL https://www.nuget.org/packages/opencv3.1/
OpenCVバージョン 3.1.0
Visual Studioバージョン VS2013, VS2015
プラットフォーム x86, x64
opencv_contribの有無
ビルド可否

cv::getBuildInformation()の出力結果はこちらを参照下さい.

[3] opencv.win.native

項目 内容
URL https://www.nuget.org/packages/opencv.win.native/
OpenCVバージョン 3.1.0
Visual Studioバージョン VS2015
プラットフォーム x86, x64
opencv_contribの有無
ビルド可否

cv::getBuildInformation()の出力結果はこちらを参照下さい.
また,今回は未検証ですが,OpenCV 3.2でVS2015/VS2017に対応したバージョンもあるようです.
https://www.nuget.org/packages/opencv.win.native/320.1.1-vs141

[4] opencv.win.native.static

項目 内容
URL https://www.nuget.org/packages/opencv.win.native.static/
OpenCVバージョン 3.1.0
Visual Studioバージョン VS2015
プラットフォーム x86, x64
opencv_contribの有無
ビルド可否

cv::getBuildInformation()の出力結果はこちらを参照下さい.

注意点

OpenCVや3rdpardyライブラリはstatic libraryのため、プロジェクト設定にて、ランタイムライブラリを/MD(デバッグビルドの場合は/MDd)に指定するとビルドエラーが起きるのでご注意ください.以下にリリースビルド時のエラーメッセージを抜粋します.

1>opencv_imgproc310.lib(imgwarp.obj) : error LNK2038: 'RuntimeLibrary' の不一致が検出されました。値 'MT_StaticRelease' が MD_DynamicRelease の値 'main.obj' と一致しません。
1>opencv_imgproc310.lib(opencv_imgproc_pch.obj) : error LNK2038: 'RuntimeLibrary' の不一致が検出されました。値 'MT_StaticRelease' が MD_DynamicRelease の値 'main.obj' と一致しません。

このNuGetパッケージを使用する場合,ランタイムライブラリを/MT(デバッグビルドの場合は/MTd)にする必要があります.

[5] opencvdefault

項目 内容
URL https://www.nuget.org/packages/opencvdefault/
OpenCVバージョン 3.1.0
Visual Studioバージョン VS2013, VS2015
プラットフォーム x86, x64
opencv_contribの有無
ビルド可否 〇(x64のみ)

cv::getBuildInformation()の出力結果はこちらを参照下さい.

注意点

VS2013, VS2015ともにパッケージ内にx86向けのライブラリが配置されているものの,x86向けでビルドした際にリンクエラーが起きます・・・.

1>main.obj : error LNK2001: 外部シンボル ""void __cdecl cv::imshow(class cv::String const &,class cv::_InputArray const &)" (?imshow@cv@@YAXABVString@1@ABV_InputArray@1@@Z)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""public: void __thiscall cv::Mat::deallocate(void)" (?deallocate@Mat@cv@@QAEXXZ)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""public: void __thiscall cv::Mat::create(int,int const *,int)" (?create@Mat@cv@@QAEXHPBHH@Z)" は未解決です。

[6] opencvcontrib

項目 内容
URL https://www.nuget.org/packages/opencvcontrib/
OpenCVバージョン 3.1.0
Visual Studioバージョン VS2015
プラットフォーム x86, x64
opencv_contribの有無
ビルド可否 〇(x64のみ)

cv::getBuildInformation()の出力結果はこちらを参照下さい.
このパッケージの大きな特徴(だと個人的に感じているの)はOpenGL supportとVTK supportが有効になっている点です.

  GUI: 
    QT:                          NO
    Win32 UI:                    YES
    OpenGL support:              YES (glu32 opengl32)
    VTK support:                 YES (ver 7.0.0)

注意点

パッケージ内にx86向けのライブラリが配置されているものの,x86向けでビルドした際にリンクエラーが起きます・・・.

1>main.obj : error LNK2001: 外部シンボル ""void __cdecl cv::imshow(class cv::String const &,class cv::_InputArray const &)" (?imshow@cv@@YAXABVString@1@ABV_InputArray@1@@Z)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""public: void __thiscall cv::Mat::deallocate(void)" (?deallocate@Mat@cv@@QAEXXZ)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""public: void __thiscall cv::Mat::create(int,int const *,int)" (?create@Mat@cv@@QAEXHPBHH@Z)" は未解決です。

[7] OpenCV31-vc12-x64

項目 内容
URL https://www.nuget.org/packages/OpenCV31-vc12-x64/
OpenCVバージョン 3.1.0
Visual Studioバージョン VS2013
プラットフォーム x64
opencv_contribの有無
ビルド可否 ×

私の環境ではビルドできませんでした・・・.NuGetパッケージをインストールすると通常インクルードパス、ライブラリパスなどは自動的に設定されるのですが,このパッケージではその設定がうまくできていないようです.

[8] opencvcuda-release

項目 内容
URL https://www.nuget.org/packages/opencvcuda-release/
OpenCVバージョン 3.1.0
Visual Studioバージョン VS2013
プラットフォーム x64
opencv_contribの有無
ビルド可否 ?

cudaモジュールが使える唯一のNuGetパッケージです.
ただし,CUDA 7.5に依存しているようで私の環境では動作確認できませんでした・・・.

NuGetパッケージの使い分け

(NuGetパッケージという選択肢の中で)できるだけ新しいOpenCVを使いたい

VS2017で使いたい

opencv_contribも使いたい

  • [1] opencv3
  • [6] opencvcontrib

vizモジュールを使いたい

  • [6] opencvcontrib 一択

cudaモジュールを使いたい

  • 残念ながらNuGetパッケージを使わない方がよいでしょう

おわりに

  • 明日はfukushima1981せんせーの記事で,タイトルは「世代別マイクロアーキテクチャごとのOpenCVベンチマーク大会」となっています.すごく楽しみで眠れなさそうです!!!

余談(その1)

OpenCV公式がNuGetパッケージ作ってくれるといいのに・・・と思っている人はやっぱりいるようでPlease produce current C++ NuGet package for OpenCV #9320というissueが既に作られています.このissueにある公式メンバのコメントは以下の通りです.

issue9320.png

コメントに出てくるVcpkgについてはUnaNancyOwenさんのVcpkgを使用してOpenCVを導入するという記事が参考になります.また,記事執筆時点ではNuGetの方が初心者に優しい気がしている(ボタンをポチポチするだけでインストールできる)ので,公式がNuGet版パッケージを出してくれるといいなーと個人的には思ったりしています.

余談(その2)

当初上記ツイートに書いたネタで記事を書く予定だった・・・のですが,自宅のJetson TX2が起動しなくなりまして,急遽ネタ変更になりました.このお蔵入りになったネタはこの本の続編(?)などで公開出来たらいいなーと思っています.