【OpenCV2.3】サンプルプログラム(C言語版)

OpenCV2.3においても、プログラムの作成方法はOpenCV2.2の時とさほど変わりません。

 

ここでは、OpenCV2.3の入手、ダウンロード、インストール、環境設定で紹介している方法でインストールした場合を想定しています。

 

基本的なC言語のプロジェクトファイルの作成方法については

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

のページを参照して下さい。

このページと異なるのはヘッダファイル(インクルードファイル)のディレクトリの設定方法のみです。

設定方法は

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

C:\OpenCV2.3\include

を指定します。

 

簡単なサンプルプログラムは以下の通りです。

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

#include "stdafx.h"

//プロジェクトのプロパティ⇒C/C++⇒全般 の追加のインクルードディレクトリに
// 『C:\OpenCV2.3\include』を追加のこと
#include "opencv2\\opencv.hpp"
 
#ifdef _DEBUG
    //Debugモードの場合
    #pragma comment(lib,"C:\\OpenCV2.3\\lib\\opencv_core230d.lib")
    #pragma comment(lib,"C:\\OpenCV2.3\\lib\\opencv_imgproc230d.lib")
    #pragma comment(lib,"C:\\OpenCV2.3\\lib\\opencv_highgui230d.lib")
#else
    //Releaseモードの場合
    #pragma comment(lib,"C:\\OpenCV2.3\\lib\\opencv_core230.lib")
    #pragma comment(lib,"C:\\OpenCV2.3\\lib\\opencv_imgproc230.lib")
    #pragma comment(lib,"C:\\OpenCV2.3\\lib\\opencv_highgui230.lib")
#endif

