OpenCV 5.0.0
Open Source Computer Vision
読み込み中...
検索中...
見つかりません
🤖 AIによる機械翻訳(非公式) — これは OpenCV 5.0.0 公式リファレンス(英語)を AI (Claude) で自動翻訳したものです。訳に誤りを含む場合があります。正確な情報は 公式英語版(原文) を参照してください。
"Microsoft Visual Studio" でOpenCVを使うアプリケーションを作る

前のチュートリアル: Windows へのインストール
次のチュートリアル: Image Watch: Visual Studio デバッガでメモリ上の画像を表示する

原著者Bernát Gábor
互換性OpenCV >= 3.0
警告
このチュートリアルには古い情報が含まれている可能性がある。

ここで説明することはすべて、OpenCV の C\C++ インターフェースに適用される。まず、Windows へのインストール チュートリアルを読み、無事に完了していることを前提とする。したがって、先に進む前に、OpenCV のヘッダファイルとバイナリを含む OpenCV ディレクトリがあること、そして OpenCV 環境変数を設定してシステムパスに追加する で説明されているように環境変数を設定済みであることを確認すること。

当方が配布する OpenCV ライブラリは、Microsoft Windows オペレーティングシステム上ではダイナミックリンクライブラリ (DLL) として提供される。これらには、ライブラリのすべての内容が実行時に必要に応じてのみ読み込まれ、無数のプログラムが同じライブラリファイルを使用できるという利点がある。これは、OpenCV ライブラリを使用するアプリケーションが10個あっても、それぞれに個別のバージョンを用意する必要がないことを意味する。もちろん、アプリケーションを実行したいすべてのシステムに OpenCV の dll を用意する必要がある。

もう一つの方法は、lib 拡張子を持つ静的ライブラリを使用することである。これらは、Windows へのインストール チュートリアルで説明されているように、ソースファイルを使用してビルドできる。これを使用すると、ライブラリは exe ファイル内に組み込まれる。そのため、何らかの理由でユーザがそれらを削除してしまう可能性はない。欠点として、アプリケーションが大きくなり、起動時の読み込みに時間がかかるようになる。

OpenCV を使ってアプリケーションをビルドするには、2つのことを行う必要がある。

  • コンパイラに OpenCV ライブラリがどのような外観かを伝える。これはヘッダファイルを見せることで行う。
  • リンカに、必要なときに OpenCV の関数やデータ構造をどこから取得すればよいかを伝える

    lib システムを使用する場合は、ライブラリファイルがあるパスを設定し、そのうちどれを参照するかを指定する必要がある。ビルド中にリンカはこれらのライブラリを参照し、使用されるすべての関数やデータ構造の定義と実装を実行可能ファイルに追加する。

    DLL システムを使用する場合も、これらすべてを再び指定する必要があるが、今度は別の理由による。これは Microsoft OS 固有の事柄である。どうやらリンカは、実行時に DLL のどこでデータ構造や関数を探せばよいかを知る必要があるようだ。この情報は lib ファイル内に格納されている。とはいえ、これらは静的ライブラリではない。いわゆるインポートライブラリである。これが、Windows で DLL を作成すると lib 拡張子のライブラリも生成される理由である。良い点は、実行時には DLL のみが必要となることである。

これらすべての情報を Visual Studio IDE に渡すには、グローバルに(今後のすべてのプロジェクトがこの情報を取得するように)行うか、ローカルに(現在のプロジェクトのみに対して)行うかのいずれかを選択できる。グローバルの利点は、一度だけ行えばよいことである。ただし、すべてのプロジェクトに常にこの情報をまとめてしまうのは望ましくない場合もある。グローバルの場合、その方法は使用する Microsoft Visual Studio によって異なる。2008 およびそれ以前のバージョンのやり方と 2010 のやり方がある。このチュートリアルのグローバルのセクションで、主な違いを示す。

Visual Studio におけるプロジェクトの基本項目はソリューションである。1つのソリューションには複数のプロジェクトを含めることができる。プロジェクトはアプリケーションの構成要素である。各プロジェクトは何かを実現し、これらのプロジェクトパズルを組み合わせるメインプロジェクトを持つことになる。多くの単純なアプリケーション(多くのチュートリアルがそうであるように)の場合、アプリケーションをモジュールに分割する必要はない。これらの場合、メインプロジェクトが唯一存在するものとなる。では、File –> New –> Project のメニュー選択を進めて Visual Studio 内で新しいソリューションを作成しよう。種類として Win32 Console Application を選択する。名前を入力し、作成するパスを選択する。次に表示されるダイアログで、必ず空のプロジェクトを作成すること。

ローカルな手法

