C++/CLIって何?

よく、お使いの言語は何ですか?と尋ねると

 

『Visual C++』

 

です。
という答えが返ってくるのですが、このC++/CLIの登場によって、Visual C++が差すものが何なのか?ますます分からなくなってきました。

 

現在、Visual StudioでC++言語が扱えるのは

  • MFC(Microsoft Foundation Class)
  • SDK(Software Development Kit)
  • C++/CLI

の3つでしょうか?

 

C++/CLIはこれらの良いとこ取りをしたような言語で、GUI部分はVB6.0のようなフォームエディタで作成し、ボタンをダブルクリックする事でイベント処理を追加していきます。
また、従来のWin32 APIも使えるし、MFCのクラスも使えるし、最近主流になってきているVB.NETやC#などが使っている.NET Frameworkも使う事が可能です。

 

また、C#などでは基本的に使えないポインタもそのまま使う事が可能です。

 

もし、これまで、GUIはVB6.0で作って、処理部分はWin32APIや自作のライブラリを作って来たような人にとっては、比較的とっつき易いと思います。

 

ただ、あまりにゴチャゴチャに開発ができるようにしてしまったせいか、最新のVisual Studio 2010ではIntellisenseが使えないなど、ここ最近は、いまいちMicrosoftのやる気が感じられません。

 

という事で、これから先が不透明感のある感じなのですが、これまで作成してきたC++の資産を生かしつつ簡単なGUI周りを作成したい方にはオススメです。
ただし、多少凝ったソフトになると、フォーム間の参照や64bitの対応など、他のVB.NETやC#と比べてかなり面倒なので、評価用のサンプルを作る程度に留めておいた方が無難です。

 

もし、新規にプログラムを始めたい方にはC#の方が良いと思います。
C#もC++/CLIも.NET Frameworkを使うプログラムなので、基本的には同じような物と言いつつも、少しずつC#の方が優遇されているような気がします。

 

なので、C++/CLIで従来のC++のライブラリを使ったクラスライブラリを作成し、画面周りなどのアプリケーションよりな部分はC#で作る!というのが私なりの現在の結論なのですが、C++/CLIの情報は非常に少ないので、記事にまとめていこうと思います。

 

【追記】

結局、C++/CLIを使うのは辞めました。

フォーム間参照が面倒だし、/MT(d)が指定できないし、Any CPUがないし・・・

AnyCPUが無いと、OSが64bitであっても32bitで動いているVisual Studioでは、フォームエディタにカスタムコントロールを配置しようとすると、64bitにコントロールを対応させようとすると、AnyCPUでないと都合が悪いんですよね。

 

という事で、フォーム周りはC#で作る方がおすすめです。

フリーで使えるVisual Studio Expressの入手

2012年10月現在、最新版はVisual Studio 2012となりました。

VS2012 Expressについては、下記、記事にまとめました。

Visual Studio 2012 Expressが公開されました

 

以下は、旧版の内容です。

———————————————————

VB.NET、C#、C++/CLIをこれから始めようとしている方は、まずは無料で使えるVisual Studio Expressを試すのがオススメです。
このVisual Studio Expressは、プログラム初心者や学生向けという位置づけですが、そこそこの事ができます。

 

入手先はこちら

 

http://www.microsoft.com/japan/msdn/vstudio/express/

 

旧版のVisual Studio 2008 Express Editionもこちらから入手可能です。

 

http://www.microsoft.com/japan/msdn/vstudio/2008/product/express/

 

Visual Studio 2010のC++/CLIではIntellisense(携帯で言うところの予測入力みたいなもの)が使えないので、C++/CLIをやりたい場合は、VS2008の方がいいと思います。

 

 

このExpressでは何ができないか?というと、細かい事はVisual Studio 2005の場合ですが、

 

@IT
http://www.atmarkit.co.jp/fdotnet/special/vs2005compare/vs2005compare_01.html

 

に任せるとして、私がExpressで不便に感じたのは

 

  • C++/CLIのExpressにはリソースエディタが無い
    →バージョン管理ができない、SDKのウィンドウが作れない。
  • ユーザーコントロールが作れない
  • マクロ機能が無い
  • ソリューションが多言語をまたげない
    →VB.NETやC#の混在が出来ない。

 

などなど。

 

と、言いながらもちょっとしたアプリケーションを作るだけなら、かなりの事が出来るので、まずはこのExpressから初めてみては如何でしょうか?

 

Visual Studioへ戻る

【OpenCV2.2】新規プロジェクトの作成方法(C言語版)

OpenCVのサンプルプログラムはHPを検索すればいくらでも転がっていますが、最初の頃はこれを、どのように使えば良いのか?私にはよく分かりませんでした。

 