int _tmain(int argc, _TCHAR* argv[])
{

    //画像データの読込
    IplImage* src_img = cvLoadImage("C:\\OpenCV2.3\\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;
}

サンプルプログラムのダウンロードはこちらより
OpenCV23-C-Sample.zip (Visual Studio 2010 C++ Expressで作成しています。)

 

実行例


OpenCVへ戻る

 

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

2012.5現在、OpenCVの最新バージョンはVer2.4です。
こちらのインストール方法についてはOpenCV2.4の入手、ダウンロード、インストール、環境設定を参照願います。


OpenCV2.3は、一時、製品候補版のOpenCV2.3.0rcとして公開されましたが、現在ではrcの取れたOpenCV2.3.0となりました。

 

主な変更点

2.2から2.3への変更点はOpenCVのこのページで確認できます。

2.3rcおよび2.3の部分をご確認ください。

http://opencv.willowgarage.com/wiki/OpenCV%20Change%20Logs


OpenCV2.3の入手、ダウンロード先

OpenCVの入手は下記ページよりダウンロードして下さい。

(Windows版)

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

(Unix版)

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



 

上図はWindows版の物ですが、内容は以下の通り。
 

  • OpenCV-2.3.0-win-superpack.exe
    コンパイルされたOpenCVのライブラリファイル(*.dll、*.lib、*.h)が32bit、64bit、
    Visual Studio 2008用、2010用など各環境に合わせたファイルが用意されています。
    このファイルは従来のようにOpenCVのインストーラではなく、ただの自己解凍ファイルで
    あるため、自分でPATHの設定などを行う必要があります。
  • OpenCV-2.3.0rc-gpu-support-win32-vs2008.zip
    Windows 32bit版、Visual Studio 2008、GPU対応のコンパイル済みライブラリ?
    (未評価です。)
  • OpenCV-2.3.0rc-win-src.zip
    Cmakeというソフトを使って、自分でOpenCVをコンパイルするにはこのファイルを用います。
    CUDA4.0やOpenNI、IPPへの対応など、きめの細かい設定が可能となります。

 
必要に合わせて上記の中からファイルをダウンロードして下さい。
OpenCVを使うのが初めての方はコンパイル済みのファイル(*.exe)の使用をオススメします。

以下、次の順序でOpenCVのインストール方法を説明したいと思います。
 

コンパイル済みOpenCVを使う方法

自分でOpenCVをコンパイルする方法

OpenCVの環境変数の設定方法

 

コンパイル済みファイル(OpenCV-2.3.0-win-superpack.exe)を用いたインストール方法

ダウンロードしたファイル(OpenCV-2.3.0-win-superpack.exe)をダブルクリックします。
このファイルはただの自己解凍ファイルなので、好きなフォルダへコピーして下さい。

 

ファイルを解凍すると、下記のような構成になっています。

\OpenCV2.3
┣ build
┃  ┣ bin
┃  ┣ include
┃  ┃  ┣ opencv
┃  ┃  ┣ opencv2
┃  ┃  ┃  ┣ calib3d
┃  ┃  ┃  ┣ contrib
┃  ┃  ┃  ┣ core
┃  ┃  ┃  ┣ :
┃  ┃  ┃  ┗ opencv.hpp
┃  ┃  ┗ CMakeLists.txt
┃  ┣ Python
┃  ┣ x64
┃  ┃  ┣ mingw
┃  ┃  ┣ vc9
┃  ┃  ┃  ┣ bin
┃  ┃  ┃  ┃  ┣ opencv_calib3d230.dll
┃  ┃  ┃  ┃  ┣ opencv_calib3d230d.dll
┃  ┃  ┃  ┃  ┣ opencv_contrib230.dll
┃  ┃  ┃  ┃  ┣    :
┃  ┃  ┃  ┣ lib
┃  ┃  ┃  ┃  ┣ opencv_calib3d230.lib
┃  ┃  ┃  ┃  ┣ opencv_calib3d230d.lib
┃  ┃  ┃  ┃  ┣ opencv_contrib230.lib
┃  ┃  ┃  ┃  ┣    :
┃  ┃  ┃  ┗ staticlib
┃  ┃  ┃       ┣ opencv_calib3d230.lib
┃  ┃  ┃       ┣ opencv_calib3d230d.lib
┃  ┃  ┃       ┣ opencv_contrib230.lib
┃  ┃  ┃  ┃  ┣    :
┃  ┃  ┗ vc10
┃  ┃  ┃  ┣ bin
┃  ┃  ┃  ┃  ┣ opencv_calib3d230.dll
┃  ┃  ┃  ┃  ┣ opencv_calib3d230d.dll
┃  ┃  ┃  ┃  ┣ opencv_contrib230.dll
┃  ┃  ┃  ┃  ┣    :
┃  ┃  ┃  ┣ lib
┃  ┃  ┃  ┃  ┣ opencv_calib3d230.lib
┃  ┃  ┃  ┃  ┣ opencv_calib3d230d.lib
┃  ┃  ┃  ┃  ┣ opencv_contrib230.lib
┃  ┃  ┃  ┃  ┣    :
┃  ┃  ┃  ┗ staticlib
┃  ┃  ┃       ┣ opencv_calib3d230.lib
┃  ┃  ┃       ┣ opencv_calib3d230d.lib
┃  ┃  ┃       ┣ opencv_contrib230.lib
┃  ┃  ┃       ┣    :
┃  ┗ x86
┃  ┃  ┣ mingw
┃  ┃  ┣ vc9
┃  ┃  ┃  ┣ bin
┃  ┃  ┃  ┃  ┣ opencv_calib3d230.dll
┃  ┃  ┃  ┃  ┣ opencv_calib3d230d.dll
┃  ┃  ┃  ┃  ┣ opencv_contrib230.dll
┃  ┃  ┃  ┃  ┣    :
┃  ┃  ┃  ┣ lib
┃  ┃  ┃  ┃  ┣ opencv_calib3d230.lib
┃  ┃  ┃  ┃  ┣ opencv_calib3d230d.lib
┃  ┃  ┃  ┃  ┣ opencv_contrib230.lib
┃  ┃  ┃  ┃  ┣    :
┃  ┃  ┃  ┗ staticlib
┃  ┃  ┃       ┣ opencv_calib3d230.lib
┃  ┃  ┃       ┣ opencv_calib3d230d.lib
┃  ┃  ┃       ┣ opencv_contrib230.lib
┃  ┃  ┃       ┣    :
┃  ┃  ┗ vc10
┃  ┃  ┃  ┣ bin
┃  ┃  ┃  ┃  ┣ opencv_calib3d230.dll
┃  ┃  ┃  ┃  ┣ opencv_calib3d230d.dll
┃  ┃  ┃  ┃  ┣ opencv_contrib230.dll
┃  ┃  ┃  ┃  ┣    :
┃  ┃  ┃  ┣ lib
┃  ┃  ┃  ┃  ┣ opencv_calib3d230.lib
┃  ┃  ┃  ┃  ┣ opencv_calib3d230d.lib
┃  ┃  ┃  ┃  ┣ opencv_contrib230.lib
┃  ┃  ┃  ┃  ┣    :
┃  ┃  ┃  ┗ staticlib
┃  ┃  ┃       ┣ opencv_calib3d230.lib
┃  ┃  ┃       ┣ opencv_calib3d230d.lib
┃  ┃  ┃       ┣ opencv_contrib230.lib
┃  ┃  ┃       ┣    :
┣ opencv
┃  ┣ 3rdparty
┃  ┣ android
┃  ┣ data
┃  ┣    :
readme.txt

主に関係しそうなファイルは赤く表示しておきました。
より詳細な情報はreadme.txtファイルを参照下さい。

 

解凍したファイルは、このままの構成で使うも良し、従来のようにc:\OpenCV2.3というようなフォルダを作って、その中へコピーするも良し、この辺は好みですが、自分でPATHの設定(*.dllファイルのあるフォルダの設定)を行って下さい。

 

ちょっと興味を引かれたのはstaticlicが用意されている事でしょうか?


CMakeを使ったOpenCV2.3のビルド方法

◆事前準備

今回のバージョンはCUDA4.0やOpenNIに対応している事もあり、OpenCVからこれらを使いたい場合は先にインストールしておいて下さい。(必要ない場合はインストールしなくても構いません)

 

これらのインストールについては、下記ページを参照下さい。

 

CUDA4.0

CUDA4.0の入手、インストール方法

 

OpenNI

Kinect1 -OpenNI導入-
(UnaNancyOwenさんのブログ)
※私はWindows7の64bit版を使っていますが、64bit版のOpenNIのインストールに失敗したため、32bit版を用いました。

 

◆CMakeのダウンロード、インストール

CMakeというソフトを使って、OpenCVのソースコードからVisual Studio用のソリューションファイル(*.sln)を作成します。

 

CMakeは下記ページよりダウンロードします。

 

http://www.cmake.org/cmake/resources/software.html

 

2011.6.28現在、CMakeの最新版は2.8.4になります。

 

上記リンクより、Windows (Win32 Installer)(cmake-2.8.4-win32-x86.exe)をダウンロードします。64bitOSでも、上記のファイルで大丈夫です。

 

CMakeのインストールは、表示されたウィンドウのデフォルト設定で、次へ次へで大丈夫です。

 

◆OpenCVをソースコードからビルドする方法

最初に紹介したOpenCVの入手先よりOpenCV-2.3.0rc-win-src.zipをダウンロードし、ファイルを解凍します。

 

ファイルを解凍すると、\OpenCV-2.3.0rc-win-src\OpenCV-2.3.0\・・・ というようなフォルダ構成となっていますが、旧バージョンやコンパイル済みの構成と合わせるため、今回は

 

c:\OpenCV2.3

 

というフォルダを作成し、解凍したファイルの\OpenCV-2.3.0内のファイルを上記フォルダへ移動します。

 

c:\OpenCV2.3
┣3rdparty
┣android
┣data
・・・

 

というようにします。
次に、先ほどインストールしたCMakeを起動し、

 

Where is the source code: に  c:\OpenCV2.3
Where to buid the binaries: に c:\OpenCV2.3

 

を指定します。

 

 

次に左下の Configure ボタンをクリックします。

 

 

すると、ソリューションファイルを作成するVisual Studioのバージョン選択ウィンドウが表示されるので、使用しているVisual Studioをバージョンを指定して下さい。(おそらくVisual Studio2008以降推奨?)

 

しばらくすると、このように表示されます。

 

 

ここで、CUDAやOpenCVなどを使うかどうかを設定します。他にもIPPTBBの設定ができます。

 

CUDAを使う場合は WITH_CUDA にチェック
(CUDAを使わない場合、CUDAに対応していない場合はチェックを外して下さい。)

 

OpenNIを使う場合は WITH_OPENNI にチェック


 

使用するオプションを選択したら、再度、Configureボタンをクリックします。

 

 

すると、部分的に赤く表示される場合があります。

 

これは、パスなどの設定が間違っているためで、その部分の設定を行います。

 

OpenNI(32bit版)をデフォルト設定でWindows7 64bitにインストールした場合は以下のように設定します。

 

OPENNI_INCLUDE_DIR C:\Program Files(x86)\OpenNI\Include
OPENNI_LIB_DIR C:\Program Files(x86)\OpenNI\Lib
OPENNI_PRIME_SENSOR_MODULE_BIN_DIR C:\Program Files(x86)\PrimeSense\SensorKinect\Bin

 

 

ここで、Configureボタンをクリックします。

 

 

ここで、赤い部分が表示されていなければ、CMakeの設定は合っています。

 

赤い表示がある場合は、再度、設定を行って下さい。

 

さらに、Configureボタンをクリックします。

 

 

すると、Generateボタンを有効になるので、Generateボタンをクリックします。

 

これでようやくWhere to buid the binaries:で指定したフォルダ(c:\OpenCV2.3)にOpenCVのソリューションファイル

 

OpenCV.sln

 

が作成されます。

 

次に上記のソリューションファイル(OpenCV.sln)をダブルクリックし、Visual Studioを起動します。

 

起動後、Visual Studioのメニューのビルド構成マネージャINSTALLの部分にチェックを入れて下さい。(Debug/Releaseとも

 

 

設定を行ったら、閉じるボタンでウィンドウを閉じ、メニューのビルドソリューションのビルドでOpenCVのビルドを行います。

 

OpenCVのビルドには時間がかかりますが、Debug/Releaseともにビルドを行って下さい。

 

これでようやくOpenCVで必要なdll、lib、hファイルが C:\OpenCV2.3\install 内に作成されています。

 

そして、好みにもよりもますが、互換性も考慮して以下のように移動します。

 

C:\OpenCV2.3\install\bin内のファイルをC:\OpenCV2.3\bin内へ
C:\OpenCV2.3\install\include\opencv2内のファイルをC:\OpenCV2.3\include\opencv2内へ
C:\OpenCV2.3\install\lib内のファイルをC:\OpenCV2.3\lib内へ

 

移動します。

 

次にOpenCVのdllファイルを使えるように環境変数のPATHというのを設定します。

 

OpenCVの環境変数の設定

次にOpenCVのプログラムからライブラリ(*.dllファイル)を参照できるように環境変数の設定(Pathの登録)を行います。

 

Windowsのスタートボタンをクリック → コンピュータ右クリックプ ロパティをクリックします。

 

 

開いたウィンドウの システムの詳細設定 をク リックします。

 

 

次に詳細設定タブの環境変数のボ タンをクリックします。

 

 

次にシステム環境変数のPathを選択し、編集をクリックします。

 

 

変数値のテキストボックスの最後の部分に、OpenCVのdllファイルのあるフォルダを指定します。

 

;c:\OpenCV2.3\bin

 

※もともとあった文字は消さないようにご注意ください。
最初の ; (セミコロン)を付けるのもお忘れなく。
PATHの設定後、念のためPCを再起動して下さい。

 

以上で、OpenCVのインストールは完了です。

 

 
別途、簡単なサンプルサンプルプログラムを
https://imagingsolution.net/program/opencv/opencv2-3/c-sample-program/
のページにまとめました。
ただし、OpenCVを配置したフォルダが異なる場合は、適宜、フォルダ設定を変更して下さい。
 

 

OpenCVへ戻る

 

OpenCV2.3rcが公開されました

2011.6.22の0時ごろ、OpenCV2.3rcが公開されました。

 

本当はOpenCV2.3の正式版が公開される事を期待していたのですが、rc(release candidate)の付いた製品候補版。OpenCV1.1pre1の時のように、いつこのRCが取れるのかは微妙ですが、今、私も含めてOpenCVの好きな人たちは人柱状態で評価しているところだと思います。

 

これまでOpenCVを使った事の無い人は、まだOpenCV2.3rcの情報も少ないし、いつRCが取れるかも?分からないので、まだ、使わない方が無難だと思います。

 

主な変更点

変更点についてはOpenCVの本家のページ

http://opencv.willowgarage.com/wiki/OpenCV%20Change%20Logs

にて確認できます。

日本語がよければOpenCV.jpにて

http://opencv.jp/opencv2-x-tips/changelog_from_22

 

変更内容で個人的に気になったのは

  • CUDA4.0以降への対応
  • OpenNIの対応
  • opencv_stitchingというサンプル?

 

まだ、私もやっとインストールしたばかりなので、詳細は不明ですが、ある程度落ち着いたら記事にしたいと思います。

 

OpenCV2.3rcの入手先

OpenCVの入手先はこれまで、sourceforgeのOpenCVのトップページ

 

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

 

をリンクしていましたが、すぐにこの記事が古くなってしまうので、今回はOpenCV2.3へのダイレクトリンクも載せておきます。

 

(Windows版)

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

(Unix版)

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

 

※Windowsの64bit版のOSでは

OpenCV-2.3.0rc-win32-vs2008.exe
OpenCV-2.3.0rc-win64-vs2010.exe

を使うとインストールに失敗するようです。

 

そのため、現状では OpenCV-2.3.0rc-win-src.zip を用いCMakeを使って、自前でビルドする必要があります。

 

旧バージョンのダウンロード

sourceforgeのOpenCVのトップページのいつもの緑のボタンもOpenCV-2.3.0rc-win-src.zipファイルへのリンクになってしまったので、古いOpenCV2.2などがダウンロードできなくなってしまった?と思われる方もいらっしゃると思いますが、過去のバージョンも全て公開されています。

(Windows版)

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

(Unix版)

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

 

参考記事

OpenCV 2.0 入手、ダウンロード、インストール、環境設定

(CMakeの使い方など)

【OpenCV】輪郭処理(cvFindContours)を使ったラベリング処理

OpenCVには標準的にはcvLabelingのようなラベリングの関数は無いので、

 

 

を使いましょう!というのが一般的になってきているように思いますが、最初のラベリングクラスでは、画像の幅の画素数が4の倍数で無い場合、うまく動作してくれなかった気がするし、Blob extraction library は英語なので良く分からないし・・・
※追記)現在、はconnectedComponentsが使えます。

ということで、OpenCVに標準的にある輪郭処理の関数【cvFindContours】を使ってラベリングの処理ができないか?調べてみました。

 

結果、OpenCVの関数だけで、こんな感じ↓まで出来ました。

 

何はともあれ、まずは分かりづらいcvFindContoursの関数です。

 

関数の定義は

int cvFindContours(
          CvArr* image,			                    // 入力画像(8Bitモノクロ)
          CvMemStorage* storage,                // 抽出された輪郭を保存する領域
          CvSeq** first_contour,	              // 一番最初の輪郭(ツリー構造を持つ)へのポインタ
          int header_size = sizeog(CvContour),  // シーケンスのヘッダサイズ
          int mode = CV_RETR_LIST,	            // 抽出モード
          int method = CV_CHAIN_APPROX_SIMPLE,  // 近似手法
          CvPoint offset = cvPoint(0, 0)        // オフセット
          );

となっているのですが、とにかく分かりづらい抽出モード( mode )の理解から。

 

まずは mode = CV_RETR_TREE を例に取って説明したいと思います。

処理前の画像↓

 

この画像の輪郭を外側から順に追いかけると、

 

の内側に 、  の内側に  と  ・・・ というような構造になっています。

 

 

この構造をツリーのように階層構造で表すと、

 

階層
(Level)
輪郭構造

のように、一番外側に白の輪郭(Level = 1)があり、その内側に黒の輪郭(Level = 2)、さらにその内側に白の輪郭(Level = 3)・・・と、一番外側の白の輪郭から始まり、その輪郭の内側に黒の輪郭→白の輪郭→黒の輪郭→白の輪郭・・・とレベルが大きくなるにつれ、さらに内側に輪郭が存在しています。
この構造を保持しているのが CvSeq** first_contour となります。
このfirst_contourには一番最初の輪郭を示すポインタが格納されています。

 

同じ階層(Level)にある別の輪郭を参照したい場合は

CvSeq* contour = first_contour->h_next;

とすれば、同じ階層にある輪郭を参照できます。

 

さらに

contour = contour->h_next;

とすれば、さらに次の輪郭を参照出来ます。

 

もし、contourNULL になったら同じ階層に、同じ親を持つ別の輪郭は無い事を意味しています。

 

同じ様に

contour = contour->v_next;

とすれば、現在の輪郭のさらに内側にある輪郭へとポインタが移動します。

 

このようにh_nextv_nextを使うと、全ての輪郭を構造的に参照することが可能となります。

 

同様に

【mode = CV_RETR_EXTERNAL の場合】

階層
(Level)
輪郭構造

のように、一番外側の白の輪郭のみを取得します。

 

【mode = CV_RETR_LIST の場合】

階層
(Level)
輪郭構造

のように、白の輪郭、黒の輪郭、内側、外側関係なく、同じ階層で輪郭が取得されます。

 

【mode = CV_RETR_CCOMP の場合】

階層
(Level)
輪郭構造

のように、白の輪郭の一つ下のレベルに黒の輪郭を持つ構造となります。
ただし、ここで大事なのは白の輪郭のさらに内側にある白の輪郭(上図の5や6)も同じ階層となるので、ご注意下さい。

 

※modeの設定は共通して最初の階層の輪郭は白色の輪郭になっているようです。
そのため、白色の地に黒色の輪郭のある画像を処理すると、最初の輪郭は画像全体となるのでご注意下さい。

 

ということで、cvFindContours関数を使って輪郭を描画するプログラムはこんな感じ↓になります。

// Labelling.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")
#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")
#endif

// 関数宣言
void GetContourFeature(CvSeq*);
void DrawChildContour(IplImage*, CvSeq*,int);
void DrawNextContour(IplImage*,	CvSeq*, int);
void cv_Labelling(IplImage*, IplImage*);

//各種輪郭の特徴量の取得
void GetContourFeature(CvSeq *Contour){
	//面積
	double Area = fabs(cvContourArea(Contour, CV_WHOLE_SEQ));
	//周囲長
	double Perimeter = cvArcLength(Contour);
	//円形度
	double CircleLevel = 4.0 * CV_PI * Area / (Perimeter * Perimeter);

	//傾いていない外接四角形領域(フィレ径)
	CvRect rect = cvBoundingRect(Contour);
	//輪郭を構成する頂点座標を取得
	for ( int i = 0; i < Contour->total; i++){
		CvPoint *point = CV_GET_SEQ_ELEM (CvPoint, Contour, i);
	}
}

void DrawChildContour(	//子の輪郭を描画する。
	IplImage *img,	//ラベリング結果を描画するIplImage(8Bit3chカラー)
	CvSeq *Contour, //輪郭へのポインタ
	int Level		//輪郭のレベル(階層)
	){

	// 領域の色
	CvScalar color;
	// 輪郭を描画する色の設定
	CvScalar ContoursColor;

	if ((Level % 2) == 1){
		//白の輪郭の場合
		// 領域の色
		color = CV_RGB( rand()&255, rand()&255, rand()&255 );
		// 輪郭の色
		ContoursColor = CV_RGB( 255, 0, 0 );

	}else{
		//黒の輪郭の場合(内側の場合)
		// 領域の色
		color = CV_RGB(0, 0, 0);
		// 輪郭の色
		ContoursColor = CV_RGB( 0, 0, 255 );
	}

	//輪郭の描画
	cvDrawContours( img, Contour, color, color, 0, CV_FILLED);			// 領域
	cvDrawContours( img, Contour, ContoursColor, ContoursColor, 0, 2);	// 輪郭

	//輪郭を構成する頂点座標を取得
	for ( int i = 0; i < Contour->total; i++){
		CvPoint *point = CV_GET_SEQ_ELEM (CvPoint, Contour, i);
		//cvDrawCircle(img, *point, 3, CV_RGB(0, 255, 0));
	}

	//各種輪郭の特徴量の取得
	GetContourFeature(Contour);

	if (Contour->h_next != NULL)
		//次の輪郭がある場合は次の輪郭を描画
		DrawNextContour(img, Contour->h_next, Level);

	if (Contour->v_next != NULL)
		//子の輪郭がある場合は子の輪郭を描画
		DrawChildContour(img, Contour->v_next, Level + 1);
}

void DrawNextContour(	//次の輪郭を描画する。
	IplImage *img,	//ラベリング結果を描画するIplImage(8Bit3chカラー)
	CvSeq *Contour, //輪郭へのポインタ
	int Level		//輪郭のレベル(階層)
	){

	// 領域の色
	CvScalar color;
	// 輪郭を描画する色の設定
	CvScalar ContoursColor;

	if ((Level % 2) == 1){
		//白の輪郭の場合
		// 領域の色
		color = CV_RGB( rand()&255, rand()&255, rand()&255 );
		// 輪郭の色
		ContoursColor = CV_RGB( 255, 0, 0 );

	}else{
		//黒の輪郭の場合(内側の場合)
		// 領域の色
		color = CV_RGB(0, 0, 0);
		// 輪郭の色
		ContoursColor = CV_RGB( 0, 0, 255 );
	}

	//輪郭の描画
	cvDrawContours( img, Contour, color, color, 0, CV_FILLED);			// 領域
	cvDrawContours( img, Contour, ContoursColor, ContoursColor, 0, 2);	// 輪郭

	//輪郭を構成する頂点座標を取得
	for ( int i = 0; i < Contour->total; i++){
		CvPoint *point = CV_GET_SEQ_ELEM (CvPoint, Contour, i);
		// 頂点座標の描画
		//cvDrawCircle(img, *point, 3, CV_RGB(0, 255, 0));
	}

	//各種輪郭の特徴量の取得
	GetContourFeature(Contour);

	if (Contour->h_next != NULL)
		//次の輪郭がある場合は次の輪郭を描画
		DrawNextContour(img, Contour->h_next, Level);

	if (Contour->v_next != NULL)
		//子の輪郭がある場合は子の輪郭を描画
		DrawChildContour(img, Contour->v_next, Level + 1);
}

void cv_Labelling(	//ラベリング処理
	IplImage *src,	//入力画像(8Bitモノクロ)
	IplImage *dst	//出力画像(8Bit3chカラー)
	) {

	CvMemStorage *storage = cvCreateMemStorage (0);
	CvSeq *contours = NULL;

	if (src == NULL)
		return;

	// 画像の二値化【判別分析法(大津の二値化)】
	cvThreshold (src, src, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);

	// 輪郭の検出(戻り値は取得した輪郭の全個数)
	int find_contour_num = cvFindContours (
			src,					// 入力画像
			storage,				// 抽出された輪郭を保存する領域
			&contours,				// 一番外側の輪郭へのポインタへのポインタ
			sizeof (CvContour),		// シーケンスヘッダのサイズ
			CV_RETR_TREE,			// 抽出モード
									// CV_RETR_EXTERNAL - 最も外側の輪郭のみ抽出
									// CV_RETR_LIST - 全ての輪郭を抽出し,リストに追加
									// CV_RETR_CCOMP - 全ての輪郭を抽出し,二つのレベルを持つ階層構造を構成する.1番目のレベルは連結成分の外側の境界線,2番目のレベルは穴(連結成分の内側に存在する)の境界線.
									// CV_RETR_TREE - 全ての輪郭を抽出し,枝分かれした輪郭を完全に表現する階層構造を構成する.
			CV_CHAIN_APPROX_SIMPLE	// CV_CHAIN_APPROX_SIMPLE:輪郭の折れ線の端点を取得
									// CV_CHAIN_APPROX_NONE: 輪郭の全ての点を取得
									// CV_CHAIN_APPROX_TC89_L1		:Teh-Chinチェーンの近似アルゴリズム中の一つを適用する
									// CV_CHAIN_APPROX_TC89_KCOS
			);

	if (contours != NULL){
		//処理後画像を0(黒)で初期化
		cvZero(dst);
		//輪郭の描画
		DrawNextContour(dst, contours, 1);
	}

	//メモリストレージの解放
	cvReleaseMemStorage (&storage);

}

int _tmain(int argc, _TCHAR* argv[])
{

    //画像データの読込(グレースケールで読込)
    IplImage* src = cvLoadImage("sample.bmp", CV_LOAD_IMAGE_GRAYSCALE);
    if (src == NULL){
        return 0;
    }

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

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

	// 入力画像の表示
	cvShowImage ("src", src);

    // ラベリング処理(※入力画像(src)はcvFindContoursにより変更されます。)
    cv_Labelling(src, dst);

    // ラベリング画像の表示
    cvShowImage ("dst", dst);

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

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

    // 画像データの解放
    cvReleaseImage(&src);
    cvReleaseImage(&dst);

	return 0;
}

サンプルプログラムのダウンロードはこちらより

opencv-labelling.zip

(OpenCV2.2対応。Visual Studio 2010 C++ Expressにより作成)

 

上記、サンプルプログラムではcvFindContours関数で輪郭情報を取得し、オリジナルのDrawNectContour関数を用いて再帰的に輪郭、および領域を描画しています。

 

また、GetContourFeature関数で、面積、周囲長、円形度、フィレ径、輪郭の頂点座標の計算だけをしています。この部分は必要に応じて改良してみて下さい。

 

ここで注意が必要なのは、輪郭から面積を計算する関数cvContourAreaは、下図の様に輪郭線で囲まれた領域の内側の面積を計算します。(画素数ではありません。

下図の例では面積は 17.5 となります。
輪郭の内側の穴の面積は考慮されないので、穴の部分を除外したい場合はv_nextで一つ下の階層にある黒の輪郭を全て取得し、黒の面積を白の面積から引いて下さい。

 

輪郭座標について

CV_GET_SEQ_ELEMマクロで取得している輪郭を構成する座標はcvFindContours関数の6番目の引数methodの設定できまります。

 

method = CV_CHAIN_APPROX_NONE の場合

上図のように輪郭を構成している座標全てを取得します。

 

method = CV_CHAIN_APPROX_SIMPLE の場合

上図のように輪郭を構成している折れ線の角の座標を取得します。

 

method = CV_CHAIN_APPROX_TC89_L1
もしくは     CV_CHAIN_APPROX_TC89_KCOS の場合

 

上図のように輪郭を構成している座標をTeh-Chinチェーンの近似アルゴリズムに基づいて近似した線の折れ線の角の座標を取得します。
との事ですが、詳細は良く分かりませんでした...(上図も実際の結果と異なるかも?)

 

OpenCVでは他にも、いろいろな特徴量を計算する関数が用意されています。
おそらくcvFindContours関数を使ってラベリング処理をした方が、いろんな使い道が考えられると思うので、上記のサンプルプログラムを目的に応じて改良してみて下さい。

 

OpenCVへ戻る

 

【OpenCV】インプレースモード

OpenCVの関数では入力画像(src)と出力画像(dst)に同じ値(src=dst)を指定しても処理してくれる
関数があり、このことをインプレースモードと言います。

 

例えば

cvErode(src, src);
cvErode(src, src);
cvDilate(src, src);
cvDilate(src, src);

と処理を行っても大丈夫な関数があります。
どの関数がインプレースモードに対応しているのかは、OpenCV.jp、他、リファレンスマニュアルを参照下さい。

 

普通に考えれば入力画像と出力画像に同じデータを用いる事はできない場合が多いかと思いますが、OpenCVの関数のソースコードを見てみると、入力画像(src)と出力画像(dst)の画像データのポインタが等しい場合は、関数内部で処理後の画像データを格納するためのメモリを確保し、画像処理後に処理後の画像データを入力画像にコピーして、メモリを解放する処理が行われています。

 

そのため、インプレースモードを使えば、ちょっとした処理の評価をするにはプログラムのコード量も減って簡単に処理ができるのですが、処理を何回も繰り返す場合には、入力画像と出力画像のデータを分けた方が高速に処理を行うことができる(余計なメモリの確保やコピー処理が行われない)ので、入力画像(src)と出力画像(dst)は別の値を指定した方が良いと思います。

 

また、cvSmoothのように同じ関数でも、引数によって処理を分けている場合、引数によってインプレースモードに対応、非対応な場合があるので、ご注意下さい。

 

例えばcvSmoothの場合、

平滑化の方法
smoothtype
処理内容 インプレースモード
CV_BLUR_NO_SCALE スケーリング無しの単純平滑化 対応
CV_BLUR 単純平滑化 対応
CV_GAUSSIAN ガウシアンフィルタ 対応
CV_MEDIAN メディアンフィルタ 非対応
CV_BILATERAL バイラテラルフィルタ 非対応

 
 

OpenCVへ戻る

 

【OpenCV】アンシャープマスキング(鮮鋭化)

アンシャープマスキング(Unsharp Masking)もOpenCVに無い関数の1つのなのですが、OpenCVには任意カーネルを指定してフィルタ処理を行っているcvFilter2Dという関数があるので、これを使ってアンシャープマスキングを実現する手法を紹介します。

 

アンシャープマスキングのアルゴリズムについては以前、アンシャープマスキング(鮮鋭化フィルタ)のページで紹介しているので、そちらを参照願います。

 

以下、アンシャープマスキングのサンプルプログラムです。OpenCV2.2を用いて、作成しています。

 

// UnsharpMasking.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")
#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")
#endif

//---------------------------------------------------------------
//【関数名 】:cv_UnsharpMasking
//【処理概要】:アンシャープマスキング
//【引数  】:src        = 入力画像
//      :dst        = 出力画像
//      :k		   = 鮮鋭化の強さ
//【戻り値 】:なし
//【備考  】:
//---------------------------------------------------------------
void cv_UnsharpMasking(IplImage* src, IplImage* dst, float k){
	//カーネルの設定
	float KernelData[] = {
		-k/9.0f, -k/9.0f,			-k/9.0f,
		-k/9.0f, 1 + (8 * k)/9.0f,	-k/9.0f,
		-k/9.0f, -k/9.0f,			-k/9.0f,
	};
	//カーネルの配列をCvMatへ変換
	CvMat kernel = cvMat (3, 3, CV_32F, KernelData);
	//フィルタ処理
	cvFilter2D (src, dst, &kernel);
}

int _tmain(int argc, _TCHAR* argv[])
{

	//画像データの読込
	IplImage* src = cvLoadImage("sample.bmp", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
	if (src == NULL){
		return 0;
	}

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

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

	//アンシャープマスキング
	cv_UnsharpMasking(src, dst, 2.0f);

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

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

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

	//画像データの解放
	cvReleaseImage(&src);
	cvReleaseImage(&dst);

	return 0;
}

サンプルプログラムのダウンロードはこちらより。

OpenCV-UnsharpMasking.zip

(OpenCV2.2対応。Visual Studio 2010 C++ Expressにより作成)

 

実行例

 

このサンプルプログラムは、任意カーネルフィルタのサンプルにもなっているので、プログラム中のKernelDataの値をいろいろと変えてみるのも面白いと思います。

 

OpenCVへ戻る

 

【OpenCV】コンピュータにopencv_objdetect220d.dllがないため、

OpenCVのサンプルプログラムなどを動かそうとすると、下図のように

 

コンピュータにopencv_objdetect220d.dllがないため、プログラムを開始できません。
この問題を解決するには、プログラムを再インストールしてみて下さい。

 

 

などと、他にもコンピュータにopencv_core220d.dllがないため、・・・だったりと、ファイル名は違うかもしれませんが、このようなエラーメッセージが表示される場合があります。

 

dllファイルはコンピュータに入っているし、なぜ???と思われる方もいると思いますが、Windowsではダイナミックライブラリファイル(*.dll)は下記の特定のフォルダに入っていないと見つけてくれません。

 

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

 

OpenCV2.2ではインストール時に、OpenCVをPATH環境変数に追加するか?と聞かれるのですが、これを忘れてしまうと、このエラーメッセージが表示されてします。

 

そのため、このエラーが出た時には自分でPATH環境変数にOpenCVのPATH(OpenCVのdllファイルのあるディレクトリ)を設定する必要があります。

 

設定方法は以下の通り。

 

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

 

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

 

 

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

 

 

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

 

そして、Pathの項目を選択し、編集ボタンをクリックします。

 

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

 

(例)
;C:\OpenCV2.2\bin

 

この時、元にあった文字は消さないように注意して下さい。
消されたプログラムが起動しなくなります。

 

最後にパソコンを再起動して下さい。

 

これで、 コンピュータに*.dllファイルがないため、 というエラーは無くなると思います。

 

(参考)

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

 

OpenCVへ戻る

 

【OpenCV】ソーベルフィルタ(cvSobel)

OpenCVの関数では、ほとんど入力画像と出力画像のデータはビット数とチャンネル数は等しい場合が多いのですが、ソーベルフィルタの関数(cvSobel)は入力画像が8Bitに対し、出力画像が符号付きの16Bit(IPL_DEPTH_16S)にしないといけません。

 

また、一回のcvSobel関数の処理ではX方向、Y方向のどちらかの方向しか処理できないので、最も一般的?なX方向とY方向を足し合わせた処理を簡単に関数にまとめてみました。

 

// SobelFilter.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")
#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")
#endif

//---------------------------------------------------------------
//【関数名 】:cv_Sobel
//【処理概要】:ソーベルフィルタ
//【引数  】:src        = 入力画像(8bit)
//      :dst        = 出力画像(8bit)
//【戻り値 】:なし
//【備考  】:
//---------------------------------------------------------------
void cv_Sobel(IplImage* src, IplImage* dst){

    IplImage* xSoble  = cvCreateImage(cvGetSize(src), IPL_DEPTH_16S, src->nChannels);
    IplImage* ySoble  = cvCreateImage(cvGetSize(src), IPL_DEPTH_16S, src->nChannels);
    IplImage* xySoble = cvCreateImage(cvGetSize(src), IPL_DEPTH_16S, src->nChannels);

    //X方向のソーベル
    cvSobel(src, xSoble, 1, 0);
    //Y方向のソーベル
    cvSobel(src, ySoble, 0, 1);

    //X方向 + Y方向
    cvAdd(xSoble, ySoble, xySoble);

    //符号付き16ビット→符号なし8ビットへ
    cvConvertScaleAbs(xySoble, dst);

    //解放
    cvReleaseImage(&xSoble);
    cvReleaseImage(&ySoble);
    cvReleaseImage(&xySoble);

}

int _tmain(int argc, _TCHAR* argv[])
{

	//画像データの読込(グレースケールで読込)
	IplImage* src = cvLoadImage("Lenna.bmp", CV_LOAD_IMAGE_GRAYSCALE);
	if (src == NULL){
		return 0;
	}

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

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

	//ソーベルフィルタ
	cv_Sobel(src, dst);

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

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

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

	//画像データの解放
	cvReleaseImage(&src);
	cvReleaseImage(&dst);

	return 0;
}

サンプルプログラムのダウンロードはこちらより。

OpenCV-SobelFilter.zip

(OpenCV2.2対応。Visual Studio 2010 C++ Expressにより作成)

 

実行例

 

今回の例ではソーベルフィルタの結果の絶対値を取りましたが、必ずしもソーベルフィルタは絶対値を取る! とは思わない方が良いかと思います。

 

上図のような処理例を見ても分かるように、ソーベルの絶対値を取ると、狭い間隔の輪郭は白く潰れてしまいます。

 

しかし、絶対値を取らないと、狭い間隔のエッジでも、正の値と負の値とで区別ができるので、エッジ間隔を取得し易くなります。

 

その点、cvSobel関数では、処理結果をあえて符号付きの16ビットで出力するようにしたOpenCVには共感が持てる。

 

OpenCVへ戻る

 

【OpenCV】ガンマ補正

OpenCVにはcvGammaのようなガンマ補正の関数は無いのですが、ルックアップテーブルを使った輝度値変換の関数(cvLUT)はあるので、これを使ってガンマ補正を行いたいと思います。

 

以下、ガンマ補正のサンプルプログラムです。OpenCV2.2を用いて、作成しています。

#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")
#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")
#endif
//---------------------------------------------------------------  
//【関数名 】:cv_Gamma  
//【処理概要】:ガンマ補正  
//【引数  】:src        = 入力画像  
//      :dst        = 出力画像  
//      :gamma   = ガンマ補正値  
//【戻り値 】:なし  
//【備考  】:モノクロ/カラー対応可  
//      :カラーの場合はRGB全て同じガンマ補正値  
//---------------------------------------------------------------   
void cv_Gamma(IplImage* src, IplImage* dst, double gamma){  

	int i;  

	uchar LUT[256];  
              
	//ガンマ補正テーブルの作成  
	for (i = 0; i < 256; i++)
	{  
		LUT[i] = (int)(pow((double)i / 255.0, 1.0 / gamma) * 255.0);  
	}  

	//CvMatへ変換  
	CvMat lut_mat = cvMat(1, 256, CV_8UC1, LUT);  

	//ルックアップテーブル変換  
	cvLUT(src, dst, &lut_mat);  
}

int _tmain(int argc, _TCHAR* argv[])
{
	//画像データの読込
	IplImage* src = cvLoadImage("Girl.bmp", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
	if (src == NULL){
		return 0;
	}
 
	//表示ウィンドウの作成
	cvNamedWindow("src");
	cvNamedWindow("dst");
 
	//処理後画像データの確保
	IplImage* dst = cvCreateImage(cvGetSize(src), src->depth, src->nChannels);
 
	//ガンマ補正
	cv_Gamma(src, dst, 2.0);
 
	//画像の表示
	cvShowImage ("src", src);
	cvShowImage ("dst", dst);
 
	//キー入力待ち
	cvWaitKey (0);
 
	//全てのウィンドウの削除
	cvDestroyAllWindows();
 
	//画像データの解放
	cvReleaseImage(&src);
	cvReleaseImage(&dst);

	return 0;
}

サンプルプログラムのダウンロードはこちらより。

gamma-correction-opencv-sample.zip

(OpenCV2.2対応。Visual Studio 2010 C++ Expressにより作成)

 

実行例

 

OpenCV2.2の使用方法および、ガンマ補正については下記のページを参照下さい。

 

OpenCVへ戻る

 

OpenCVのバグ

本記事は古い情報となります。

 

OpenCVには、いくつか有名なバグがあります。

 

バグの情報に関しては、こちらのページ

https://code.ros.org/trac/opencv/report

で確認できますが、私の知っている気になったバグは以下の通り

 

  • cvErode/cvDilate
    iterationsに2以上の値を指定すると、膨張/収縮の中心位置がずれる
  • 画像の読み込み(cvLoadImage、cv::imread)(Ver2.1)
    大きな画像を開けない
  • Windows7 64bitでUSBカメラが使えない (Ver2.2)

 

などなど。

 

以前に使えていた物も、新しいバージョンではバグになるという、ソフト屋さんではやってはいけないような事もあるので、要注意ですね。

 

OpenCVへ戻る

 

【OpenCV】IplImageから.NETのBitmapへ変換

OpenCVのプログラムを作っていると、OpenCV用のGUI(highgui)はかなり物足りなく、ウィンドウや表示まわりは.NETに任せたいので、OpenCVのIplImageから.NET(C++/CLI)のBitmapへ変換すると、簡単にウィンドウプログラムを作成する事が可能となります。

 

変換部分のサンプルプログラムは以下の通りです。

// IplImage の確保
IplImage *src_img = cvLoadImage("c:\\Sample.bmp");
//  IplImageからBitmapの確保
Bitmap^ bmp = gcnew Bitmap(src_img->width, src_img->height, src_img->widthStep,
      System::Drawing::Imaging::PixelFormat::Format24bppRgb, (IntPtr)src_img->imageData);

ただし、PixelFormatはIplImageで確保した画像データのdepthおよびnChannelsに合わせて設定して下さい。

 

PixelFormat depth nChannels
Format8bppIndexed 8 1
Format24bppRgb 8 3

 

他の組合せも考えられますが、.NETやOpenCVの関数が対応していないものが多いので、実質的に、この2つの組合せになると思います。
モノクロ8Bit画像(Format8bppIndexed)の場合は、別途、カラーパレットを設定する必要があります。
カラーパレットの設定については、8Bitモノクロのカラーパレット設定方法のページを参照願います。

 

ここで作成したBitmapをPictureBoxに表示する場合、

 

pictureBox1->Image = bmp;

 

とすると

 

‘System.AccessViolationException’ のハンドルされていない例外が System.Drawing.dll で発生しました。
追加情報: 保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。

 

というエラーメッセージが出てしまうので、DrawImageを使って

 

g->DrawImage(bmp, 0, 0, src_img->width, src_img->height);

 

というようにして、ピクチャボックスへ描画します。

 

ちなみに今回はIplImageからBitmapクラスへ変換する方法を紹介しましたが、BitmapクラスからIplImageへ変換する場合はBitmapクラスのポインタがガーベージコレクションにより移動してしまう可能性があるので、BitmapのポインタをLock~Unlockで取得し、IplImageのimageDataへコピーすればよいと思います。

 

また、OpenCV2.0からは画像データにC++用のcv::Matがありますが、cv::Matでは画像データのメモリの幅が4の倍数に調整されていないので、画像の幅が4の倍数でない場合はcv::Matと.NETのBitmapとではメモリのサイズが異なるため、そのままcv::MatのポインタをBitmapへ渡す事ができません。
そのため、cv::MatからBitmapへ変換する場合はcv::MatそのものをIplImageを確保してからcv:Matへ変換するか、画像の1行ごとにデータをコピーするなどの工夫が必要となります。

 

 

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へ戻る

 

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へ戻る