OpenCVのポータブル化 (C++)


更新履歴

はじめに

  • モチベーション:OpenCVを利用するアプリケーション開発において、リポジトリからコードを落としてからビルド環境を揃えるまでの手動操作を可能な限り省きたい
    • 単純に手間を減らしたい
    • 開発者間での操作ミスによる開発環境不一致を避けたい
      • OpenCVのバージョン違う。。など
  • 上記目的のために、OpenCVをビルドするために必要なアイテムをリポジトリに含め、そこを参照してビルドするためのプロジェクト設定を行います。

環境

OpenCVの入手

VSのプロジェクトを作成

  • 「新しいプロジェクトの作成」→「コンソールアプリ」
  • ダウンロードしてきた下記のOpenCVファイルを全て、作成したプロジェクトの配下にコピーします。
    • opencv/include配下の全ファイル
    • opencv/x64/vc15/bin/opencv_world420.dll
    • opencv/x64/vc15/lib/opencv_wrold420.lib
  • 例として、プロジェクト名をOpenCvSampleConsoleとすると下記のフォルダ・ファイル構成になります。
    • ※opencv/include配下の構成は省略
│ OpenCvSampleConsole.sln
│
└─OpenCvSampleConsole
    │  OpenCvSampleConsole.cpp
    │  OpenCvSampleConsole.vcxproj
    │  OpenCvSampleConsole.vcxproj.filters
    │  OpenCvSampleConsole.vcxproj.user
    │
    └─opencv
        ├─bin
        │      opencv_world420.dll
        │      opencv_world420d.dll
        │
        ├─include
        │  └─opencv2
        │
        └─lib
                opencv_world420.lib
                opencv_world420d.lib
  • プロジェクトのプラットフォームはx64にする

  • プロジェクトにincludeパスを通す

    • プロジェクトのプロパティ → 構成プロパティ → C/C++ → 全般 → 「追加のインクルードディレクトリ」に追加
      • opencv\include
      • 構成は、「Debug」と「Release」の両方に対して設定しておくこと
      • プラットフォームは、念のため「すべてのプロットフォーム」に対して設定すること
  • プロジェクトにライブラリパスを通す

    • プロジェクトのプロパティ → 構成プロパティ → リンカー → 全般 → 「追加のライブラリディレクトリ」に追加
      • opencv\lib
      • 構成は、「Debug」と「Release」の両方に対して設定しておくこと
      • プラットフォームは、念のため「すべてのプロットフォーム」に対して設定すること
  • libファイルを追加する

    • プロジェクトのプロパティ → 構成プロパティ → リンカー → 入力 → 「追加の依存ファイル」に追加
      • Debugの場合:opencv_world420d.lib
      • Releaseの場合:opencv_world420.lib
      • プラットフォームは、念のため「すべてのプロットフォーム」に対して設定すること
  • ビルド後にdllコピーをコピーする

    • プロジェクトのプロパティ → 構成プロパティ → ビルドイベント → ビルド後のイベント → 「コマンドライン」に追加
      • Debugの場合:copy "$(ProjectDir)opencv\bin\opencv_world420d.dll" "$(TargetDir)"
      • Releaseの場合:copy "$(ProjectDir)opencv\bin\opencv_world420.dll" "$(TargetDir)"`
      • 「プラットフォーム」は、念のため「すべてのプロットフォーム」に対して設定すること
      • [@kazuki_nagasawa さんからの情報] $(ProjectDir)$(TargetDir)にスペースが含まれていても大丈夫なようにダブルクオーテーションで囲んで置くことが重要
  • HelloWorldを実行

#include "opencv2/opencv.hpp"

int main()
{
    cv::Mat outImage = cv::Mat::zeros(150, 300, CV_8UC3);
    cv::putText(outImage, "Hello World!!!", cv::Point(10, 70), cv::FONT_HERSHEY_SIMPLEX, 1,  cv::Scalar(255, 255, 255));
    cv::imshow("example", outImage);
    cv::waitKey(0);
}