という事で、OpenCV2.2およびVisual Studio2010 Express を使って、サンプルプログラムを作成する方法を紹介します。

 

何はともあれ、サンプルプログラムはこちらです。

opencv22sample.zip

 

新規プロジェクトの作成方法

Visual Studio を起動し、新しいプロジェクトをクリックします。

 

 

開いたウィンドウのWin32コンソールアプリケーションを選択し、任意の名前および場所を指定します。

 

 

OKボタンをクリックし、次へをクリックします。

 

 

さらに表示されたウィンドウの完了をクリックします。

 

 

すると、空の状態のソースコードが作成されます。

 

 

OpenCV.jpのサンプルとは、mainの部分がちょっと異なりますが、気にせず、そのままにしておいて下さい。

 

次にOpenCV2.2の入手、ダウンロード、インストール、環境設定の最後の部分でも紹介していますが、ヘッダファイルをプログラムから参照できるように、OpenCVのヘッダファイルのディレクトリを指定します。

 

 

プロジェクトのプロパティで構成プロパティ→C/C++→全般の追加のインクルードディレクトリ

C:\OpenCV2.2\include

を指定します。

 

あとは、作成したcppファイル(上記の例ではOpenCV2.2Sample.cpp)にプログラムをしていけばOKです。

 

以下、画像を開き、ガウシアンフィルタ処理を行い、処理前、処理後の画像を表示するだけの簡単なサンプルプログラムを示します。

// OpenCV2.2Sample.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"

//プロジェクトのプロパティ⇒C/C++⇒全般 の追加のインクルードディレクトリに
// 『C:\OpenCV2.2\include』を追加のこと
#include "opencv2\\opencv.hpp"

#ifdef _DEBUG
    //Debugモードの場合
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_core220d.lib")
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_imgproc220d.lib")
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_highgui220d.lib")
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_objdetect220d.lib")
    //以下、必要に応じて追加
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_ml220d.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_features2d220d.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_video220d.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_calib3d220d.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_flann220d.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_contrib220d.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_legacy220d.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_gpu220d.lib")
#else
    //Releaseモードの場合
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_core220.lib")
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_imgproc220.lib")
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_highgui220.lib")
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_objdetect220.lib")
    //以下、必要に応じて追加
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_ml220.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_features2d220.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_video220.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_calib3d220.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_flann220.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_contrib220.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_legacy220.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_gpu220.lib")
#endif

