OpenCV2.4Betaが公開されました。

2012.5.1 OpenCV2.4の正式版となりました。
2012.4.13 OpenCV2.4Beta2となりました。
2012.4.3 0:30頃? OpenCV2.4Betaが公開されました。

OpenCV2.4Betaの入手先は

 

【Windowsの場合】

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

【Unixの場合】

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

 

今回の変更内容はこちら

http://code.opencv.org/projects/opencv/wiki/ChangeLog#New-functionality

 

【マニュアル類】
●リファレンスマニュアル(http://opencv.itseez.com/opencv2refman.pdf)
●ユーザーガイド(http://opencv.itseez.com/opencv_user.pdf)
●チュートリアル(http://opencv.itseez.com/opencv_tutorials.pdf)

 

Cannyやfindcontourがカラーに対応したとのこと。

findcontourの例↓

findcontourの場合はカラーで二値化した場合の事らしい。

Cannyのカラー対応って?と思ったら、処理結果はモノクロで出力されます。

 

まだ、詳細を見ていませんが、今回は新しい構成にopencv_nonfree、opencv_photo、opencv_videostabなる物が追加されています。

 

opencv_nonfreeには特許の取られている処理アルゴリズムのSIFTとSURFがこちらの構成に入れられたので、必要ない時はこのdllを使わなければいいので、特許の心配は無くなりました?って言っていいのだろうか?他にも無いか?ちょっと心配...

 

必要なモジュールはCMakeの時に選択できるようになりました。

 

 

過去の例で言うと、Betaと付いた場合は比較的早く新しいバージョンが公開されるので、人柱になるつもりが無ければ今のところは使わなくていいと思います。

 

今回のOpencV2.4Betaでは、サンプル画像の中に基盤の絵があったり、何やら工業用途で使えるようになるような期待感が...

 

評価中メモ

※メモなので、下記内容に信憑性はありません。



●GPU処理はCUDA4.1が必要


●cv::imread(ファイル名)で画像が読み込めない。(cv::Matにデータが入らない)
とりあえず、こんな感じ↓で回避中
cv::Ptr src = cvLoadImage(“Lenna.bmp”, ・・・・・・
cv::Mat img(src);


●cv::namedWindowのタイトルの文字が文字化けする


●カメラ制御用のenumが増えている。しかもちゃんと使えるっぽい。これでOpenCVからカメラの制御ができるかも?
CV_CAP_PROP_ZOOM =27,
CV_CAP_PROP_FOCUS =28,
CV_CAP_PROP_GUID =29,
CV_CAP_PROP_ISO_SPEED =30,
CV_CAP_PROP_MAX_DC1394 =31,
CV_CAP_PROP_BACKLIGHT =32,
CV_CAP_PROP_PAN =33,
CV_CAP_PROP_TILT =34,
CV_CAP_PROP_ROLL =35,
CV_CAP_PROP_IRIS =36,
CV_CAP_PROP_SETTINGS =37,

OpenCVをスタティックリンクライブラリでビルドする方法

スタティックリンクライブラリを使うと他のPCへ作成した実行ファイルを移植する時にexeファイルをコピーすればOpenCVをインストールする事なく実行できるので、メリットはあるので、使ってみたいのですが、これが、なかなか分かりづらい。

 

OpenCV2.3.1ではファイル(OpenCV-2.3.1-win-superpack.exe)をダウンロードし、解凍するとスタティックリンクライブラリらしきフォルダ(staticlib)があるのですが、*.libファイルが不足しているらしく、未解決のシンボルのエラーが出て使う事が出来なさそうです。

 

そのため、OpenCV-2.3.1-win-superpack.exeのソースからCMakeを使ってスタティックリンクライブラリをビルドしてみました。

 

CMakeでビルドする方法はOpenCV2.3の入手、ダウンロード、インストール、環境設定のページを参考にして頂きたいのですが、上記のページから異なるポイントを示したいと思います。

 

今回OpenCV-2.3.1-win-superpack.exeを c:\ に解凍している事を想定しています。

 

まずCMakeで作成するプロジェクトの保存先のフォルダを作成しておきます。

 

今回は C:\opencv\userbuild というフォルダを作成するとします。

 

CMakeを起動し

 

Where is the source codeに C:/opencv

Where is the source codeに C:/opencv/userbuid

 

を指定します。

 

 

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

すると下図のようなウィンドウが開くので、使用するVisual Studioのバージョンを選択します。

 

 

Finishボタンをクリックすると下図のように表示されるので、BUILD_SHARED_LIBSのチェックを外します。CUDAに対応していないPCの場合はWHITH_CUDAのチェックも外して下さい。

 

 

次にConfigureボタンをクリックするとBUILD_WITH_STATIC_CRTという項目が表示されるので、チェックを入れたまま、Configureボタンをクリックします。

 

 

すると赤く表示された部分が無くなるので、Generateボタンをクリックします。

 

 

するとWhere is the source codeで指定したフォルダ(\userbuild)にソリューションファイル(OpenCV.sln)が作成されるので、このファイルをダブルクリックし、VisualStudioを開きます。

 

開いたVisualStudioのメニューからビルド→構成マネージャーを選択します。

 

次にINSTALLの項目にあるビルドの部分にチェックを入れます。

左上のアクティブソリューション構成の部分のDebugReleaseを選択しそれぞれにチェックを入れます。

 

この状態で、Visual Studioのメニューのビルド→ソリューションのビルドを選択し、OpenCVをビルドします。このビルドには、かなり時間がかかりますが、ReleaseDebugの両方でビルドを行って下さい。

 

これでWhere is the source codeで指定したフォルダ(\userbuild)内に必要なヘッダファイルとライブラリファイルが作成されます。

 

スタティックリンクライブラリを使用する方法

まず、Visual Studioを起動し、ファイル⇒新規作成と選択し、Visual C++⇒Win32内のWin32コンソールアプリケーションを選択し、ウィンドウの下の方にある名前をプロジェクトを作成する場所を指定します。

 

次に表示されたウィンドウで完了をクリックするとスケルトンプログラムが作成されます。

 

次にVisual Studioのメニューのプロジェクト⇒(プロジェクト名)のプロパティを選択し、構成のプロパティ⇒C/C++⇒全般と選択し、追加のインクルードディレクトリの部分に先程作成したOpenCVのopencv2のあるフォルダを指定します。(右上の構成の部分でDebugとReleaseを切り替えて同じ設定をして下さい。)

C:\opencv\userbuild\install\include

 

同じウィンドウで構成のプロパティ⇒リンカー⇒入力と選択し特性の指定のライブラリの無視の部分で

 

(Debugの場合)

LIBCMTD.lib;msvcprtd.lib

(Releaseの場合)

LIBCMT.lib;msvcprt.lib

 

を指定します。

 

これで、ソースコード上に下記のようにヘッダファイル(*.hpp)とライブラリファイル(*.lib)の設定を行うと、OpenCVをスタティックリンクライブラリとして使用する事が可能になります。

 

下記はWebカメラを撮影する簡単なコードです。

 

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

#include "stdafx.h"

//*******************************************************************************
// プロジェクトの設定
// ①プロジェクトのプロパティ⇒C/C++⇒全般 の追加のインクルードディレクトリに
//      C:\opencv\userbuild\install\include
//   を追加
// ②プロジェクトのプロパティ⇒リンカー⇒入力 の特定の規定のライブラリの無視に
//    Debugのとき
//        LIBCMTD.lib;msvcprtd.lib
//    Releaseのとき
//        LIBCMT.lib;msvcprt.lib
//    を追加
//*******************************************************************************

#include "opencv2\\opencv.hpp"

#pragma comment(lib,"comctl32.lib")
#pragma comment(lib,"vfw32.lib")	// Video for Windows

#ifdef _DEBUG
    //Debugモードの場合
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_core231d.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_imgproc231d.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_highgui231d.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_objdetect231d.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_contrib231d.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_features2d231d.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_flann231d.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_gpu231d.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_legacy231d.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_ts231d.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_video231d.lib")

    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\share\\OpenCV\\3rdparty\\lib\\zlibd.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\share\\OpenCV\\3rdparty\\lib\\libtiffd.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\share\\OpenCV\\3rdparty\\lib\\libpngd.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\share\\OpenCV\\3rdparty\\lib\\libjpegd.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\share\\OpenCV\\3rdparty\\lib\\libjasperd.lib")

#else
    //Releaseモードの場合
	#pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_core231.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_imgproc231.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_highgui231.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_objdetect231.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_contrib231.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_features2d231.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_flann231.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_gpu231.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_legacy231.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_ts231.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\lib\\opencv_video231.lib")

    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\share\\OpenCV\\3rdparty\\lib\\zlib.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\share\\OpenCV\\3rdparty\\lib\\libtiff.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\share\\OpenCV\\3rdparty\\lib\\libpng.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\share\\OpenCV\\3rdparty\\lib\\libjpeg.lib")
    #pragma comment(lib,"C:\\opencv\\userbuild\\install\\share\\OpenCV\\3rdparty\\lib\\libjasper.lib")

#endif

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

	// カメラオープン
	cv::VideoCapture cap(0);

	// カメラがオープンできたかの確認
	if(!cap.isOpened()) return -1;

	cv::namedWindow("Capture", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
	while(1) {
		cv::Mat frame;
		cap >> frame;  // キャプチャ
		// 様々な処理
		// ...
		cv::imshow("Capture", frame); // 表示
		if(cv::waitKey(30) >= 0)
		{
			cv::imwrite("cap.png", frame);
			break;
		}
	}

	return 0;
}

※実際に開発したPCとは別のPCへ実行ファイル(*.exe)を移植する場合、別途、C++のランタイムが必要となります。

 

移植先のPCに開発したPCで使用したVisual Studioと同じバージョンがインストールされていない場合、C++の再頒布パッケージというものをインストールします。

 

Visual Studio 2010 C++(32bit)の場合、以下の場所よりダウンロードして下さい。

Microsoft Visual C++ 2010 SP1 再頒布可能パッケージ (x86)

 

これで、OpenCVをスタティックリンクライブラリで使えていると思うのですが、この特定のライブラリの無視する部分と、comctl32.libとvfw32.libを追加しないといけない部分が分かりづらかった...

ただ、warning LNK4049のワーニングが幾つか出てしまい、いまいち、このwarningの消し方は分かりませんでした...

 

OpenCVへ戻る

 

C#(.NET)からOpenCVを使う方法、OpenCvSharpのインストール方法

OpenCVはシンプルな画像表示用のウィンドウも用意されているので、簡単に画像処理を試したい場合には非常に良いのですが、少し凝ったウィンドウを作成しようとすると、やっぱり.NETからOpenCVを触りたくなります。

 

.NETの言語(VB.NET、C#、C++/CLI)からOpenCVを使う方法は、だいたい以下の通り

  • .NETのラッパーライブラリを使う
  • 自作でラッパーライブラリを作成する
  • C++/CLIから直接使う

となりますが、実質的にはOpenCvSharpを使う事になると思います。

 

OpenCvSharpのインストール方法は、現在ではNuGetによりプロジェクトごとにインストールします。

 

OpenCvSharpのインストール方法

まず、インストールするC#プロジェクトを用意します。

新規でC#プロジェクトを作成する場合は、次のように行います。

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

次に Windowsフォームアプリケーション(.NET FRamework)を選択し、次へをクリックします。

プロジェクト名、場所を指定し、作成をクリックします。

これで、以下のようにフォームが表示されたらベースとなるC#プロジェクトが作成されています。

 

次に、このC#プロジェクトにNuGetでOpenCvSharpをインストールします。

メニューのプロジェクト→NuGetパッケージの管理をクリックします。

表示された画面で、 参照 を選択し、その下のテキストボックスに OpenCvSharp と入力すると、OpenCvSharpの一覧が表示されるので、この中から OpenCvSharp.Windows を選択します。

OpenCvSharp.Windows を選択すると、右側に インストール ボタンが表示されるので、これをクリックします。

しばらくすると、インストールが完了します。

OpenCvSharpがインストールされたか?確認するには、プロジェクトの参照の部分の表示を展開すると、OpenCvSharpの名前空間が表示されている事を確認します。

簡単にOpenCvSharpの動作を確認します。

ツールボックスの中から Button を選択し、フォーム上にドラッグ&ドロップします。

ボタンをダブルクリックし、C#コードを表示し、上の方に、

using OpenCvSharp;

と入力し、ボタンイベントの部分に以下のように記載します。

private void button1_Click(object sender, EventArgs e)
{
    var img = new Mat(new OpenCvSharp.Size(256, 256), MatType.CV_8UC3, new Scalar(35, 123, 254));

    Cv2.ImShow("Image", img);
}

参考までに、Formの全コードを示します。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using OpenCvSharp;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var img = new Mat(new OpenCvSharp.Size(256, 256), MatType.CV_8UC3, new Scalar(35, 123, 254));
            Cv2.ImShow("Image", img);
        }
    }
}

この状態で、▶開始 ボタンをクリックし、以下のように表示されれば OpenCvSharp のインストールは成功しています。

 

OpenCvSharpを使うポイント

2021年現在、OpenCVの情報はPythonであふれているので、OpenCvSharpの情報を探すのは難しくなってきています。

OpenCvSharpの情報を入手するには、少し古くなりましたが、作者であるSchimaさんのページを参照することをお勧めします。

http://schima.hatenablog.com/archive/category/OpenCvSharp

リファレンスは英語になりますが、こちらです。

http://shimat.github.io/opencvsharp/api/OpenCvSharp.html

 

あとは、OpenCvSharpは基本的にOpenCVのC++版のラッパーライブラリであるため、OpenCVのC++の情報を検索し、OpenCvSharpでは、どうするのか?を推測するのもイイかと思います。

 

参考

https://github.com/shimat/opencvsharp

http://shimat.github.io/opencvsharp/api/OpenCvSharp.html

OpenCVへ戻る

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

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


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

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

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

 

上記リンク先へ行き、OpenCV-2.3.1-win-superpack.exeをクリックしてファイルをダウンロードして下さい。

 

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

ダウンロードしたファイル(OpenCV-2.3.1-win-superpack.exe)をダブルクリックすると、ファイルの解凍が始まるので、ここでは c:\ に解凍する事にします。(慣れている人はどこでも構いません。)
Extract to:の部分に  c:\ と入力して下さい。

 

 

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

c:\opencv
┣ 3rdparty
┣ android
┣ build
┃┣ common
┃┣ gpu
┃┣ include
┃┣ python
┃┣ x64
┃┃ ┣mingw
┃┃ ┣vc9
┃┃ ┗vc10
┃┗ x86
┃  ┣mingw
┃  ┣vc9
┃  ┗vc10
┃   ┣bin
┃   ┣lib
┃   ┗staticlib
┣ data
┣ doc
┣ include
┣ module
┗ samples

 

次にダウンロードしたdllファイルをPCから使えるようにPathの設定というのを行います。

 

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

 

 

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

 

 

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

 

 

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

 

 

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

 

;C:\opencv\build\x86\vc10\bin

 

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

 

上記の設定は32bitOSでVisual Studio2010を使う場合の設定です。
使用する環境に合わせてディレクトリを指定して下さい。

 

32bit、Visual Studio2008の場合 C:\opencv\build\x86\vc9\bin
32bit、Visual Studio2010の場合 C:\opencv\build\x86\vc10\bin
64bit、Visual Studio2008の場合 C:\opencv\build\x64\vc9\bin
64bit、Visual Studio2010の場合 C:\opencv\build\x64\vc10\bin

 

64bitOSを使っていても32bitでプログラムする場合は x86 フォルダ内のbinディレクトリを指定して下さい。
64bitを使う場合は、VisualStudioのプラットフォームをx64にして下さい。

 

TBBの入手、ダウンロード

OpenCV2.3.1のバイナリ版(コンパイルされているdll)を使う場合は、TBB(Intel Threading Building Blocks)という並列処理用のライブラリが必要となります。
OpenCVをダウンロードすると \opencv\build\common\tbb のフォルダにTBBのdllが入っているのですが、debug版が不足してます。

 

そのため、TBBのライブラリを入手します。

 

入手先
http://threadingbuildingblocks.org/

上記リンクのページへ行き、上側のメニューのDownloads⇒ページ中央部のStable Releaseと移動し、最新のバージョンのTBBをクリックします。(2012年1月現在、tbb40_20111130oss

 

次にWindows版のDownloadボタンをクリックし、ファイルをダウンロードします。
Windows版の場合、tbb40_20111130oss_win.zip

 

ダウンロードしたファイルを解凍すると下記のようなフォルダ構成になっています。
\tbb40_20111130oss_win\tbb40_20111130oss
┣ bin
┃┣ ia32
┃┃ ┣vc8
┃┃ ┣vc9
┃┃ ┗vc10
┃┗ intel64
┣ doc
┣ examples
┣ include
┗ lib

 

そこで、今回は32bitOSでVisualStudio2010を使う事を想定しているので、
フォルダ(\tbb40_20111130oss_win\tbb40_20111130oss\bin\ia32\vc10)内にあるdllファイル

 

tbb.dll、tbb_debug.dll、tbb_preview.dll、tbb_preview_debug.dll、tbbmalloc.dll、tbbmalloc_debug.dll、tbbmalloc_proxy.dll、tbbmalloc_proxy_debug.dll

 

を全てOpenCVのbinフォルダ(C:\opencv\build\x86\vc10\bin)へコピーして下さい。
32bit/64bit、VisualStudioのバージョンによりフォルダが異なるので、環境に合わせてフォルダを選択して下さい。

 

これで、OpenCVの設定は完了です。

 

VisualStudio2010での使用方法

使用するのはVisualStudio C++ 2010 Express以上のエディションで大丈夫です。

 

VisualStudio2010を起動し、新しいプロジェクトをクリックし、左側のメニューのWin32を選択した状態でWin32コンソールアプリケーションをクリックします。

 

 

適当な名前(上図ではOpenCV2.3.1Sample)を付け、保存する場所を指定し、OKボタンをクリックします。

 

すると下記のようなソースコードが表示されます。

 

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

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
	return 0;
}

 

次にOpenCVのヘッダファイルが、今回作成したプロジェクトから参照できるように設定を行います。

 

プロジェクトの名前の部分を右クリックし、プロパティを選択します。

 

 

表示されたウィンドウ右上の構成を全ての構成にし、構成のプロパティ⇒C/C++⇒全般を選択して、OpenCV2のフォルダのあるディレクトリ(C:\opencv\build\include)を追加のインクルードディレクトリに指定します。

 

 

以上の設定を行い、ソース部分を下記のようにすると、ガウシアンフィルタ処理を行う簡単なサンプルプログラムが実行できると思います。

 


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

#include "stdafx.h"

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

#ifdef _DEBUG
    //Debugモードの場合
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_core231d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_imgproc231d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_highgui231d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_objdetect231d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_contrib231d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_features2d231d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_flann231d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_gpu231d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_haartraining_engined.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_legacy231d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_ts231d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_video231d.lib")
#else
    //Releaseモードの場合
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_core231.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_imgproc231.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_highgui231.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_objdetect231.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_contrib231.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_features2d231.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_flann231.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_gpu231.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_haartraining_engined.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_legacy231.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_ts231.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_video231.lib")
#endif

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

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

 

ちなみに、libファイルは全て必要ではなく、おおむね

 

opencv_core231、opencv_imgproc231、opencv_highgui231、opencv_objdetect231

 

の4種類ぐらいである程度動作すると思います。(使用する関数によって必要なlibファイルが決まります。)

 

また、libファイルのファイル名に含まれる数字部分がOpenCVのバージョンを示し、ファイル名の最後についているdの文字がDebug用のlibファイル、dの無いファイルがRelease用のlibファイルとなっています。

 

その他

OpenCV2.3.1においてもCMakeを使って自分でOpenCVをコンパイルする事が可能です。

 

CMakeのソースコードにはOpenCV-2.3.1-win-superpack.exeを解凍したフォルダ(opencv)を指定して下さい。

 

OpenCV2.3の場合の説明ですが、詳細は下記ページを参照下さい。

 

https://imagingsolution.net/program/opencv/opencv2-3/opencv2-3-downlaod-install/#compile-opencv

 

基本的にOpenCVなどのライブラリを使う場合は、ライブラリの3点セット(*.dll、*.lib、*.h)をいかに使うか?がポイントになります。

 

余裕のある方は下記ページも参考にしてみて下さい。

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

 

これを覚えておくと、OpenCVがバージョンアップした場合や他のライブラリを使う場合など、応用ができると思います。
 

OpenCVへ戻る

 

OpenCV 2 プログラミングブック OpenCV 2.2/2.3対応

OpenCV2.0から登場したC++インターフェースに日本語で初めて?対応した参考書が登場します。

従来のOpenCV プログラミングブックを持っている方も多いかと思いますが、その第3弾です。

 

全くのOpenCV初心者にとっては、少し難しく感じるかも?しれませんが、これまでC言語のOpenCVを使っていた人が、C++インターフェースを使ってみたいという人には、ちょうど良いと思います。
個人的にはcv::Matを画像データに使う事は無いのですが、行列演算に使う分にはC++インターフェースもかなり、便利だと感じました。
ケーススタディもあるので、参考になると思います。

 

 

正誤表はこちらにあるので、読む前にチェックして下さい。
http://book.mycom.co.jp/support/pc/opencv2/#ERRATA

 

【目次】

 

▽Chapter.1 導入 編
1.1 画像処理とコンピュータビジョン
1.2 OpenCV
1.3 OpenCV 2.0
1.4 ライセンス条項

 

▽Chapter.2 スタートアップ 編
1 OpenCV 2.3簡単インストール(Windows編)
1.1 OpenCVの取得
1.2 OpenCVのインストール
1.3 環境変数の設定
1.4 Visual C++ 2010の環境設定
1.5 新規プログラムの作成方法
1.6 サンプルプログラムの実行

2 OpenCVをMacで利用する
2.1 Xcodeのインストール
2.2 MacPortsのインストール
2.3 OpenCVのインストール
2.4 サンプルプログラムによる動作確認
2.5 XcodeでOpenCVを使う

3 Ubuntu 10.04 LTSでOpenCVを利用する
3.1 設定
3.2 luvcviewでキャプチャ
3.3 luvcviewの使い方
3.4 aptパッケージを使ったOpenCVのインストール
3.5 新しいバージョンのOpenCVのインストール

4 C++インタフェース
1 OpenCV 2.0のC++向けインタフェースについて
2 従来のインタフェースとの違い
3 従来のインタフェースとC++インタフェースを混在させる

5 Pythonインタフェース
5.1 Pythonインタフェースのインストール
5.2 Pythonインタフェースを試す

6 GPUによる画像処理
6.1 OpenCVのGPU対応
6.2 OpenCVでGPUを利用した画像処理を行う方法
6.3 インストール
6.4 プログラムの作成
6.5 サンプル

 

▽Chapter.3 リファレンス 編
1 cv::Matの基本処理
1.1 cv::Matを初期化する
1.2 cv::Matのそのほかの処理
1.3 cv::Matの様々なプロパティ
1.4 std::cout への出力
1.5 cv::Matの型(ビット深度)を変換する
1.6 cv::Matをリサイズする
1.7 cv::Matを変形する
1.8 cv::Matの要素をシャッフルする
1.9 cv::Mat_を使う
1.10 cv::Matxを使う
1.11 cv::Vecを使う
1.12 cv::MatとIplImageの相互変換
1.13 cv::MatとCvMatの相互変換
1.14 cv::MatとSTL vectorの相互変換
1.15 cv::Matとcv::Matxの相互変換
1.16 cv::Matとcv::SparseMatの相互変換
1.17 cv::MatとEigen::Matrixの相互変換
1.18 チャンネルの合成と分離
1.19 列/行ごとの合計,平均値,最小,最大値を求める

2 線形代数
2.1 行列要素の四則演算を行う
2.2 行列同士の積を求める
2.3 cv::Vecの内積と外積
2.4 ノルムを求める
2.5 行列式を求める
2.6 行列の転置
2.7 行列の対角成分を取り出す
2.8 行列のトレースを求める
2.9 逆行列/疑似逆行列を求める
2.10 2次元ベクトルの角度と大きさを求める
2.11 角度と大きさから2次元座標を求める
2.12 行列を反転する
2.13 行列要素の最小値・最大値を求める
2.14 2次元点集合間の最適なアフィン変換を推定する
2.15 連立1次方程式を解く

3 画像処理
3.1 画像を単色で塗りつぶす
3.2 色空間を変換する
3.3 画像サイズを変更する
3.4 画像を垂直・水平に反転する
3.5 画像をネガポジ反転する
3.6 画像を2値化する
3.7 画像ピラミッドを作る
3.8 画像を平滑化する(ぼかす)
3.9 点座標集合に外接する図形を求める
3.10 画像の修復・不要オブジェクトを除去する
3.11 直線を検出する
3.12 円を検出する
3.13 楕円フィッティングを行う
3.14 画像のヒストグラムを計算・描画する
3.15 画像の一部を切り抜いて保存する
3.16 画像の一部のみを処理する
3.17 矩形領域のピクセル値をサブピクセル精度で取得する
3.18 顔を検出する
3.19 目を検出する
3.20 複数の矩形をグループ化する
3.21 チャンネルの合成と分離
3.22 画像に境界領域を追加する

4 描画処理
4.1 線分を描く
4.2 矩形を描く
4.3 円を描く
4.4 楕円・円弧を描く
4.5 折れ線を描く
4.6 ポリゴンを描く
4.7 テキストを描く

5 入出力
5.1 画像を表示する
5.2 ファイルから画像を読み込む
5.3 ファイルに画像を書き出す
5.4 カメラ画像をキャプチャする
5.5 画像をメモリ上でエンコード/デコードする
5.6 YAML/XMLを読み込む・書き出す

6 その他の機能
6.1 OpenCVのバージョンを調べる
6.2 処理時間を計測する
6.3 printf風の表記で文字列を出力する
6.4 CV_Assert/CV_DbgAssert
6.5 CPUがサポートする機能(SSEなど)をチェックする

 

▽Chapter.4 ケーススタディ 編
1 画素値の直接操作
1.1 画素単位の操作
1.2 サンプルプログラムと速度比較
1.3 画像のディザリング – 画素値の直接操作事例1
1.4 画像の細線化 – 画素値の直接操作事例2

2 カメラキャリブレーションとステレオ視による距離計測
2.1 カメラキャリブレーション
2.2 ステレオマッチング

3 画像のJPEG圧縮とPSNRの計算
3.1 PSNR
3.2 プログラムと実行結果

4 簡単な笑顔度の算出
4.1 笑顔度の算出方法
4.2 プログラムと実行結果

5 CAPTCHA画像の生成
5.1 解読を困難にするには
5.2 プログラムと実行結果

6 KinectとOpenCVの連携
6.1 Kinectとは
6.2 ドライバ一式のインストール
6.3 プログラムと実行結果

7 ミニチュア風画像処理
7.1 プログラムと実行結果

8 SURF特徴を使ったイメージモザイキング
8.1 イメージモザイキングの流れ
8.2 特徴点抽出
8.3 前フレームとの特徴点の対応付け
8.4 ホモグラフィ行列の推定と画像ワーピング
8.5 画像の重ね合わせ(画像マスク)
8.6 イメージモザイキングプログラムと実行結果

9 機械学習と画像処理
9.1 学習の種類
9.2 混合ガウス分布とEMアルゴリズムを用いたクラスタリング
9.3 OpenCVにおける実装
9.4 オプティカルフローのクラスタリング
9.5 クラスタリング手法の適用
9.6 実行結果

10 顔の子供化
10.1 子供らしく見える顔
10.2 顔の子供化処理

11 Photoshop向けプラグインの作成
11.1 Photoshop プラグインについて
11.2 環境の作成

12 動画ファイルをカメラ入力のように扱う
12.1 動画ファイルの入力
12.2 VideoCaptureのパラメータ

 

OpenCVへ戻る

 

【OpenCV】バイラテラルフィルタ(cvSmooth,CV_BILATERAL)

OpenCVでバイラテラルフィルタを行う場合はcvSmooth関数の第3引数にCV_BILATERALを指定すればよいのですが、OpenCV.jpのページなどを見ても、なぜか、それらしい処理結果になっているサンプルをあまり見かけません。

 

cvSmoothの定義は

 

void cvSmooth(
         const CvArr* src,
         CvArr* dst,
         int smoothtype = CV_GAUSSIAN,
         int param1 = 3,
         int param2 = 0,
         double param3 = 0,
         double param4 = 0
);

 

で、バイラテラルフィルタの場合、

param1 アパーチャサイズ
param2 アパーチャサイズ
param3 空間領域のシグマ
param4 色領域のシグマ

 

ただし、

インプレースモード 非対応
チャンネル数 1,3
srcの深度 8
dstの深度 8

 

となっています。

 

そこで、param3、param4を変えながら、処理結果の比較をしてみました。

 

【入力画像】

 

【処理画像】

cvSmooth(src, dst, CV_BILATERAL, 11, 11, param3, param4);

(param3, param4) = (0, 0) (50, 0) (100, 0)
(0, 50) (50, 50) (100, 50)
 
(0, 100) (50, 100) (100, 100)

 

という事で、今回使用した画像では

cvSmooth(src, dst, CV_BILATERAL, 11, 11, 50, 100);

としたときが、いかにもバイラテラルフィルタっぽいでしょうか?

param4を少し大きめにした方が良さそうです。

逆にparam1, param2の値を大きくすると、処理時間がやたらとかかるので、あまり大きくできません。

 

OpenCVへ戻る

 

USBカメラ比較

最近フルHDサイズのUSBカメラ Logicool C910 (現行モデルはC920)を購入したのですが、このカメラを使ってOpenCV2.3.1で撮影すると、難なくキレイな画像が撮影できました。

(以前のバージョンのOpenCVでは画像サイズ4:3の縛りがあって、撮影できなかったのですが...)

 

このカメラの画像が想像以上にキレイだったので、手持ちのUSBカメラの画像比較してみました。

撮影条件は下の写真のようにほぼ同様の条件にしました。

 

今回比較に用いたUSBカメラは

  • BUFFALO BWC-30L01
  • Logicool Qcam Fusion
  • Logicool C910

の3つ。

 

それぞれカメラの最大画素数で撮影してみました。(写真をクリックすると等倍で表示されます。)

 

  • BUFFALO BWC-30L01  (640×480)

 

  • Logicool Qcam Fusion (1280×960)

 

  • Logicool C910 (2592×1944)
    ※投稿できるファイル容量の限界を超えたため、jpgファイルで公開しています。

 

これまでUSBカメラでの画像を本気で画像処理に使う気はしなかったのですが、ここまでキレイだと、そこそこイケちゃうかも?

 

 

 

OpenCV-2.3.2-GPU-demo-pack-win32を試す

久々の投稿ですがSourceforgのOpenCVのページにGPUデモのプログラムが公開されていました。

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

 

バージョンもOpenCV2.3.2 って、まだ公開されていないのに...

 

で早速、このファイルをダウンロードし、試してみました。

私の環境は

OS:Windows7 64bit (ただし、サンプルは32bit動作)

CPU:Core i7 870 (2.93GHz)

GPU:NVIDIA GeForce GTX470

 

で、パフォーマンス評価用のサンプル(demo_performance.exe)を実行した時の結果がこちら↓

CPU msec   GPU msec   SPEEDUP   DESCRIPTION
matchTemplate
480 5 x86.5 src 3000, templ 5, 32F, CCORR
545 21 x24.9  src 3000, templ 25, 32F, CCORR
792 31 x25.4  src 3000, templ 5, 32F, CCORR
minMaxLoc
7  1  x4.81  src 2000, 32F, no mask
28  2  x14.3  src 4000, 32F, no mask
 106  3  x28.2  src 8000, 32F, no mask
 remap   
 8  0  x35.9  src 1000,8UC1
 30  0  x50.6  src 2000,8UC1
 124  2  x59.1  src 4000,8UC1
 12  0  x32.2  src 1000,8UC3
 42  1  x34.6  src 2000,8UC3
 164  4  x34.7  src 4000,8UC3
 11  0  x37.8  src 1000,8UC4
 40  0  x41.4  src 2000,8UC4
 156  3  x43.7  src 4000,8UC4
 29  0  x79.7  src 1000,16SC3
 117  1  x88.8  src 2000,16SC3
 481  4  x98.1  src 4000,16SC3
 dft   
 107  3  x29.2  size 1000, 32FC2, complex-to complex
 402 8  x45.3  size 2000, 32FC2, complex-to complex
 1781  32  x55.4  size 4000, 32FC2, complex-to complex
 cornerHarris
 129  19  x6.55  size 2000, 32F
 499  70  x7.06  size 4000, 32F
 integral
28 15 x1.82  size 4000, 8U
20 9 x2.04  size 4000, 8U
20 9 x2.11  size 4000, 8U
21 9 x2.2  size 4000, 8U
21 9 x2.15  size 4000, 8U
norm
139 5 x27.3 size 2000, 32FC4, NORM_INF
310 8 x35.2 size 3000, 32FC4, NORM_INF
555 14 x38.2 size 4000, 32FC4, NORM_INF
meanShift
304 8 x36.3  size 400, 8UC3 vs 8UC4
1187 29 x40.2  size 800, 8UC3 vs 8UC4
SURF
5179 117 x43.9
BruteForceMatcher
1230 8 x144 match
1257 9 x136 knnMatch, 2
1301 9 x139 knnMatch, 3
1220 9 x135 radiusMatch
magnitude
41 0 x86 size 2000
88 1 x85 size 3000
162 1 x95 size 4000
add
10 0 x20.1 size 2000, 32F
22 1 x21.4 size 3000, 32F
41 1 x23.9 size 4000, 32F
log
25 0 x55.8 size 2000, 32F
54 0 x66.1 size 3000, 32F
97 1 x71.3 size 4000, 32F
exp
25 0 x53 size 2000, 32F
58 0 x73.7 size 3000, 32F
10 1 x74.6 size 4000, 32F
mulSpectrums
24 0 x53 size 2000, 32F
58 0 x73.7 size 3000, 32F
101 1 x74.6 size 4000, 32F
resize
7 0 x33.5 size 1000, 8UC1, up
28 0 x50.4 size 2000, 8UC1, up
64 1 x53.3 size 3000, 8UC1, up
2 0 x26.6 size 1000, 8UC1, down
8 0 x51.6 size 2000, 8UC1, down
18 0 x94.6 size 3000, 8UC1, down
21 2 x8.5 size 1000, 8UC3, up
82 8 x10.2 size 2000, 8UC3, up
187 17 x10.9 size 3000, 8UC3, up
7 0 x13.8 size 1000, 8UC3, down
26 1 x23.8 size 2000, 8UC3, down
58 1 x32.7 size 3000, 8UC3, down
27 1 x17.1 size 1000, 8UC4, up
108 4 x26 size 2000, 8UC4, up
250 9 x27.5 size 3000, 8UC4, up
9 0 x14.6 size 1000, 8UC4, down
32 0 x37.4 size 1000, 8UC4, down
73 1 x52 size 1000, 8UC4, down
9 2 x4.72 size 1000, 32FC1, up
41 6 x6.25 size 2000, 32FC1, up
88 13 x6.45 size 3000, 32FC1, up
2 0 x4.92 size 1000, 32FC1, down
10 0 x12.1 size 2000, 32FC1, down
23 1 x17.2 size 3000, 32FC1, down
cvtColor
29 0 x37.1 size 4000, CV_GRAY2BGRA
82 1 x61.8 size 4000, CV_BGR2YCrCb
105 1 x71.3 size 4000, CV_YCrCb2BGR
123 1 x84.4 size 4000, CV_BGR2XYZ
116 1 x83.7 size 4000, CV_XYZ2BGR
195 2 x72.9 size 4000, CV_BGR2HSV
550 2 x189 size 4000, CV_HSV2BGR
erode 
9 3 x2.65 size 2000
22 7 x3.07 size 3000
39 11 x3.35 size 4000
threshold   
0 0  x1.62 size 1000, 8U, THRESH_BINARY
1 0  x6.15 size 2000, 8U, THRESH_BINARY
3 0  x11.1 size 3000, 8U, THRESH_BINARY
6 0  x11.4 size 4000, 8U, THRESH_BINARY
1 0  x7.49 size 1000, 32F, THRESH_BINARY
6 0  x18.8 size 2000, 32F, THRESH_BINARY
14 0  x19.6 size 3000, 32F, THRESH_BINARY
25 1  x21.9 size 4000, 32F, THRESH_BINARY
pow   
5 0 x32.9 size 1000, 32F
20 0 x57.1 size 2000, 32F
44 0 x58.2 size 3000, 32F
83 1 x55.8 size 4000, 32F
projectPoints
49 2 x23.3 size 1000000
37 2 x16.1 size 714285
26 1 x24.5 size510203
19 0 x20.9 size 364430
12 0 x21.6 size 230307
solvePnPRansac
217 118 x1.84 num_points 5000
392 120 x3.25 num_points 18800
1315 127 x10.3 num_points 70688
4984 160 x31 num_points 265786
GaussianBlur
1  0 x4.26 8UC1, size 1000
6  1 x5.61 8UC1, size 2000
14  2 x6.08 8UC1, size 3000
24  3 x6.36 8UC1, size 4000
5  0 x7.57 8UC4, size 1000
24  2 x10.2 8UC4, size 2000
56  4 x11.8 8UC4, size 3000
100  8 x11.7 8UC4, size 4000
2  0 x5.16 32FC1, size 1000
8  1 x7.39 32FC1, size 2000
17  2 x7.6 32FC1, size 3000
33  3 x8.63 32FC1, size 4000
pryDown
18 5 x3.55 8UC1, size 4000
10 2 x3.62 8UC1, size 3000
4 1 x3.41 8UC1, size 2000
1 0 x2.74 8UC1, size 1000
64 6 x9.52 8UC3, size 4000
38 3 x10 8UC3, size 3000
16 1 x9.26 8UC3, size 2000
4 0 x7.71 8UC3, size 1000
66 7 x8.98 8UC4, size 4000
38 4 x9.14 8UC4, size 3000
17 2 x6.36 8UC4, size 2000
4 0 x7.98 8UC4, size 1000
107 6 x15.6 16SC4, size 4000
60 3 x15.6 16SC4, size 3000
26 1 x14.9 16SC4, size 2000
7 0 x10.2 16SC4, size 1000
29 5 x5.7 32FC1, size 4000
17 3 x5.92 32FC1, size 3000
7 1 x5.65 32FC1, size 2000
1 0 x4.62 32FC1, size 1000
88 6 x13 32FC3, size 4000
52 3 x13.8 32FC3, size 3000
22 1 x12.7 32FC3, size 2000
5 0 x4.92 32FC3, size 1000
122 7 x17 32FC4, size 4000
67 4 x16.9 32FC4, size 3000
30 1 x16.6 32FC4, size 2000
7 0 x14.4 32FC4, size 1000
pyrUp
51 5 x8.97 8UC1, size 2000
12 1 x8.52 8UC1, size 1000
145 8 x17.3 8UC3, size 2000
36 2 x16.5 8UC3, size 1000
198 11 x17.6 8UC4, size 2000
48 2 x16.7 8UC4, size 1000
170 8 x19.6 16SC3, size 2000
44 2 x20.1 16SC3, size 1000
69 5 x12.2 32FC1, size 2000
17 1 x11.4 32FC1, size 1000
205 7 x27.3 32FC3, size 2000
21 1 x26.2 32FC3, size 1000
equalizeHist
2 1 x1.93 size 1000
10 2 x4.78 size 2000
23 3 x6.37 size 3000
Canny
29 3  x9.63
reduce
1 0 x7.79 size 1000, dim = 0
1 0 x10.1 size 1000, dim = 1
6 0 x14.5 size 2000, dim = 0
6 0 x25.2 size 2000, dim = 1
13 0 x17.5 size 3000, dim = 0
13 0 x29.3 size 3000, dim = 1

average GPU speedup: x29.202

 

sizeの表記は、size1000の場合、画像サイズは1000×1000となります。

 

一般的にGPUを使った画像処理ではメモリの転送時間がかかり処理時間トータルでは、あまり高速化されない

と言われる場合も多いので、ソースコードを見てみないと、いまいち結果をそのまま信用できない...

でも、とりあえずは、そこそこ速そうな結果でした

 

ソースコードは こちら

https://code.ros.org/trac/opencv/changeset/6950?utm_source=twitterfeed&utm_medium=twitter

 

OpenCVへ戻る

 

OpenCV2.3.1が公開されました。

OpenCV2.3.1のインストール方法については、別途記事にまとめました。
下記を参照願います。
OpenCV2.3.1の入手、ダウンロード、インストール、環境設定


 

本日(2011.8.18)、OpenCV 2.3.1が公開されました。

 

Android版の2.3.1のβ版は比較的前から公開されていましたが、今回はWindows版が公開されました。

 

ただし、OpenCV-2.3.1-win-superpack.exe のコンパイル済み版のみ?

と思っていたら、OpenCV-2.3.1-win-superpack.exeを解凍して出来たopencvというフォルダにソースコードが格納されているので、このフォルダをCMakeのsource codeフォルダに指定すればOKです。

 

入手先

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

変更内容

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

 

まだ、実際には触っていませんが、まずは報告まで。

 

インストール方法についてはVer2.3.0とフォルダ構成が若干異なりますが、『OpenCV-2.3.0-win-superpack.exe』を使うときとほぼ同じなので、下記、リンク先の記事を参照下さい。

libファイルの2.3.0の部分を2.3.1に読み替えて参照下さい。

 

(参考)

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

https://imagingsolution.net/program/opencv/opencv2-3/opencv2-3-downlaod-install/

【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の使い方など)

【OpenCV2対応参考書籍】OpenCV 2 Computer Vision Application Programming Cookbook

2011.5月現在、OpenCV2以降に対応した参考書籍としては、まだ、発売されていませんが、これのみ?しかも英語

 

 

OpenCV Ver2.0からはC++インターフェースが追加され、大きく変わったのですが、このC++に対応していると思われる?この書籍の概要は以下の通りです。

 

  • Teaches you how to program computer vision applications in C++ using the different features of the OpenCV library
  • Demonstrates the important structures and functions of OpenCV in detail with complete working examples
  • Describes fundamental concepts in computer vision and image processing
  • Gives you advice and tips to create more effective object-oriented computer vision programs
  • Contains examples with source code and shows results obtained on real images with detailed explanations and the required screenshots

 

なにせ、発売前なので、詳細は不明ですが、気になるところです。

 

OpenCVへ戻る

 

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