各プロジェクトは互いに独立してビルドされる。このため、プロジェクトごとに独自のルールパッケージを持つ。このルールパッケージの中には、IDEがプロジェクトをビルドするために知っておく必要があるすべての情報が格納されている。どのアプリケーションにも少なくとも2つのビルドモードがある。ReleaseDebugである。Debugには、アプリケーション内のバグをより簡単に見つけて解決できるようにするための多くの機能が含まれている。これに対してReleaseは最適化されたバージョンであり、アプリケーションを可能な限り高速に動作させること、あるいは可能な限り小さくすることが目標となる。お気づきのとおり、これらのモードはビルド時に使用するルールも異なる。したがって、ビルドモードごとに異なるルールパッケージが存在する。これらのルールパッケージはIDE内でプロジェクトプロパティと呼ばれ、プロパティマネージャを使って表示・変更できる。これは [表示] –> [プロパティページ] で開ける(Visual Studio 2013以降では [表示] –> [その他のウィンドウ] –> [プロパティマネージャ] へ進む)。これを展開すると、既存のルールパッケージ(プロパティシートと呼ばれる)が確認できる。

これらの本当に便利な点は、ルールパッケージを一度作成しておけば、後から新しいプロジェクトに追加するだけで済むことである。一度作って後で再利用する。ここでは、コンパイラとリンカが知っておく必要があるすべてのルールを含む新しいプロパティシートを作成する。もちろん、DebugビルドとReleaseビルド用に別々のものが必要になる。下の画像のようにDebug用から始める。

例としてOpenCV_Debugという名前を使う。次にシートを選択して右クリック –> [プロパティ] を選ぶ。以下では、OpenCVのルールをローカルに設定する方法を示す。使用しないカスタムルールでプロジェクトを汚染するのは不要だと考えるためである。C++グループの [全般] エントリへ進み、「追加のインクルードディレクトリ」にOpenCVのincludeへのパスを追加する。「C/C++」グループがない場合は、任意の.c/.cppファイルをプロジェクトに追加する必要がある。

$(OPENCV_DIR)\..\..\include

サードパーティライブラリの設定を追加する際は、環境変数の力を活用するのが一般的によい考えである。OpenCVライブラリの完全な場所はシステムごとに異なる可能性がある。さらに、何らかの理由で自分自身がインストールディレクトリを移動することさえあるかもしれない。プロパティシート内に明示的なパスを記述すると、OpenCVのインストールパスが異なる別の人にそれを渡したとき、プロジェクトが動作しなくなってしまう。さらに、これを修正するにはすべての明示的なパスを手作業で変更する必要がある。よりエレガントな解決策は環境変数を使うことである。ドル記号で始まる括弧の中に記述したものは、実行時に現在の環境変数の値に置き換えられる。ここで、前回のチュートリアルOpenCV環境変数を設定し、システムパスに追加するですでに行った環境変数の設定が活きてくる。

次に [リンカー] –> [全般] へ進み、「追加のライブラリディレクトリ」にlibsディレクトリを追加する。

$(OPENCV_DIR)\lib

続いて、リンカが参照すべきライブラリを指定する必要がある。これを行うには [リンカー] –> [入力] へ進み、「追加の依存ファイル」エントリに使用したいすべてのモジュールの名前を追加する。

ライブラリの名前は次のとおりである。

opencv_(The Name of the module)(The version Number of the library you use)d.lib

最新バージョンの完全な一覧には次のものが含まれる。

opencv_calib3d300d.lib
opencv_core300d.lib
opencv_features2d300d.lib
opencv_flann300d.lib
opencv_highgui300d.lib
opencv_imgcodecs300d.lib
opencv_imgproc300d.lib
opencv_ml300d.lib
opencv_objdetect300d.lib
opencv_photo300d.lib
opencv_shape300d.lib
opencv_stitching300d.lib
opencv_superres300d.lib
opencv_ts300d.lib
opencv_video300d.lib
opencv_videoio300d.lib
opencv_videostab300d.lib

あるいは、ダウンロードしたOpenCVが1つの大きな.libファイルにビルドされている場合もある。OpenCV\build\architecture\vc14\lib を見て確認すること。この場合、バージョン3.3.0で追加するのは次のものだけである。

opencv_world330.lib

末尾の文字dは、これらがdebug用に必要なライブラリであることを示しているにすぎない。ここで [OK] をクリックして保存し、Releaseルールセクション内の新しいプロパティに対しても同じ操作を行う。ライブラリ名からdの文字を省くこと、そしてプロパティシートを上部の保存アイコンで保存することを忘れないように。