int _tmain(int argc, _TCHAR* argv[])
{
    //画像データの読込
    IplImage* src_img = cvLoadImage("C:\\OpenCV2.2\\samples\\c\\lena.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
    if (src_img == NULL){
        return 0;
    }

    //表示ウィンドウの作成
    cvNamedWindow("src");
    cvNamedWindow("dst");

    //処理後画像データの確保
    IplImage* dst_img = cvCreateImage(cvGetSize(src_img), src_img->depth, src_img->nChannels);

    //画像処理例(ガウシアンフィルタ)
    cvSmooth(src_img, dst_img, CV_GAUSSIAN, 9);

    //画像の表示
    cvShowImage ("src", src_img);
    cvShowImage ("dst", dst_img);

    //キー入力待ち
    cvWaitKey (0);

    //全てのウィンドウの削除
    cvDestroyAllWindows();

    //画像データの解放
    cvReleaseImage(&src_img);
    cvReleaseImage(&dst_img);

    return 0;
}

OpenCVへ戻る

 

【OpenCV2.2】ライブラリ構成(*.lib,*.hなど)

OpenCV2.2からはライブラリの構成が再構築されています。
旧バージョンと、OpenCV2.2の構成の概略は以下の通りとなっています。

 

OpenCV2.2 旧バージョン ヘッダファイル ライブラリファイル 概要
opencv_core CXCORE core_c.h (C言語用)
core.hpp (C++用)
opencv_core220.lib
opencv_core220d.lib
メモリ確保/解放、行列、
演算、描画など
opencv_imgproc CV imgproc_c.h (C言語用)
imgproc.hpp (C++用)
opencv_imgproc220.lib
opencv_imgproc220d.lib
画像処理
一般的なフィルタ処理など
opencv_highgui HighGUI highgui_c.h (C言語用)
highgui.hpp (C++用)
opencv_highgui220.lib
opencv_highgui220d.lib
ウィンドウなどのGUI、
ファイル読込/保存、
ビデオファイル、カメラなど
opencv_ml ml ml.hpp opencv_ml220.lib
opencv_ml220d.lib
サポートベクタマシン、
ブースティングなどの
機械学習
opencv_features2d features2d.hpp opencv_features2d220.lib
opencv_features2d220d.lib
SURF、FASTなどの
特徴抽出
opencv_video background_segm.hpp opencv_video220.lib
opencv_video220d.lib
前景/背景分離
tracking.hpp トラッキング
opencv_objdetect objdetect.hpp opencv_objdetect220.lib
opencv_objdetect220d.lib
Haar、LBP、HOGなどの
オブジェクト検出器
opencv_calib3d calib3d.hpp opencv_calib3d220.lib
opencv_calib3d220d.lib
カメラキャリブレーション、
ステレオカメラなど
opencv_flann flann.hpp opencv_flann220.lib
opencv_flann220d.lib
高速最近傍処理(FLANN)
など
opencv_contrib contrib.hpp opencv_contrib220.lib
opencv_contrib220d.lib
肌検出、MeanShiftなど
完全な状態ではない
opencv_legacy legacy.hpp opencv_legacy220.lib
opencv_legacy220d.lib
旧関数との互換用
opencv_gpu gpu.hpp opencv_gpu220.lib
opencv_gpu220d.lib
GPU(CUDA)による行列演算、
画像処理など。(β版の扱い)

 

ライブラリファイル(*.lib)はReleaseモードの場合、『d』のつかないlibファイルを、Debugモードの場合、『d』の付いたlibファイルを、参照設定して下さい。

 

ヘッダファイルはopencv.hppにまとめてインクルードされているので、このファイル(opencv.hpp)一つをインクルードすると、すべてインクルードされます。

 

また、OpenCV-2.2.0-win32-vs2010.exeを使ってデフォルト状態でOpenCV2.2をインストールした時の主なファイルのフォルダ構成は以下の通りです。

 

C:\OpenCV2.2
┣ bin
┃  ┣ opencv_core220.dll
┃  ┣ opencv_core220d.dll
┃  ┣ opencv_imgproc220.dll
┃  ┣ opencv_imgproc220d.dll
┃  ┣ opencv_highgui220.dll
┃  ┣ opencv_highgui220d.dll
┃  ┣ opencv_ml220.dll
┃  ┣ opencv_ml220d.dll
┃  ┣ opencv_features2d220.dll
┃  ┣ opencv_features2d220d.dll
┃  ┣ opencv_video220.dll
┃  ┣ opencv_video220d.dll
┃  ┣ opencv_objdetect220.dll
┃  ┣ opencv_objdetect220d.dll
┃  ┣ opencv_calib3d220.dll
┃  ┣ opencv_calib3d220d.dll
┃  ┣ opencv_flann220.dll
┃  ┣ opencv_flann220d.dll
┃  ┣ opencv_contrib220.dll
┃  ┣ opencv_contrib220d.dll
┃  ┣ opencv_legacy220.dll
┃  ┣ opencv_legacy220d.dll
┃  ┣ opencv_gpu220.dll
┃  ┗ opencv_gpu220d.dll
┣ include
┃  ┣ opencv
┃  ┃ ┣ cv.h
┃  ┃ ┣ cv.hpp
┃  ┃ ┣ cxcore.h
┃  ┃ ┣ cxcore.hpp
┃  ┃ ┣ highgui.h
┃  ┃ ┗ ml.h
┃  ┣ opencv2
┃  ┃ ┣ opencv.hpp
┃  ┃ ┣ core
┃  ┃  ┃ ┣ core_c.h
┃  ┃  ┃ ┗ core.hpp
┃  ┃ ┣ imgproc
┃  ┃  ┃ ┣ imgproc_c.h
┃  ┃  ┃ ┗ imgproc.hpp
┃  ┃ ┣ highgui
┃  ┃  ┃ ┣ highgui_c.h
┃  ┃  ┃ ┗ highgui.hpp
┃  ┃ ┣ ml
┃  ┃  ┃ ┗ ml.hpp
┃  ┃ ┣ features2d
┃  ┃  ┃ ┗ features2d.hpp
┃  ┃ ┣ video
┃  ┃  ┃ ┣ background_segm.hpp
┃  ┃  ┃ ┗ tracking.hpp
┃  ┃ ┣ objdetect
┃  ┃  ┃ ┗ objdetect.hpp
┃  ┃ ┣ calib3d
┃  ┃  ┃ ┗ calib3d.hpp
┃  ┃ ┣ flann
┃  ┃  ┃ ┗ flann.hpp
┃  ┃ ┣ contrib
┃  ┃  ┃ ┗ contrib.hpp
┃  ┃ ┣ legacy
┃  ┃  ┃ ┗ legacy.hpp
┃  ┃ ┗ gpu
┃  ┃      ┗ gpu.hpp
┗ lib
┣ opencv_core220.lib
┣ opencv_core220d.lib
┣ opencv_imgproc220.lib
┣ opencv_imgproc220d.lib
┣ opencv_highgui220.lib
┣ opencv_highgui220d.lib
┣ opencv_ml220.lib
┣ opencv_ml220d.lib
┣ opencv_features2d220.lib
┣ opencv_features2d220d.lib
┣ opencv_video220.lib
┣ opencv_video220d.lib
┣ opencv_objdetect220.lib
┣ opencv_objdetect220d.lib
┣ opencv_calib3d220.lib
┣ opencv_calib3d220d.lib
┣ opencv_flann220.lib
┣ opencv_flann220d.lib
┣ opencv_contrib220.lib
┣ opencv_contrib220d.lib
┣ opencv_legacy220.lib
┣ opencv_legacy220d.lib
┣ opencv_gpu220.lib
┗ opencv_gpu220d.lib

 

C:\OpenCV2.2\include\opencv内のcv.hなどのファイルは使用可能ですが、
C:\OpenCV2.2\include\opencv2内のimgproc.hppなどを使うのを推奨とされています。

 

OpenCVへ戻る

 

OpenCV2.2の入手、ダウンロード、インストール、環境設定

OpenCVはsourceforgeにて公開されています。

http://sourceforge.net/projects/opencvlibrary/

公開される内容はOpenCVのバージョンにより異なるのですが、最近のバージョンではライブラリをコンパイル済みのセットアップファイル(*.exe)、および、ソースコードを含み、自分でコンパイルする必要のあるファイル一式(*.zip)の2通りのファイルが公開されています。

自分でコンパイルする場合は、IPP(Intel Integrated Performance Primitives)やTBB(Intel Threading Building Blocks)などにも対応させるなど、細かい設定ができるのですが、CMakeというソフトを使い開発環境に合わせたプロジェクトを作成し、コンパイルするため、少々複雑になります。

そのため、今回は比較的簡単なコンパイル済みのセットアップファイルを使ったインストール方法を紹介します。

 

OpenCV2.2の入手

OpenCV2.2は先程も書いた通りsourceforgeよりダウンロードします。

(入手HP)

http://sourceforge.net/projects/opencvlibrary/

 

このページのDownlaodと書かれた緑色のボタンをクリックして、ファイル(OpenCV-2.2.0-win32-vs2010.exe)をダウンロードします。

 

ファイル名を見ても分かるように、このファイルはWindows 32bit版のVisual Studio 2010用にコンパイルされたファイルなのですが、64bit版のOS環境下でも32bitで動作します。
また、VS2010以外でも、Microsoft Visual C++ 2010 再頒布可能パッケージをインストールすることで、旧バージョンのVisual Studioでも開発する事が可能です。

 

OpenCV2.2のインストール方法

ダウンロードしたファイル(OpenCV-2.2.0-win32-vs2010.exe)をダブルクリックしてOpenCV2.2のインストールを開始します。

 

 

上図のような画面が表示されるので、『次へ』をクリックします。

 

 

表示されたライセンス契約(いわゆるBSDライセンス)をご確認のうえ、『同意する』をクリック

 

 

Add OpenCV to the system PATH for all users
もしくは
Add OpenCV to the system PATH for current users

 

を選択して『次へ』をクリック (デフォルト設定とは異なるので注意!

 

 

インストール先を選択し、『次へ』をクリック
(今度の説明などで、このデフォルト設定を基本として説明しますので、特に変更の必要が無い場合はデフォルトのまま設定して下さい。)

 

 

スタートメニューフォルダの設定が表示されますが、このまま『次へ』をクリック

 

 

セットアップする内容も、このまま『次へ』をクリック

 

 

上図が表示されたら、『完了』をクリックして、インストールは完了です。

 

インストール出来たか?確認のため、スタートメニューの全てのプログラム→OpenCV2.2.0→C Samples 内の実行ファイル(例えば、morphology.exeなど)が実行できるかどうか確認してみて下さい。
(ここで、実行できない場合はPATHの設定がされていない可能性があります。)

 

ライブラリファイル(*.lib)とヘッダファイル(*.h)の設定

ライブラリファイル(*.lib)とヘッダファイル(*.h)の設定方法は、好みの分かれるところなので、設定方法は各個人によって異なると思いますが、私の場合は以下のようにしています。

 

OpenCV2.2の場合は、ヘッダファイルから別のヘッダファイルがインクルードされるので、プロジェクトの設定で『追加のインクルードディレクトリ』の設定は必須のようです。

 

設定方法は、Visual Studioのメニューのプロジェクト→プロパティでプロパティページを開きます。

 

構成プロパティ→C/C++→全般の追加のインクルードディレクトリに、OpenCV2.2のincludeディレクトリを指定します。
デフォルトでインストールした場合は
C:\OpenCV2.2\include
を指定します。

 

あとはソースコード中に以下のように記載します。
(プロジェクトのプロパティの構成プロパティ→リンカー→入力で設定しても構いません。)

//プロジェクトのプロパティ⇒C/C++⇒全般 の追加のインクルードディレクトリに
// 『C:\OpenCV2.2\include』を追加のこと
#include "opencv2\\opencv.hpp"

#ifdef _DEBUG
//Debugモードの場合
#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_core220d.lib")            // opencv_core
#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_imgproc220d.lib")        // opencv_imgproc
#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_highgui220d.lib")        // opencv_highgui
#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_objdetect220d.lib")    // opencv_objdetect
//以下、必要に応じて追加
//#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_ml220d.lib")            // opencv_ml
//#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_features2d220d.lib")    // opencv_features2d
//#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_video220d.lib")        // opencv_video
//#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_calib3d220d.lib")        // opencv_calib3d
//#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_flann220d.lib")        // opencv_flann
//#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_contrib220d.lib")        // opencv_contrib
//#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_legacy220d.lib")        // opencv_legacy
//#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_gpu220d.lib")            // opencv_gpu
#else
//Releaseモードの場合
#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_core220.lib")            // opencv_core
#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_imgproc220.lib")        // opencv_imgproc
#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_highgui220.lib")        // opencv_highgui
#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_objdetect220.lib")    // opencv_objdetect
//以下、必要に応じて追加
//#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_ml220.lib")            // opencv_ml
//#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_features2d220.lib")    // opencv_features2d
//#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_video220.lib")        // opencv_video
//#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_calib3d220.lib")        // opencv_calib3d
//#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_flann220.lib")        // opencv_flann
//#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_contrib220.lib")        // opencv_contrib
//#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_legacy220.lib")        // opencv_legacy
//#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_gpu220.lib")            // opencv_gpu
#endif

#pragmaをコメントアウトしている部分は書かなくても、ほぼ大丈夫ですし、コメントアウトしなくても大丈夫です。
ただ、opencv_ml、opencv_feature2dなどの関数を使う場合にはコメントアウトは外して下さい。

 

OpenCVへ戻る

 

【OpenCV】IplImage構造体

OpenCVの画像データの大きさやビット深度、画像データのポインタなどを管理しているのがIplImage構造体になります。
(OpenCV2.0からはcv:Matクラスというのも登場してきますが、ここではIplImageについて解説したいと思います。)
C言語のBITMAPINFO、.NETのBitmapクラスのようなものです。

 

OpenCVではこのIplImage構造体をOpenCVの各種関数の引数として渡します。

 

そこで、IplImage構造体の定義のヘッダファイル【cxtypes.h(OpenCV2.2ではtypes_c.h)】をのぞいてみると、

typedef struct _IplImage
{
    int  nSize;             /* sizeof(IplImage) */
    int  ID;                /* version (=0)*/
    int  nChannels;         /* Most of OpenCV functions support 1,2,3 or 4 channels */
    int  alphaChannel;      /* Ignored by OpenCV */
    int  depth;             /* Pixel depth in bits: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16S,
                               IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F are supported.  */
    char colorModel[4];     /* Ignored by OpenCV */
    char channelSeq[4];     /* ditto */
    int  dataOrder;         /* 0 - interleaved color channels, 1 - separate color channels.
                               cvCreateImage can only create interleaved images */
    int  origin;            /* 0 - top-left origin,
                               1 - bottom-left origin (Windows bitmaps style).  */
    int  align;             /* Alignment of image rows (4 or 8).
                               OpenCV ignores it and uses widthStep instead.    */
    int  width;             /* Image width in pixels.                           */
    int  height;            /* Image height in pixels.                          */
    struct _IplROI *roi;    /* Image ROI. If NULL, the whole image is selected. */
    struct _IplImage *maskROI;      /* Must be NULL. */
    void  *imageId;                 /* "           " */
    struct _IplTileInfo *tileInfo;  /* "           " */
    int  imageSize;         /* Image data size in bytes
                               (==image->height*image->widthStep
                               in case of interleaved data)*/
    char *imageData;        /* Pointer to aligned image data.         */
    int  widthStep;         /* Size of aligned image row in bytes.    */
    int  BorderMode[4];     /* Ignored by OpenCV.                     */
    int  BorderConst[4];    /* Ditto.                                 */
    char *imageDataOrigin;  /* Pointer to very origin of image data
                               (not necessarily aligned) -
                               needed for correct deallocation */
}
IplImage;

となっています。

 

基本的にcvCreateImageもしくはcvLoadImage関数でIplImage構造体のデータを確保するので、IplImageの全てを知らなくても、なんとかなるのですが、主なメンバ変数は以下のとおりです。

 

nSize IplImage構造体のサイズ
nChannels チャンネル数 1,2,3,4のどれか
depth 1画素あたりのビット数
実質使えるのはIPL_DEPTH_8U(符号なし8ビット)と一部でIPL_DEPTH_16S(符号付き16ビット)ぐらい。
24ビットカラー(R,G,B各8ビット)の場合、8ビット、3チャンネル
nChannels = 3、depth = IPL_DEPTH_8U
とする。
origin 画像データの原点(基準)
0:左上原点(デフォルト)
1:左下原点
originはcvShowImageやcvSobelなどの画像の上下の向きが必要な場合に用いられます。
注)originの値を変えても画像データの並びは変わりません。
width 画像の幅(画素数)
height 画像の高さ(画素数)
imageSize 画像データのサイズ(バイト数) (= widthStep * height
imageData 画像データへのポインタ
widthStep 画像データの幅のバイト数(画素数ではありません。
ビットマップ(*.bmp)データと同様に4バイト単位に調整されています。

 

【補足説明】

  • nChannels
    OpenCVではチャンネルという概念が登場しますが、これは1画素をいくつの色で表現するか?
    を示します。
    例えば、一般にRGBカラーの画像は24Bitカラーなどと表現しますが、OpenCV的には
    8Bit×3チャンネルと表現します。

 

  • imageData
    画像データ(輝度値、画素値)は、このimageDataのポインタを参照する事で輝度値を参照する事が出来ます。
    ただし、構造体の宣言を見ても分かるように、imageDataは符号付き8Bitのポインタ(char*)で宣言されているので、符号無し8Bitの256階調で輝度値を参照したい場合は、imageDataのポインタをキャストして参照して下さい。
    (例)
    IplImage* Src;
    ・・・
    byte* pBuf = (byte*)Src->imageData;また、OpenCVで確保されるimageDataのメモリのアドレスは16バイト境界になるように調整されています。つまり、アドレスが0x09BE0050などのように最下位の値が0となります。
    この事からもSSEなどと非常に相性がいいのです。

 

【IplImageの確保例】

  • ファイルから確保する場合
    IplImage* src_img = cvLoadImage(“TestImage.bmp”,
    CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);

 

  • 新規に画像データを確保する場合
    IplImage* src_img = cvCreateImage(
    cvSize(640, 480), IPL_DEPTH_8U, 3);※depthの値は、符号のある/なしを区別するため、数値(8など)を指定せず、下記定数の中から指定すること。
    IPL_DEPTH_8U – 符号無し 8 ビット整数
    IPL_DEPTH_8S – 符号有り 8 ビット整数
    IPL_DEPTH_16U – 符号無し 16 ビット整数
    IPL_DEPTH_16S – 符号有り 16 ビット整数
    IPL_DEPTH_32S – 符号有り 32 ビット整数
    IPL_DEPTH_32F – 単精度浮動小数点数
    IPL_DEPTH_64F – 倍精度浮動小数点数

ただし、使い終わったら解放するのもお忘れなく。
cvReleaseImage(&src_img);

 

OpenCVへ戻る

 

ライブラリの使用方法、VisualStudioの設定方法

最近、OpenCVOpenGLDirectShowなどのライブラリを使う機会が増えてきたので、ライブラリの使い方をまとめておきます。

 

ライブラリと一言いっても、スタティックライブラリダイナミックライブラリ.NETのクラスライブラリなどとあるのですが、比較的一般的?なダイナミックライブラリの使用方法を紹介します。

 

ダイナミックライブラリを使用するには、下記の3点セットが必要となります。

 

  • ダイナミックリンクライブラリファイル(*.dll)
  • ライブラリファイル(*.lib)
  • ヘッダファイル(インクルードファイル)(*.h)

 

各ライブラリで何のファイルが必要かは調べて置いて下さい。
*.dllファイルはプログラムの実行時、*.lib、*.hファイルはプログラミング中に必要となります。
また、ライブラリのバージョン、Release用/Debug用とでファイルが異なる場合もあります。

 

ライブラリを使用するための設定方法もいくつかあるので、私の思う一般的な方法は以下の通りです。


 

ダイナミックライブラリファイル(*.dll)の参照設定方法(環境変数Pathの設定)

 

ライブラリをインストールし、*.dllファイルがインストールされたパスを環境変数のPathに設定します。
※このPathの設定はライブラリのインストーラにより自動的に設定される場合もあります。

 

設定方法は、スタートメニューから、コンピュータを右クリックし、プロパティを選択します。

 

 

次に表示されたウィンドウのシステムの詳細設定をクリック

 

 

詳細設定のタブを選択し、右下の環境変数のボタンをクリック

 

 

すると下図のように××のユーザー環境変数システム環境変数と2種類表示され、両方ともにPathの項目があるのですが、××のユーザー環境変数のPathを設定するとWindowsにログインしたときのユーザーのみでPathの設定が有効となり、システム環境変数のPathを設定すると全ユーザーでPathの設定が有効となります。
私は『ログインしたユーザーを変えるとプログラムが起動しないんだけど?!』とか言われたく無いので、システム環境変数のPathを設定 するようにしています。
そして、Pathの項目を選択し、編集ボタンをクリックします。

 

 

そして、編集値の欄に*.dllファイルがインストールされているパス(フォルダ名のフルパス)をセミコロン(;)に続けて記載します。

 

(例)
;C:\Program Files\OpenCV\bin

 


 

また、この*.dllファイルのパスは必ずしも設定する必要はなく、プログラム(*.exe)のある同一フォルダやC:\Windows\System32フォルダ内に*.dllファイルを入れておくだけでも大丈夫なのですが、プログラムから*.dllファイルを参照するときの優先順位は下記のようになっています。

 

  1. アプリケーション(*.exe)と同じフォルダ
  2. カレントディレクトリ
  3. システムディレクトリ(C:\Windows\System32 など)
  4. 16Bitシステムディレクトリ(C:\Windows\System など)
  5. Windowsディレクトリ(C:\Windows など)
  6. PATH環境変数に列挙されているディレクトリ


 

ライブラリファイル(*.lib)の参照設定方法

各ライブラリにおいて、どの*.libファイルが必要なのかは調べておき、それぞれのファイルの参照設定を行います。

 

まずは、*.libファイルが入っているパスの参照設定を行います。
メニューのプロジェクト(プロジェクト名)のプロパティをクリックします。

 

 

開いたウィンドウの構成のプロパティ→リンカ→全般を選択し、追加のライブラリディレクトリにそのまま、*.libファイルのあるパスを設定するか、右側にある・・・のボタンをクリックします。

 

 

すると追加のライブラリディレクトリのウィンドウが表示されるので、・・・のボタンをクリックし、フォルダのボタンをクリックして*.libファイルのあるフォルダを指定します。

 

 

ライブラリによっては、参照する順番を指定しなければならない物もあるので、その場合は右上にある ↓ ↑ ボタンで順番を入れ替えます。

 

次に実際に使用する*.libファイルを設定します。
構成のプロパティ→リンカ→入力の追加の依存ファイルの部分に*.libファイルを入力します。
必要な*.libファイルがある場合は、空白(スペース)で区切って入力します。

 

 

他にもプログラム中で*.libファイルを直接していする事もできます。

 

例)
#pragma comment(lib,”C:\\Program Files\\OpenCV\\lib\\cv.lib”)

 


インクルードファイル(*.h)の参照設定方法

インクルードファイル(ヘッダファイル)(*.h)のあるパスを設定します。
設定方法は
メニューのプロジェクト→(プロジェクト名)のプロパティを クリックします。

 

構成プロパティ→C/C++→全般の追加のインクルードディレクトリの欄の右側にある・・・ボタンをクリックします。

 

 

ヘッダファイルのパスを追加設定するには右上のフォルダのアイコンをクリックします。

 

 

ボタンをクリックすると、・・・のボタンをクリックすると、ディレクトリの選択のウィンドウが表示されるので、*.hファイルが入っているパスを設定します。

 

 

そして、プログラム中では

 

#include <cv.h>

 

のように設定します。

 

C++/CLIからライブラリを使用する場合

 

.NETで作られたライブラリでは無いライブラリを使う場合は、メニューのプロジェクト→(プロジェクト名)のプロパティを クリック、構成プロパティ→全般の共通言語ランタイムサポートの欄を

 

純粋MSIL共通言語ランタイムサポート(/clr:pure)
から
共通言語ランタイムサポート(/clr)
に変更します。

 

 

その他

*.libファイル、*.hファイルの設定にはDebug用とRelease用の設定がそれぞれありますので、両方設定して下さい。
DebugとReleaseとで設定するファイル名が異なる場合もあるのでご注意下さい。

 

 

また、メニューのツール→オプションで表示されたウィンドウのプロジェクトおよびソリューション→VC++ディレクトリで、インクルードファイル(*.h)、ライブラリファイル(*.lib)の参照ディレクトリの設定が可能です。(VS2010は非推奨)
逆に言うと、ここに設定されているフォルダにインクルードファイル(*.h)やライブラリファイル(*.lib)を置いても参照する事が可能です。(個人的にはあまりやりませんが...)

 

 

トラブルシューティング

  • LINK : fatal error LNK1104: ファイル ‘×××.lib’ を開くことができません。
    fatal error C1083: include ファイルを開けません。’cv.h’: No such file or directory
    *.libファイル、*.hファイルが指定したフォルダに存在しているか?
    また、*.libファイル、*.hのファイル名が正しいか?
    確認してみて下さい。
  • fatal error C1189: #error :  ERROR: EMM intrinsics not supported in the pure mode!
    共通言語ランタイムサポートの設定/clr:pureから/clrに変更して下さい。

 

Visual Studioへ戻る

 

OpenCVとは?

OpenCVとは?

 

もともとインテルが開発したオープンソースのコンピュータビジョンライブラリ(Open Computer Vision)であり現在ではWillow Garage(ウィローガレージ)という米国のロボットの研究開発を行うベンチャー会社にて開発が行われいます。
主な機能としては一般的なフィルタ処理や行列演算を備え、顔認識処理なども比較的有名です。
サンプルプログラムも各種HPで公開されているため、容易に、しかも高速な画像処理が実現できるのも特徴です。

 

 

対応環境

OSはWindowsやLinuxなどに対応したクロスプラットフォームであり、最近ではiOSやAndroidなどても動作確認されています。
開発言語はC,C++,Pythonとなります。

 

開発履歴

バージョン 公開日 備考
1.0 2007.05.24 正式公開版初版
1.1pre1 2008.10.17
2.0 2009.10.01 C++インターフェース(cv名前空間)が登場
OpenMPによるマルチコア対応
2.1 2010.04.06 マルチコア対応がTBB(Intel Threading Building Blocks)へ変更
2.2 2010.12.05 ライブラリ構成の再編成
CUDAに暫定対応

(参考)
http://opencv.willowgarage.com/wiki/OpenCV%20Change%20Logs

 

OpenCVのライセンス

OpenCVはBSDラインセンスに基づき、商用/非商用問わず、無償で使用する事が可能です。

 

このBSDライセンスに基づきという部分がポイントなのですが、OpenCVを使用する場合には下記の著作権表示、免責事項に基づき、明示的にこの著作権表示および免責事項を原文のまま(英語のまま)表示し、その内容に従う必要があります。ソースコード公開の場合、そのソース中に、実行ファイル配布の場合はマニュアル等に含めて下さい。

 

著作権、免責事項の内容↓

IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.

 By downloading, copying, installing or using the software you agree to this license.
 If you do not agree to this license, do not download, install,
 copy or use the software.

                          License Agreement
               For Open Source Computer Vision Library

Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
Copyright (C) 2008-2009, Willow Garage Inc., all rights reserved.
Third party copyrights are property of their respective owners.

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

  * Redistribution's of source code must retain the above copyright notice,
    this list of conditions and the following disclaimer.

  * Redistribution's in binary form must reproduce the above copyright notice,
    this list of conditions and the following disclaimer in the documentation
    and/or other materials provided with the distribution.

  * The name of the copyright holders may not be used to endorse or promote products
    derived from this software without specific prior written permission.

This software is provided by the copyright holders and contributors "as is" and
any express or implied warranties, including, but not limited to, the implied
warranties of merchantability and fitness for a particular purpose are disclaimed.
In no event shall the Intel Corporation or contributors be liable for any direct,
indirect, incidental, special, exemplary, or consequential damages
(including, but not limited to, procurement of substitute goods or services;
loss of use, data, or profits; or business interruption) however caused
and on any theory of liability, whether in contract, strict liability,
or tort (including negligence or otherwise) arising in any way out of
the use of this software, even if advised of the possibility of such damage.

 

この内容の実体はバージョンにより異なる場合があるので、OpenCVをインストールしたフォルダの\doc内にlicense.txtというファイルを参照下さい。

 

ただし、商用で使う場合は、一部、処理アルゴリズムにおいては、研究用途に限られるものもあるので、ご注意下さい。

例えば、SIFTアルゴリズムに関しては、特許が取得されています。

(参考)SIFT Keypoint Detector

 

OpenCVの入手先

sourceforgeより
http://sourceforge.net/projects/opencvlibrary/

Windows版
http://sourceforge.net/projects/opencvlibrary/files/opencv-win/

Unix版
http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/

 

主なリンク

OpenCV Wiki
http://opencv.willowgarage.com/wiki/

OpenCV.jp
http://opencv.jp/

Yahoo Groups
http://tech.groups.yahoo.com/group/OpenCV/

 

関連書籍

オススメの書籍

 

OpenCVへ戻る