プロパティシートはプロジェクトディレクトリ内で見つけられる。この時点で、それらを何か特別なディレクトリにバックアップしておくのは賢明な判断である。そうすれば、今後OpenCVプロジェクトを作成するときにいつでも手元に置いておける。Visual Studio 2010ではファイル拡張子はpropsであり、2008ではvspropsである点に注意すること。

次回新しいOpenCVプロジェクトを作るときは、プロパティマネージャ内の「既存のプロパティシートの追加...」メニューエントリを使うだけで、OpenCVのビルドルールを簡単に追加できる。

グローバルな手法

すべてのプロジェクトにプロパティページを追加するのが面倒すぎる場合は、これらのルールを「グローバルプロパティページ」に追加することもできる。ただし、これは追加のインクルードディレクトリとライブラリディレクトリにのみ適用される。使用するライブラリの名前は、たとえばプロパティページを使って、依然として手動で指定する必要がある。

Visual Studio 2008では、これは [ツール] –> [オプション] –> [プロジェクトおよびソリューション] –> [VC++ ディレクトリ] の下にある。

Visual Studio 2010では、これは作成するすべてのプロジェクトに自動的に追加されるグローバルプロパティシートに移された。

手順はローカルの方法で説明したものと同じである。環境変数OPENCV_DIRを使ってインクルードディレクトリを追加するだけである。

試してみよう!

では実際に試すために、簡単なテスト用ソースコードをダウンロードするか、OpenCV ソースのサンプルコードフォルダから取得しよう。これをプロジェクトに追加してビルドする。内容は次のとおり。

#include <opencv2/core.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main( int argc, char** argv )
{
if( argc != 2)
{
cout <<" Usage: " << argv[0] << " ImageToLoadAndDisplay" << endl;
return -1;
}
Mat image;
image = imread(argv[1], IMREAD_COLOR); // Read the file
if( image.empty() ) // Check for invalid input
{
cout << "Could not open or find the image" << std::endl ;
return -1;
}
namedWindow( "Display window", WINDOW_AUTOSIZE ); // Create a window for display.
imshow( "Display window", image ); // Show our image inside it.
waitKey(0); // Wait for a keystroke in the window
return 0;
}
Comma-separated Matrix Initializer.
Definition mat.hpp:964
bool empty() const
Returns true if the array has no elements.
int main(int argc, char *argv[])
Definition highgui_qt.cpp:3
Definition core.hpp:107
STL namespace.

Visual Studioのビルドは2か所から開始できる。IDEの内部から(キーの組み合わせ: Control-F5)か、ビルドディレクトリへ移動してアプリケーションをダブルクリックで起動するかである。注意すべき点は、この2つが同じではないことである。IDEから起動した場合、カレントワーキングディレクトリはプロジェクトディレクトリになるが、そうでない場合はアプリケーションファイルが現在ある場所のフォルダ(つまり通常はビルドディレクトリ)になる。さらに、IDEから起動した場合、コンソールウィンドウは終了しても閉じない。ユーザーのキー入力を待つ。

これはコード内でファイルを開いたり保存したりするコマンドを書くときに覚えておくべき重要な点である。リソースは作業ディレクトリ(working directory)を基準に保存される(そして開くときにもそこから探される!!!)。ただしI/O関数の引数として完全で明示的なパスを指定した場合はこの限りではない。上記のコードではこのOpenCVロゴを開いている。アプリケーションを起動する前に、画像ファイルを現在の作業ディレクトリに置いておくこと。コード内の画像ファイル名を変更すれば、他の画像でも試せる。実行すれば、ほら、このとおり。

Visual Studio でのコマンドライン引数

今後のいくつかのチュートリアルでは、プログラムの主な入力方法が実行時引数を与えることであるのがわかるだろう。これを行うには、コマンドウィンドウを起動し(スタートメニューで cmd + Enter)、実行ファイルへ移動して引数を付けて起動するだけでよい。たとえば上記の私のプロジェクトの場合、次のようになる。

D:
CD OpenCV\MySolutionName\Release
MySolutionName.exe exampleImage.jpg

ここではまずドライブを変更し(プロジェクトがOSのローカルドライブにない場合)、プロジェクトへ移動して、例として画像引数を付けて起動している。Linuxシステムではコンソールウィンドウをいじり回すのが一般的だが、Microsoft Windowsでは多くの人がほとんど使わない。加えて、アプリケーションをテストしている間、同じ引数を何度も何度も追加するのは、いくぶん面倒な作業である。幸い、Visual Studioにはこれらすべてを自動化するメニューがある。

ここで入力の名前を指定すれば、Visual Studio環境からアプリケーションを起動するときに自動的に引数が渡される。次の入門チュートリアルでは、上記のソースコードについて詳しい説明が見られる。画像を扱う最初の一歩