画像処理ソリューション
これを見れば画像処理の入門から基礎~応用まで全てがわかるのを目指して!
   
翻訳(Translate)

プロフィール

ニックネーム:Akira
東京都の町田事業所に勤務
画像処理ソフトの開発を行っています。リンクフリーです!
詳細プロフィールは こちら
お問い合わせは、こちら↓

【補助HP】
画像処理ソリューションWeb版 【Newブログ】
イメージングソリューション

スポンサーリンク


カテゴリ

最近のコメント

カレンダー

01 | 2017/02 | 03
S M T W T F S
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 - - - -

趣味のブログ

iPhone萬歳!
iPhoneの情報いろいろ。
ブログ学習帳
ブログ、SEO、アフィリエイト情報など(まだまだこれから)
俺流クラフト日記
ハンドメイド作品の記録(現在、放置中)

スポンサーリンク 最近の記事
(09/18)  計測測定展に光切断のデモを出展しました
(08/17)  ディジタル画像技術事典200に記事が載りました
(06/09)  光切断を画像センシング展で公開
(05/14)  中国(上海)へ行って来ました
(04/12)  韓国へ行って来ました
(03/10)  私の求める新人像
(01/18)  エレクトロテストジャパンにカラー光切断法のデモを出展しました。
(12/23)  ユニークアクセス200万達成!
(12/10)  【カラー光切断法】YouTube動画まとめ
(11/04)  国際画像機器展2014にカラー光切断法を出展します。
(10/05)  第25回コンピュータビジョン勉強会@関東に参加してきました。
(09/08)  フーリエ変換の記事を追加しました。
(08/09)  【画像処理】ランキング低下中
(07/06)  記事の更新が停滞中...
(06/08)  画像センシング展2014でカラー光切断法のデモを行います。
(05/17)  カラー光切断法の動画を公開しました。
(04/30)  ソニーα NEX-5Rで星空撮影
(04/10)  カラー光切断法の取込結果を追加しました
(03/08)  Korea Vision Show 2014へ行ってきました
(02/05)  フーリエ変換シリーズを始めます。
(01/06)  2014年、あけましておめでとうございます。
(12/04)  カラー光切断法を公開(国際画像機器展2013にて)
(11/13)  国際画像機器展2013に出展します
(10/14)  「画像処理のためのC#」はじめます。
(09/16)  【C#,VB.NET】高速描画コントロールをバージョンアップしました。
(09/04)  拡大鏡に輝度値表示、ルーラー機能を追加した個人ツールを公開
(08/05)  7月の拍手Top5
(07/06)  2013年6月人気記事Top5
(05/12)  SONY α NEX-5Rレビュー
(04/24)  SONY α NEX-5RY購入

【OpenCV2.2】Windows7(64bit)でUSBカメラが動作せず

OpenCV2.2において、USBカメラから画像を取得しようとすると、どうやら動作してくれないらしい。

【評価環境】
Windows7 64bit
OpenCV-2.2.0-win32-vs2010.exeを使用
使用サンプルプログラム:http://imagingsolution.blog107.fc2.com/blog-entry-208.htmlに記載のもの

気になったので、Ticketが無いか?ここ(https://code.ros.org/trac/opencv/report/2?USER=anonymous&page=2)で調べてみたら、やっぱりそれらしき報告がある。
https://code.ros.org/trac/opencv/ticket/735

(追加情報)dandelionさんより情報を頂きました。
http://pr.willowgarage.com/wiki/OpenCVMeetingNotes/Minutes%202010-12-14

OpenCV2.1だと動作してくれているので、OpenCV2.2は動画系が総崩れか???

でも、OpenCV2.1だとcvLoadImageで大きい画像が開けないバグもあるので、結局、使えそうな安定版はOpenCV2.0かな?


Loading...
スポンサーリンク

スポンサーリンク 最近の記事
(09/18)  計測測定展に光切断のデモを出展しました
(08/17)  ディジタル画像技術事典200に記事が載りました
(06/09)  光切断を画像センシング展で公開
(05/14)  中国(上海)へ行って来ました
(04/12)  韓国へ行って来ました
(03/10)  私の求める新人像
(01/18)  エレクトロテストジャパンにカラー光切断法のデモを出展しました。
(12/23)  ユニークアクセス200万達成!
(12/10)  【カラー光切断法】YouTube動画まとめ
(11/04)  国際画像機器展2014にカラー光切断法を出展します。
(10/05)  第25回コンピュータビジョン勉強会@関東に参加してきました。
(09/08)  フーリエ変換の記事を追加しました。
(08/09)  【画像処理】ランキング低下中
(07/06)  記事の更新が停滞中...
(06/08)  画像センシング展2014でカラー光切断法のデモを行います。
(05/17)  カラー光切断法の動画を公開しました。
(04/30)  ソニーα NEX-5Rで星空撮影
(04/10)  カラー光切断法の取込結果を追加しました
(03/08)  Korea Vision Show 2014へ行ってきました
(02/05)  フーリエ変換シリーズを始めます。
(01/06)  2014年、あけましておめでとうございます。
(12/04)  カラー光切断法を公開(国際画像機器展2013にて)
(11/13)  国際画像機器展2013に出展します
(10/14)  「画像処理のためのC#」はじめます。
(09/16)  【C#,VB.NET】高速描画コントロールをバージョンアップしました。
(09/04)  拡大鏡に輝度値表示、ルーラー機能を追加した個人ツールを公開
(08/05)  7月の拍手Top5
(07/06)  2013年6月人気記事Top5
(05/12)  SONY α NEX-5Rレビュー
(04/24)  SONY α NEX-5RY購入

【OpenCV2.2】新規プロジェクトの作成方法

メインページOpenCV

OpenCVを始めたばかりのころ、OpenCVのサンプルプログラムはOpenCV.jpのHPにサンプルプログラムは載っていますが、これをどうやって使えばいいのか?分からなかった覚えがあります。
ということで、これらのサンプルプログラムを使うためのプロジェクトの作成方法を示します。

サンプルプロジェクトはこちらに公開しています。

今回はOpenCV2.2およびVisual Studio2010を用いた場合を例にとって紹介します。

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

Visual Studio を起動し、新しいプロジェクトをクリックします。
OpenCV2.2新規プロジェクトの作成方法

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

OpenCV2.2新規プロジェクトの作成方法
OKボタンをクリックし、次へをクリックします。
OpenCV2.2新規プロジェクトの作成方法
さらに表示されたウィンドウの完了をクリックします。
OpenCV2.2新規プロジェクトの作成方法
すると、空の状態のソースコードが作成されます。
OpenCV2.2新規プロジェクトの作成方法
OpenCV.jpのサンプルとは、mainの部分がちょっと異なりますが、気にせず、そのままにしておいて下さい。

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

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

プロジェクトのプロパティで構成プロパティ→C/C++→全般追加のインクルードディレクトリ
C:\OpenCV2.2\include
を指定します。

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

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

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


#include "stdafx.h"

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

#include "opencv2\\opencv.hpp"

#ifdef _DEBUG
    //Debugモードの場合
    #pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_core220d.lib")
   
#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_imgproc220d.lib")
   
#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_highgui220d.lib")
   
#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_objdetect220d.lib")
    //以下、必要に応じて追加
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_ml220d.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_features2d220d.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_video220d.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_calib3d220d.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_flann220d.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_contrib220d.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_legacy220d.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_gpu220d.lib")

#else
    //Releaseモードの場合
   
#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_core220.lib"
   
#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_imgproc220.lib")
   
#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_highgui220.lib")
   
#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_objdetect220.lib")
    //以下、必要に応じて追加
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_ml220.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_features2d220.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_video220.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_calib3d220.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_flann220.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_contrib220.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_legacy220.lib")
    //#pragma comment(lib,"C:\\OpenCV2.2\\lib\\opencv_gpu220.lib")

#endif

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

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

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

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

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

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

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

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

    return 0;
}


【関連記事】
OpenCV2.2の入手、ダウンロード、インストール、環境設定


Loading...
スポンサーリンク

スポンサーリンク 最近の記事
(09/18)  計測測定展に光切断のデモを出展しました
(08/17)  ディジタル画像技術事典200に記事が載りました
(06/09)  光切断を画像センシング展で公開
(05/14)  中国(上海)へ行って来ました
(04/12)  韓国へ行って来ました
(03/10)  私の求める新人像
(01/18)  エレクトロテストジャパンにカラー光切断法のデモを出展しました。
(12/23)  ユニークアクセス200万達成!
(12/10)  【カラー光切断法】YouTube動画まとめ
(11/04)  国際画像機器展2014にカラー光切断法を出展します。
(10/05)  第25回コンピュータビジョン勉強会@関東に参加してきました。
(09/08)  フーリエ変換の記事を追加しました。
(08/09)  【画像処理】ランキング低下中
(07/06)  記事の更新が停滞中...
(06/08)  画像センシング展2014でカラー光切断法のデモを行います。
(05/17)  カラー光切断法の動画を公開しました。
(04/30)  ソニーα NEX-5Rで星空撮影
(04/10)  カラー光切断法の取込結果を追加しました
(03/08)  Korea Vision Show 2014へ行ってきました
(02/05)  フーリエ変換シリーズを始めます。
(01/06)  2014年、あけましておめでとうございます。
(12/04)  カラー光切断法を公開(国際画像機器展2013にて)
(11/13)  国際画像機器展2013に出展します
(10/14)  「画像処理のためのC#」はじめます。
(09/16)  【C#,VB.NET】高速描画コントロールをバージョンアップしました。
(09/04)  拡大鏡に輝度値表示、ルーラー機能を追加した個人ツールを公開
(08/05)  7月の拍手Top5
(07/06)  2013年6月人気記事Top5
(05/12)  SONY α NEX-5Rレビュー
(04/24)  SONY α NEX-5RY購入

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

メインページOpenCV


※現在OpenCV2.3が公開されています。
  OpenCV2.3についての解説は
     OpenCV2.3の入手、ダウンロード、インストール、環境設定
  を参照下さい。
     下記はOpenCV2.2のときのものです。



OpenCV2.2は内容こそ、そこそこ変更になったものの、OpenCVのインストール方法はOpenCV2.1とほぼ同じです。
これまでにもインストール方法についてはOpenCV1.0OpenCV2.0OpenCV2.1と紹介してきたので、今回も簡単に紹介したいと思います。

OpenCV2.1のインストール方法については、VisualStudio2010向けのインストールパッケージ(OpenCV-2.2.0-win32-vs2010.exe)を使う方法と、64bit対応やIPP、TBBなどのへの細かい設定をCMakeというソフトを使ってOpenCVをビルドする方法とがあるのですが、今回は前者の方を説明します。後者の方は少し設定が難しくなるので、初心者の方にはあまりお勧めできませんが、やりたい場合はOpenCV2.1を参考に設定してみて下さい。

ただし、OpenCV-2.2.0-win32-vs2010.exeを使った場合でもVIsual Studio2008でも、64bitOSでも動作(32bit動作)動作します。VIsual Studio2008で動作させるには、おそらくMicrosoft Visual C++ 2010 再頒布可能パッケージが必要になると思います。(私の環境ではVS2005 Standard、VS2008Ex、VS2010Exとインストールしているので、未評価です。)

OpenCV2.2の入手

OpenCV2.2は以下のページより入手します。
http://sourceforge.net/projects/opencvlibrary/

このページの『Download Now!』をクリックして、ファイル(OpenCV-2.2.0-win32-vs2010.exe)を入手します。
OpenCV2.2の入手、ダウンロード、インストール、環境設定

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

設定方法は、メニューのプロジェクト→プロパティでプロパティページを開きます。
OpenCV2.2の入手、ダウンロード、インストール、環境設定
構成プロパティ→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などの関数を使う場合にはコメントアウトは外して下さい。


【関連記事】
新規プロジェクトの作成方法


Loading...
スポンサーリンク

スポンサーリンク 最近の記事
(09/18)  計測測定展に光切断のデモを出展しました
(08/17)  ディジタル画像技術事典200に記事が載りました
(06/09)  光切断を画像センシング展で公開
(05/14)  中国(上海)へ行って来ました
(04/12)  韓国へ行って来ました
(03/10)  私の求める新人像
(01/18)  エレクトロテストジャパンにカラー光切断法のデモを出展しました。
(12/23)  ユニークアクセス200万達成!
(12/10)  【カラー光切断法】YouTube動画まとめ
(11/04)  国際画像機器展2014にカラー光切断法を出展します。
(10/05)  第25回コンピュータビジョン勉強会@関東に参加してきました。
(09/08)  フーリエ変換の記事を追加しました。
(08/09)  【画像処理】ランキング低下中
(07/06)  記事の更新が停滞中...
(06/08)  画像センシング展2014でカラー光切断法のデモを行います。
(05/17)  カラー光切断法の動画を公開しました。
(04/30)  ソニーα NEX-5Rで星空撮影
(04/10)  カラー光切断法の取込結果を追加しました
(03/08)  Korea Vision Show 2014へ行ってきました
(02/05)  フーリエ変換シリーズを始めます。
(01/06)  2014年、あけましておめでとうございます。
(12/04)  カラー光切断法を公開(国際画像機器展2013にて)
(11/13)  国際画像機器展2013に出展します
(10/14)  「画像処理のためのC#」はじめます。
(09/16)  【C#,VB.NET】高速描画コントロールをバージョンアップしました。
(09/04)  拡大鏡に輝度値表示、ルーラー機能を追加した個人ツールを公開
(08/05)  7月の拍手Top5
(07/06)  2013年6月人気記事Top5
(05/12)  SONY α NEX-5Rレビュー
(04/24)  SONY α NEX-5RY購入

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

メインページOpenCV

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などを使うのを推奨とされています。

Loading...
スポンサーリンク

スポンサーリンク 最近の記事
(09/18)  計測測定展に光切断のデモを出展しました
(08/17)  ディジタル画像技術事典200に記事が載りました
(06/09)  光切断を画像センシング展で公開
(05/14)  中国(上海)へ行って来ました
(04/12)  韓国へ行って来ました
(03/10)  私の求める新人像
(01/18)  エレクトロテストジャパンにカラー光切断法のデモを出展しました。
(12/23)  ユニークアクセス200万達成!
(12/10)  【カラー光切断法】YouTube動画まとめ
(11/04)  国際画像機器展2014にカラー光切断法を出展します。
(10/05)  第25回コンピュータビジョン勉強会@関東に参加してきました。
(09/08)  フーリエ変換の記事を追加しました。
(08/09)  【画像処理】ランキング低下中
(07/06)  記事の更新が停滞中...
(06/08)  画像センシング展2014でカラー光切断法のデモを行います。
(05/17)  カラー光切断法の動画を公開しました。
(04/30)  ソニーα NEX-5Rで星空撮影
(04/10)  カラー光切断法の取込結果を追加しました
(03/08)  Korea Vision Show 2014へ行ってきました
(02/05)  フーリエ変換シリーズを始めます。
(01/06)  2014年、あけましておめでとうございます。
(12/04)  カラー光切断法を公開(国際画像機器展2013にて)
(11/13)  国際画像機器展2013に出展します
(10/14)  「画像処理のためのC#」はじめます。
(09/16)  【C#,VB.NET】高速描画コントロールをバージョンアップしました。
(09/04)  拡大鏡に輝度値表示、ルーラー機能を追加した個人ツールを公開
(08/05)  7月の拍手Top5
(07/06)  2013年6月人気記事Top5
(05/12)  SONY α NEX-5Rレビュー
(04/24)  SONY α NEX-5RY購入

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

のびのびになったOpenCV2.2.0がついに2010.12.5に公開されました。

入手先は、いつもの
 http://sourceforge.net/projects/opencvlibrary/
より

変更内容については、こちらを参照↓
 http://opencv.willowgarage.com/wiki/OpenCV%20Change%20Logs
日本語版はこちら↓
 http://opencv.jp/opencv2-x-tips/changelog_from_21

OpenCV 2.2はOpenCV 2.1ともずいぶん異なっているようなので、とりあえず、インストール、設定のメモ
(本当にメモなので、間違いなどありましたら、コメント頂けると助かります。)

インストール方法はOpenCV2.1の時に紹介したOpenCV2.1の入手、ダウンロード、インストール、環境設定と、ほぼ同じです。
ちょっとだけ分かりづらかったのが、CMakeでOpenCVをビルドする場合は、CMakeの『Where is the source code』のパスに
 (解凍したフォルダパス)\OpenCV-2.2.0-win\OpenCV-2.2.0
を指定するのと、OpenCVのソリューションで、VisualStudioの設定でビルド→構成マネージャINSTALLビルドのチェックを入れておかないと、ヘッダファイルが作成されない事ぐらいでしょうか?
また、CMakeのオプションで、『BUILD_EXAMPLE』にチェックを入れておくと、サンプルプログラムのプロジェクトも生成されるので、いろいろと参考になりそうです。

今回のバージョンでは、なんと言っても『WITH_CUDA』が気になるところではありますが、まだ、未評価です。

OpenCV-2.2.0-win32-vs2010.exeを使ってデフォルト状態でOpenCVをインストールした場合

【プロジェクトのプロパティの設定】
構成プロパティ→C/C++→全般 の 追加インクルードディレクトリ の設定
(Relese/Debug共通)
C:\OpenCV2.2\.;C:\OpenCV2.2\..;C:\OpenCV2.2\include;C:\OpenCV2.2\include\opencv;C:\OpenCV2.2\modules\core\include;C:\OpenCV2.2\modules\flann\include;C:\OpenCV2.2\modules\imgproc\include;C:\OpenCV2.2\modules\video\include;C:\OpenCV2.2\modules\highgui\include;C:\OpenCV2.2\modules\ml\include;C:\OpenCV2.2\modules\calib3d\include;C:\OpenCV2.2\modules\features2d\include;C:\OpenCV2.2\modules\objdetect\include;C:\OpenCV2.2\modules\legacy\include;C:\OpenCV2.2\modules\contrib\include

構成プロパティ→リンカ→全般 の 追加ライブラリディレクトリ の設定
(Relese/Debug共通)
C:\OpenCV2.2\lib

構成プロパティ→リンカ→入力 の 追加依存ファイル の設定
(Releseの場合)
kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib opencv_core220.lib opencv_flann220.lib opencv_imgproc220.lib opencv_highgui220.lib opencv_ml220.lib opencv_video220.lib opencv_objdetect220.lib opencv_features2d220.lib opencv_calib3d220.lib opencv_legacy220.lib opencv_contrib220.lib $(NOINHERIT)
(Debugの場合)
kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib opencv_core220d.lib opencv_flann220d.lib opencv_imgproc220d.lib opencv_highgui220d.lib opencv_ml220d.lib opencv_video220d.lib opencv_objdetect220d.lib opencv_features2d220d.lib opencv_calib3d220d.lib opencv_legacy220d.lib opencv_contrib220d.lib $(NOINHERIT)

【ソースコード中でのインクルード設定】
#include <opencv2/imgproc/imgproc_c.h>
#include <opencv2/highgui/highgui.hpp>


(2010.12.7追記)
上記の設定はOpenCVのサンプルプログラムから抜き出しただけの設定なのですが、通常はここまで必要では無さそうです。
ヘッダファイルとライブラリファイルは上記のようにプロジェクトのプロパティで設定しても動作しますが、ソースコード中に以下のように記載しても大丈夫です。
//プロジェクトのプロパティ⇒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

もし、『error LNK2001: 外部シンボル ××× は未解決です』 というエラーがでる場合は、pragmaのコメントアウト部分を外してみて下さい。

それぞれのファイルについては、別途、【OpenCV2.2】ライブラリ構成(*.lib,*.hなど)も参照下さい。

サンプルプログラムを見ても従来のC言語ではなく、C++版のcv::の関数を使ったサンプルが増えていますが、画像データのMatのstepが4の倍数になるようにしていないのは、なんとかしてくれないかな~。


Loading...
スポンサーリンク

スポンサーリンク 最近の記事
(09/18)  計測測定展に光切断のデモを出展しました
(08/17)  ディジタル画像技術事典200に記事が載りました
(06/09)  光切断を画像センシング展で公開
(05/14)  中国(上海)へ行って来ました
(04/12)  韓国へ行って来ました
(03/10)  私の求める新人像
(01/18)  エレクトロテストジャパンにカラー光切断法のデモを出展しました。
(12/23)  ユニークアクセス200万達成!
(12/10)  【カラー光切断法】YouTube動画まとめ
(11/04)  国際画像機器展2014にカラー光切断法を出展します。
(10/05)  第25回コンピュータビジョン勉強会@関東に参加してきました。
(09/08)  フーリエ変換の記事を追加しました。
(08/09)  【画像処理】ランキング低下中
(07/06)  記事の更新が停滞中...
(06/08)  画像センシング展2014でカラー光切断法のデモを行います。
(05/17)  カラー光切断法の動画を公開しました。
(04/30)  ソニーα NEX-5Rで星空撮影
(04/10)  カラー光切断法の取込結果を追加しました
(03/08)  Korea Vision Show 2014へ行ってきました
(02/05)  フーリエ変換シリーズを始めます。
(01/06)  2014年、あけましておめでとうございます。
(12/04)  カラー光切断法を公開(国際画像機器展2013にて)
(11/13)  国際画像機器展2013に出展します
(10/14)  「画像処理のためのC#」はじめます。
(09/16)  【C#,VB.NET】高速描画コントロールをバージョンアップしました。
(09/04)  拡大鏡に輝度値表示、ルーラー機能を追加した個人ツールを公開
(08/05)  7月の拍手Top5
(07/06)  2013年6月人気記事Top5
(05/12)  SONY α NEX-5Rレビュー
(04/24)  SONY α NEX-5RY購入

【OpenCV】IplImageの輝度値を参照、設定する

メインページOpenCV

IplImageの輝度値(画素値)を直接参照、設定したい場合はIplImage構造体のimageDataのポインタを参照するばいいのですが、このポインタが符号付き8Bitのポインタ(char*)なので、ちょっと分かりづらいかもしれません。

と、その前に、IplImageの画像データがどのように格納させているか?のおさらいです。

モノクロ8Bit(8Bit、1Channnel)の場合、下図のように画像の左上を原点として、輝度値が格納されています。
画像のメモリ的にはwidtStepバイトの幅で確保され、必ずしも画像の幅(width)と一致しないので、注意して下さい。
(メモリの幅は4の倍数のバイト数になるように調整されています。)
この辺は.NETのBitmapと同じです。

IplImageの輝度値を参照、設定する

24Bitカラー(8Bit、3Channnel)の場合は、同じように画像の左上を原点として、輝度値がBGRBGR・・・の順で格納されています。

IplImageの輝度値を参照、設定する

この事を踏まえて、画像のコントラストを調整するサンプルプログラムは以下のようになります。

//////////////////////////////
// コントラスト調整
// src:入力画像(8Bit)
// dst:出力画像(8Bit)
// scale:輝度値の倍率
// offset:オフセット量
//////////////////////////////

void cv_ScaleShift(IplImage* src, IplImage* dst, double scale, double offset){

    int i, j;
    double val;
   
    //画像データポインタを取得する
    uchar *pSrc = (uchar*)src->imageData;
    uchar *pDst = (uchar*)dst->imageData;

    for (j = 0; j < src->height; j++){
        for (i = 0; i < src->width * src->nChannels; i++){
            //入力データにscaleを掛けてshiftを足す
            val = pSrc[i + j * src->widthStep] * scale + offset;

            //計算結果を0~255の範囲内にする
            val = (0 > val) ? 0 : val;
            val = (val < 255) ? val : 255;

            //計算結果を代入する
            pDst[i + j * dst->widthStep] = (uchar)val;
        }
    }
}

ポインタの参照方法は、人によって好みがあるかと思いますので、上記プログラムの最適化はお任せします。

ただし、上記ブログラムは輝度値の参照方法の説明のために書いただけなので、コントラストを調整したい場合は、OpenCVのcvConvertScale関数を使った方が簡単です。

また、cvSobel関数のように符号付き16Bitの画像データを使う場合もあるかと思いますが、その場合は
16Bitなので1画素に付き2バイト使う事を踏まえて

IplImage* img  = cvCreateImage(cvSize(640, 480), IPL_DEPTH_16S, 1);

short *pBuf = (short*)img->imageData;

//輝度値の参照する座標を(i, j)とした時の輝度値の参照方法
short val = pBuf [i + j * src->widthStep / 2];

のように輝度値を参照します。


OpenCVのChannnelという扱い。
OpenCVを始めたばかりの頃は、なかなか馴染めなかったのですが、よくよく考えるとChannnelを使う事でカラーとモノクロの処理を同じ関数で処理することができるので、結構、便利。
例えば、注目画素の左上の画素を参照する場合、昔だったら
  val = pSrc[i - 1 +( j - 1) * src->widthStep];
のように参照していましたが、これを
  val = pSrc[i - ch +( j - 1) * src->widthStep];
とするだけで、1つの関数でカラー(ch = 3)、モノクロ(ch = 1)対応になってしまうので簡単。

昔は、カラーをR,G,Bに分けて各RGBのプレーンにモノクロのフィルタ処理をして、RGBに戻す。
なんていう処理をしていました...

【関連記事】
IplImage構造体
IplImageからBitmapを確保する

Loading...
スポンサーリンク

スポンサーリンク 最近の記事
(09/18)  計測測定展に光切断のデモを出展しました
(08/17)  ディジタル画像技術事典200に記事が載りました
(06/09)  光切断を画像センシング展で公開
(05/14)  中国(上海)へ行って来ました
(04/12)  韓国へ行って来ました
(03/10)  私の求める新人像
(01/18)  エレクトロテストジャパンにカラー光切断法のデモを出展しました。
(12/23)  ユニークアクセス200万達成!
(12/10)  【カラー光切断法】YouTube動画まとめ
(11/04)  国際画像機器展2014にカラー光切断法を出展します。
(10/05)  第25回コンピュータビジョン勉強会@関東に参加してきました。
(09/08)  フーリエ変換の記事を追加しました。
(08/09)  【画像処理】ランキング低下中
(07/06)  記事の更新が停滞中...
(06/08)  画像センシング展2014でカラー光切断法のデモを行います。
(05/17)  カラー光切断法の動画を公開しました。
(04/30)  ソニーα NEX-5Rで星空撮影
(04/10)  カラー光切断法の取込結果を追加しました
(03/08)  Korea Vision Show 2014へ行ってきました
(02/05)  フーリエ変換シリーズを始めます。
(01/06)  2014年、あけましておめでとうございます。
(12/04)  カラー光切断法を公開(国際画像機器展2013にて)
(11/13)  国際画像機器展2013に出展します
(10/14)  「画像処理のためのC#」はじめます。
(09/16)  【C#,VB.NET】高速描画コントロールをバージョンアップしました。
(09/04)  拡大鏡に輝度値表示、ルーラー機能を追加した個人ツールを公開
(08/05)  7月の拍手Top5
(07/06)  2013年6月人気記事Top5
(05/12)  SONY α NEX-5Rレビュー
(04/24)  SONY α NEX-5RY購入

【OpenCV】実写(写真)をアニメ風にするフィルタ処理

メインページOpenCV

Twitterのアイコンを作るのに、顔写真のまんまだと、ちょっと抵抗があったので、cartoon filter などと言われる実写の画像をアニメ風に変換する処理をOpenCVで作成して、こいつをTwitterのアイコンにしてみました。

といっても、かなり参考にしたのはOpenCV.jpにあるcvAdaptiveThreshold関数のサンプル
これだと輪郭は雰囲気は出ていますが、色がグラデーションがかっているので、cvPyrSegmentation関数を使って減色処理を追加しました。

結果、こんな感じまでできました。

OpenCVで実写(写真)をアニメ風に変換 OpenCVで実写(写真)をアニメ風に変換
処理前 処理後

処理の概要は以下の通り

適応的二値化処理(cvAdaptiveThreshold関数)を使って、指定した範囲内を平均した輝度値よりも指定したしきい値以下となる部分を二値化(今回はその部分を黒にする)して、画像の輪郭を作成します。

【処理前】
OpenCVで実写(写真)をアニメ風に変換

【処理後】
OpenCVで実写(写真)をアニメ風に変換

この部分はOpenCV.jpの処理とほぼ同じ処理を行いましたが、ノイズが多かったので、メディアンフィルタを追加しました。

次に画像ピラミッドを使った画像の分割処理(cvPyrSegmentation関数)を使って、色の減色を行いました。
やっぱりこの部分もOpenCV.jpをかなり参考にしました。

【処理後】
OpenCVで実写(写真)をアニメ風に変換

ただ、この処理に決めるまでに、cvPyrMeanShiftFiltering関数cvSmooth関数のバイラテラルフィルタなども試そうとしたのですが、なぜかエラーが出て、結局、cvPyrSegmentation関数しか使えなかった、という事でこの処理にしました。

あとはcvAndで2つの画像を足し合わせる(ANDをとる)だけ。

【処理後】
OpenCVで実写(写真)をアニメ風に変換

この処理を下記のように関数にまとめてみました。
//---------------------------------------------------------------
//【関数名 】:cv_CartoonFilter
//【処理概要】:アニメフィルタ
//【引数  】:src        = 入力画像(カラー8bit3ch)
//      :dst        = 出力画像(カラー8bit3ch)
//      :  輪郭の設定
//      :BlockSize    = 値を小さくすると輪郭が細かくなる    3, 5, 7・・・
//      :ContThre    = 値が小さいほど輪郭が増える
//      :  減色の設定
//      :PyrLevel = 値が小さいと同じ色の領域が細かくなる
//      :SegmentThre 値が大きいと同じ色の領域が大きくなる
//      :  共通
//      :MedianLevel = ノイズ除去レベル 3, 5, 7・・・
//【戻り値 】:なし
//【備考  】:画像サイズが 幅を(2のPyrLevel乗) もしくは 高さを(2のPyrLevel乗)で
//      :割り切れないない場合、処理できない部分が残ります。
//      :<推奨設定値例>
//      :BlockSize    = 11
//      :ContThre    = 5.0
//      :PyrLevel    = 5
//      :SegmentThre = 30.0
//      :MedianLevel = 5
//---------------------------------------------------------------

void cv_CartoonFilter(IplImage* src, IplImage* dst,
            int BlockSize, double ContThre,
            int    PyrLevel, double SegmentThre, int MedianLevel){

    ////////////////////////////////////////////////////////////////
    //
    // 輪郭画像の作成
    //
    ////////////////////////////////////////////////////////////////


    IplImage* contour_gray  = cvCreateImage (cvGetSize (src), IPL_DEPTH_8U, 1);
    IplImage* contour_color = cvCreateImage (cvGetSize (src), IPL_DEPTH_8U, 3);

    // カラー⇒モノクロ変換
    cvCvtColor (src, contour_gray, CV_BGR2GRAY);
    // 適応的二値化
    cvAdaptiveThreshold (contour_gray, contour_gray, 255,
        CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, BlockSize, ContThre);
    // ノイズ除去
    cvSmooth(contour_gray, contour_gray, CV_MEDIAN, MedianLevel);
    // モノクロ変換⇒カラー
    cvCvtColor (contour_gray, contour_color, CV_GRAY2BGR);
    // 解放
    cvReleaseImage(&contour_gray);

    ////////////////////////////////////////////////////////////////
    //
    // 減色画像の作成
    //
    ////////////////////////////////////////////////////////////////


    CvMemStorage *storage = cvCreateMemStorage (0);
    CvSeq *comp = 0;
    CvRect roi;

    // 領域分割のためにROIをセットする
    roi.x = roi.y = 0;
    roi.width = src->width & -(1 << PyrLevel);
    roi.height = src->height & -(1 << PyrLevel);
    cvSetImageROI (src, roi);
    cvSetImageROI (dst, roi);
    // 画像ピラミッドを使った領域分割
    cvPyrSegmentation (src, dst, storage, &comp, PyrLevel, 255.0, SegmentThre);
    // ノイズ除去
    cvSmooth(dst, dst, CV_MEDIAN, MedianLevel);
    // 解放
    cvReleaseMemStorage (&storage);
    cvResetImageROI(src);
    cvResetImageROI(dst);
   
    ////////////////////////////////////////////////////////////////
    //
    // 輪郭画像 + 減色画像の作成
    //
    ////////////////////////////////////////////////////////////////


    cvAnd(dst, contour_color, dst);


    // 解放

    cvReleaseImage(&contour_color);


}

この関数を使う時は、こんな感じで↓
cv_CartoonFilter(src_img, dst_img, 11, 5.0, 5, 30.0, 5);

3番目以降の値で輪郭の太さや減色の雰囲気などが変わってくるので、上記関数のコメント部分を参考にしながら、いろいろ試してみて下さい。

この処理、思ったより楽しかったので、いろいろ試してみました。

処理前   処理後
OpenCVで実写(写真)をアニメ風に変換 OpenCVで実写(写真)をアニメ風に変換
OpenCVで実写(写真)をアニメ風に変換 OpenCVで実写(写真)をアニメ風に変換
OpenCVで実写(写真)をアニメ風に変換 OpenCVで実写(写真)をアニメ風に変換
OpenCVで実写(写真)をアニメ風に変換 OpenCVで実写(写真)をアニメ風に変換
OpenCVで実写(写真)をアニメ風に変換 OpenCVで実写(写真)をアニメ風に変換
OpenCVで実写(写真)をアニメ風に変換 OpenCVで実写(写真)をアニメ風に変換

楽しい!!!
年賀状にも、この処理を使おうっかな~。

Loading...
スポンサーリンク

スポンサーリンク 最近の記事
(09/18)  計測測定展に光切断のデモを出展しました
(08/17)  ディジタル画像技術事典200に記事が載りました
(06/09)  光切断を画像センシング展で公開
(05/14)  中国(上海)へ行って来ました
(04/12)  韓国へ行って来ました
(03/10)  私の求める新人像
(01/18)  エレクトロテストジャパンにカラー光切断法のデモを出展しました。
(12/23)  ユニークアクセス200万達成!
(12/10)  【カラー光切断法】YouTube動画まとめ
(11/04)  国際画像機器展2014にカラー光切断法を出展します。
(10/05)  第25回コンピュータビジョン勉強会@関東に参加してきました。
(09/08)  フーリエ変換の記事を追加しました。
(08/09)  【画像処理】ランキング低下中
(07/06)  記事の更新が停滞中...
(06/08)  画像センシング展2014でカラー光切断法のデモを行います。
(05/17)  カラー光切断法の動画を公開しました。
(04/30)  ソニーα NEX-5Rで星空撮影
(04/10)  カラー光切断法の取込結果を追加しました
(03/08)  Korea Vision Show 2014へ行ってきました
(02/05)  フーリエ変換シリーズを始めます。
(01/06)  2014年、あけましておめでとうございます。
(12/04)  カラー光切断法を公開(国際画像機器展2013にて)
(11/13)  国際画像機器展2013に出展します
(10/14)  「画像処理のためのC#」はじめます。
(09/16)  【C#,VB.NET】高速描画コントロールをバージョンアップしました。
(09/04)  拡大鏡に輝度値表示、ルーラー機能を追加した個人ツールを公開
(08/05)  7月の拍手Top5
(07/06)  2013年6月人気記事Top5
(05/12)  SONY α NEX-5Rレビュー
(04/24)  SONY α NEX-5RY購入

OpenCVのライセンス

メインページ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というファイルがあるので、そちらを参照下さい。


で、ちょっと話はそれますが、英文が苦手は私は翻訳ソフトに頼ってみたりもするのですが、いくつかのソフトで上記の内容を日本語に変換し、翻訳ソフトの性能比較をしてみました。

bing Translator】 (マイクロソフト)
重要: ダウンロード、コピー、インストールまたは使用する前に読みます。

 ダウンロードすることによって、コピー、インストール、またはソフトウェアを使用して、このライセンスに同意します。
 このライセンスに同意されない場合はダウンロード、インストール、コピーまたはソフトウェアを使用します。


                          ライセンス契約のオープン ソース コンピュータ ビジョン ライブラリ
著作権 (C) 2000年-2008、インテル、無断転載を禁じます。
著作権 (C) 2008年-2009、柳ガレージ社、無断転載を禁じます。
サード パーティの著作権はそれぞれの所有者に帰属します。

再配布および使用ソースおよびバイナリ形式、変更の有無では許されない、次の条件が満たされている場合は、:

 * 前述の著作権表示、このリストの条件、および次の否認ソース コードの再を保持する必要があります。

  * 配布のバイナリ形式では、上記の著作権表示、このリストの条件、次の注意事項は、マニュアルおよび/または配布で提供されるその他の資料を再現する必要があります。

  著作権者の名前は、推奨またはプロモーション商品のこのソフトウェアから派生して特定の事前の書面による許可なしに使用できます。

このソフトウェアは、著作権者と「そのまま」の貢献者とを含む、あらゆる明示的または黙示的保証によって提供されますが、ないまで、商品性および特定目的暗黙保証を否認します。
インテル コーポレーションまたはコントリビューター直接、間接、偶発的、特殊、懲戒的、または間接的な損害に対して、代替商品またはサービスの調達に限らず (損失の使用、データ、または利益; または usiness 中断) 負わないものとしかし原因および責任、契約、厳格責任、または不法行為にかどうか (過失を含むまたはそれ以外の場合)、そのような損害の可能性を通知した場合でも任意の方法をこのソフトウェアの使用に起因します。

Google 翻訳
重要:ダウンロード、コピーの前にお読みください用いた。

 ダウンロードすることにより、コピー、インストールするか、この使用許諾契約に同意し、ソフトウェアを使用します。
 あなたはこのライセンスに同意しない場合は、ダウンロードしない、インストール、コピー、またはソフトウェアを使用します。


                          使用許諾契約書
               オープンソースのコンピュータビジョンのライブラリについて

本文へ(C)は2000年から2008年、インテル社は、すべての権利予約。
本文へ(C)は2008年から2009年、Willow Garageの社は、すべての権利予約。
サードパーティの著作権はそれぞれの所有者に帰属します。

再配布および変更の有無にかかわらず、ソースおよびバイナリ形式で使用するには、次の条件が満たされていることが許可されます:

  *再配布は、上記の著作権通知、本条件の一覧、および下記免責条項を保持しなければならないソースコードのです。

  *再配布は、上記の著作権表示、この条件リスト、およびドキュメントには、次の免責および/または配布物とともに提供されるその他のマテリアルを複製する必要がありますバイナリ形式でです。

  *著作権所有者の名前が支持したり、特定の事前の書面による許可なしに、本ソフトウェアから派生した製品を宣伝するために使用されない場合があります。

このソフトウェアは、著作権保有者と貢献者によって提供されるなど、任意の明示的または黙示的な保証、これらに限定されないが、特定の目的への適合性の黙示の保証を放棄します"のようになります"。
使用、データまたは利益の損失、いかなる場合にも、Intel Corporationまたは寄稿者を含むいずれか、間接的、偶発的、特殊、典型的な、直接または間接的な損害(のが、責任の代替商品またはサービスの調達、これらに限定されないこと。またはusinessは中断)しかし、そのような損害の可能性について知らさ場合でも、契約、厳格責任、または本ソフトウェアの使用に何らかの方法で発生した過失またはその他を含む不法行為()内かどうか、責任のいずれかの理論と発生します。

エキサイト翻訳
重要: ダウンロード、コピー、インストールまたは使用の前に読んでください。
ソフトウェアをダウンロードするか、コピーするか、インストールするか、または使用することによって、あなたはこのライセンスに同意します。
このライセンスに同意しないなら、ダウンロードしないでください、インストールするか、コピーするか、またはソフトウェアを使用しないでください。


許諾契約
オープンソースコンピュータビジョン図書館に

Copyright(C)2000-2008、インテル社、All rights reserved。
著作権(C)2008-2009、Willow Garage Inc.、All rights reserved。
第三者著作権は彼らのそれぞれの所有者の資産です。

変更のあるなしにかかわらず、以下の条件が満たされれば、ソースと二部形式における再分配と使用は受入れられます:

 * 再分配のソースコードのものは上の版権情報、状態のこのリスト、および以下の注意書きを保有しなければなりません。

 * 二部形式における再分配のものは上の版権情報を再生させなければなりません、と状態のこのリストとドキュメンテーション、そして/または、その他の材料における以下の注意書きは分配に前提としました。

 * 著作権保有者の名前は、このソフトウェアから特定の書面による事前の許可なしで得られた製品を宣伝するか、または促進するのに使用されないかもしれません。

このソフトウェアが著作権保有者、「そのままな」貢献者、およびどんな速達によっても提供されるか、または黙示的な保証、包含、他、市場性の黙示的な保証、および特定の目的のためのフィットネスは放棄されます。
そのような損害の可能性についてアドバイスされても、契約、厳しい責任負担、または不法行為(そうでなければ怠慢を含んでいて)にかかわらずインテル社か貢献者がしかしながら、もたらされたどんな直接の、または、間接的であるか、付帯的であるか、特別であるか、模範的であるか、必然的な損害賠償他、 包含、 (; サービス、代替財、使用の損失、データ、または利益の調達; usiness中断)と責任のどんな理論の上でもこのソフトウェアの使用から何らかの方法で起こるのにおいて決して、責任がないでしょう。

Yahoo!翻訳
重要:コピーして、装置するか、使うことをダウンロードする前に、読んでください。

 ソフトウェアをダウンロードするか、コピーするか、インストールするか、使用することによって、あなたはこの許可に同意します。
 あなたがこの許可に同意しないならば、ソフトウェアをダウンロードしないか、インストールしないか、コピーしないか、使用しないでください。


                          ライセンス契約
               オープンソース計算機視覚図書館のために

著作権(C) 2000-2008、インテル社、保有されるすべての権利。
著作権(C) 2008-2009、Willow Garage社、保有されるすべての権利。
第三者著作権は、彼らのそれぞれの所有者の財産です。

以下の条件が満たされるならば、源とバイナリ形式の再分配と使用は、修正の有無にかかわらず、許されます:

  *ソースコードの再分配のものは、上記の著作権通知(状況と以下の断り書きのこのリスト)を保持しなければなりません。

  *バイナリ形式の再分配のものは上記の著作権通知を複写しなければなりません。そして、状況のこのリストとドキュメンテーションや他の材料の以下の断り書きが配布を備えています。

  *著作権者の名前は、特定の先の書面による許諾なしでこのソフトウェアに由来する製品を支持するか、販売促進するのに用いられないかもしれません。

このソフトウェアは「現状のまま」著作権者と誘因によって提供されます、そして、どんな明示または暗黙の保証でも市場性の暗黙の保証と特定の目的のための適合性を含むがこれに限らず否認されます。
決して、インテル社または誘因は、典型的で、少しのdirect,indirect,incidental(スペシャル)に対しても責任がありませんまたは結果として生じる損害賠償∥(代用品またはサービスの入手を含むがこれに限らず;使用の損失、データまたは利益;またはusiness中断)契約、厳格責任または不法行為(怠慢またはその反対を含む)において、たとえ損害の可能性を知らされていたとしても、このソフトウェアの使用からどんな形であれ起こるかどうかに関係なく、原因の如何を問わず、そして、どんな責任の理論に関してでも。

免責事項の部分はそれぞれ微妙にニュアンスが異なるので、自動翻訳をそのまま信用するのは注意が必要です。
固有名詞など完璧には翻訳されにくいようにも思いますが、比較的Yahoo!翻訳が優れているでしょうか?

逆にエキサイト翻訳は、昔は良く使っていましたが、今となっては、笑えるぐらいヒドすぎる~
 

Loading...
スポンサーリンク

スポンサーリンク 最近の記事
(09/18)  計測測定展に光切断のデモを出展しました
(08/17)  ディジタル画像技術事典200に記事が載りました
(06/09)  光切断を画像センシング展で公開
(05/14)  中国(上海)へ行って来ました
(04/12)  韓国へ行って来ました
(03/10)  私の求める新人像
(01/18)  エレクトロテストジャパンにカラー光切断法のデモを出展しました。
(12/23)  ユニークアクセス200万達成!
(12/10)  【カラー光切断法】YouTube動画まとめ
(11/04)  国際画像機器展2014にカラー光切断法を出展します。
(10/05)  第25回コンピュータビジョン勉強会@関東に参加してきました。
(09/08)  フーリエ変換の記事を追加しました。
(08/09)  【画像処理】ランキング低下中
(07/06)  記事の更新が停滞中...
(06/08)  画像センシング展2014でカラー光切断法のデモを行います。
(05/17)  カラー光切断法の動画を公開しました。
(04/30)  ソニーα NEX-5Rで星空撮影
(04/10)  カラー光切断法の取込結果を追加しました
(03/08)  Korea Vision Show 2014へ行ってきました
(02/05)  フーリエ変換シリーズを始めます。
(01/06)  2014年、あけましておめでとうございます。
(12/04)  カラー光切断法を公開(国際画像機器展2013にて)
(11/13)  国際画像機器展2013に出展します
(10/14)  「画像処理のためのC#」はじめます。
(09/16)  【C#,VB.NET】高速描画コントロールをバージョンアップしました。
(09/04)  拡大鏡に輝度値表示、ルーラー機能を追加した個人ツールを公開
(08/05)  7月の拍手Top5
(07/06)  2013年6月人気記事Top5
(05/12)  SONY α NEX-5Rレビュー
(04/24)  SONY α NEX-5RY購入

産業用カメラとOpenCVとの接続サンプル公開

メインページOpenCV

今回は、私が会社でやった仕事の紹介です。

OpenCVではUSBカメラ(Webカメラ)などを使って、簡単に動画を用いた画像処理を実現することができますが、本気で欠陥などの検査をしたい場合や、画像の取り込むタイミングをトリガに合わせて取り込みたい場合などにはUSBカメラでは、物足りないかと思います。

そんな時には、やはり産業用のCCDカメラを使わないと目的の処理が実現出来ない場合がありますが、画像入力ボード(キャプチャボード)と、そのボードを制御するライブラリや専用の画像処理ライブラリなどを揃えると、どうしても高額になってしまいます。

今回は少しは、その敷居を下げるためにも、フリー(BSDライセンス)で使える画像処理ライブラリのOpenCVとの接続サンプルのC++版とC++/CLI版を作成しました。

と言っても、OpenCVのキャプチャ関数(cvCaptureFromCAMなど)に対応した訳ではなく、OpenCVで確保した画像データのIplImageのimageDataのポインタ(メモリ)へCCDカメラから取り込んだ画像データを転送する仕組みのサンプルプログラムとしています。
そのため、OpenCVからカメラの制御などは出来ないのですが、その代わり、画像入力ボード専用のライブラリ(SDK-AcapLib2)を使って制御する事でよりキメの細かい制御を可能としています。

サンプル処理としてはcvFindContours関数を使い、二値化(大津の二値化)、面積、周囲長、フィレ径を求めるブロブ処理を行っています。

処理前処理後
OpenCVの接続サンプルプログラムOpenCVの接続サンプルプログラム

サンプル公開ページはこちら↓
  OpenCV+AcapLib2接続サンプル

さらにプレスリリースも...

サンプルの実体は会員ページに公開してあるのですが、少し分かりづらいので、以下の様にします。
1.会員登録(登録していない場合)
2.会員ページへ移動
3.会員ページの右下にある『ソフトウェアのダウンロード』をクリック
4.ソフトウェア一覧の中央付近、APX-3312、APX-3313、APX-3318の下にある『AcapLib2+OpenCV接続サンプルプログラム(C++、C++/CLI版)』の欄の右側にある『ダウンロードボタン』をクリックでサンプルソフトをダウンロード出来ます。

サンプルプログラムの動作条件としては、
が必要となります。

OpenCVの対応バージョンはVer2.1としていますが、cv::の名前空間は使っていないので、OpenCVを多少ご存知の方であれば、ライブラリファイル(*.lib)やヘッダファイル(*.h)の参照設定を変えれば、他のバージョンでも使用可能です。

上記の画像入力ボードのシリーズは対応しているカメラによって使用できるボードが異なるので、下記対応表でカメラとの接続はご確認下さい。
  カメラ接続リスト

ご興味のある方は製品の問い合わせページよりお問い合わせ下さい。
(製品名は『OpenCV接続サンプルプログラム』と言って頂ければ分かります。)

補足

補足というよりも個人的にはこっちがメイン?!
C++/CLI版のサンプルプログラムには描画部分にオリジナルの.NETユーザーコントロール(ファイル名:avaldata.ail.Graphic.dll)を使用しています。

このコントロールを使うと、画像の拡大や縮小、輝度値の参照など簡単に高機能(だと思っている)な表示が可能となります。

【操作例】
マウスポインタを画像上に合わせ、マウスホイールを上下にさせると、マウスポインタを中心に画像を拡大/縮小表示します。
右ボタンを押しながらマウスを左右に移動させる事で画像の移動、
左ボタンをクリックし、四角形の領域を指定すると、その範囲を拡大表示します。
画像の拡大縮小、移動表示をさせると画像の座標計算が少し複雑になってしまいますが、これらの計算はコントロール内で行っています。この機能を使ってステータスバー左側の座標、輝度値部分を表示しています。
(左上、右下に表示されている文字は対応ボード(APX-3312、3313、3318)をPCに挿入時は表示されません。)



プロファイル(縦、横方向の輝度値グラフ)の表示例。
(画像の拡大縮小に合わせて表示されます。)



このコントロールは個人的にはかなりお気に入りの一品です。
コントロールに表示する画像データ、表示倍率、表示位置を指定するだけで、マウスイベントの処理やグリッド表示、プロファイル表示はコントロールがやってくれます。
 
Loading...
スポンサーリンク

スポンサーリンク 最近の記事
(09/18)  計測測定展に光切断のデモを出展しました
(08/17)  ディジタル画像技術事典200に記事が載りました
(06/09)  光切断を画像センシング展で公開
(05/14)  中国(上海)へ行って来ました
(04/12)  韓国へ行って来ました
(03/10)  私の求める新人像
(01/18)  エレクトロテストジャパンにカラー光切断法のデモを出展しました。
(12/23)  ユニークアクセス200万達成!
(12/10)  【カラー光切断法】YouTube動画まとめ
(11/04)  国際画像機器展2014にカラー光切断法を出展します。
(10/05)  第25回コンピュータビジョン勉強会@関東に参加してきました。
(09/08)  フーリエ変換の記事を追加しました。
(08/09)  【画像処理】ランキング低下中
(07/06)  記事の更新が停滞中...
(06/08)  画像センシング展2014でカラー光切断法のデモを行います。
(05/17)  カラー光切断法の動画を公開しました。
(04/30)  ソニーα NEX-5Rで星空撮影
(04/10)  カラー光切断法の取込結果を追加しました
(03/08)  Korea Vision Show 2014へ行ってきました
(02/05)  フーリエ変換シリーズを始めます。
(01/06)  2014年、あけましておめでとうございます。
(12/04)  カラー光切断法を公開(国際画像機器展2013にて)
(11/13)  国際画像機器展2013に出展します
(10/14)  「画像処理のためのC#」はじめます。
(09/16)  【C#,VB.NET】高速描画コントロールをバージョンアップしました。
(09/04)  拡大鏡に輝度値表示、ルーラー機能を追加した個人ツールを公開
(08/05)  7月の拍手Top5
(07/06)  2013年6月人気記事Top5
(05/12)  SONY α NEX-5Rレビュー
(04/24)  SONY α NEX-5RY購入

【OpenCV】色領域の抽出

メインページOpenCV

OpenCVで肌色領域の抽出や特定色の抽出というテーマは良くある話だと思いますが、サンプルプログラムを探すと、

cvCvtColor関数でRGBからHSVに変換
   ↓
cvSplit関数でHSV画像を各チャンネルに分解
   ↓
cvThreshold関数で各チャンネルごとに二値化
   ↓
cvAnd関数で各チャンネルの二値化画像のAndをとり、マスク画像を作成
   ↓
cvAnd関数でHSV画像を各チャンネルの画像をAndをとる
   ↓
cvMerge関数で各チャンネルの画像をRGB画像へ戻す


多少、違うにしても、基本的にはこの様な流れの処理が比較的多いかと思います。

ここで、気になる点。
  • 赤の領域を抽出する場合、例えば色相が0°~10° および 350°~360°の範囲を抽出したい場合などに対応できない。
  • RGB→HSV→RGBへ変換すると、変換の途中で色の階調が少し失われてしまう。
ということで、少し工夫したつもりのソースがこちら↓

//--------------------------------------------------------------- 
//【関数名 】:cv_ColorExtraction 
//【処理概要】:色抽出 
//【引数  】:src_img        = 入力画像(8bit3ch) 
//      :dst_img        = 出力画像(8bit3ch) 
//      :code        = 色空間の指定(CV_BGR2HSV,CV_BGR2Labなど)
//      :ch1_lower    = ch1のしきい値(小)
//      :ch1_upper    = ch1のしきい値(大)
//      :ch2_lower    = ch2のしきい値(小)
//      :ch2_upper    = ch2のしきい値(大)
//      :ch3_lower    = ch3のしきい値(小)
//      :ch3_upper    = ch3のしきい値(大)
//【戻り値 】:なし 
//【備考  】:lower <= upperの場合、lower以上upper以下の範囲を抽出、
//      :lower >  upperの場合、upper以下lower以上の範囲を抽出します。
//---------------------------------------------------------------

void cv_ColorExtraction(IplImage* src_img, IplImage* dst_img,
                            int code,
                            int ch1_lower, int ch1_upper,
                            int ch2_lower, int ch2_upper,
                            int ch3_lower, int ch3_upper
                        ){

    int i, k;   

    IplImage *Color_img;
    IplImage *ch1_img, *ch2_img, *ch3_img;
    IplImage *Mask_img;

    int lower[3];
    int upper[3];
    int val[3];

    CvMat *lut;   

    //codeに基づいたカラー変換
    Color_img = cvCreateImage(cvGetSize(src_img), src_img->depth, src_img->nChannels);
    cvCvtColor(src_img, Color_img, code);
       
    //3ChのLUT作成
    lut    = cvCreateMat(256, 1, CV_8UC3);

    lower[0] = ch1_lower;
    lower[1] = ch2_lower;
    lower[2] = ch3_lower;

    upper[0] = ch1_upper;
    upper[1] = ch2_upper;
    upper[2] = ch3_upper;

    for (i = 0; i < 256; i++){
        for (k = 0; k < 3; k++){
            if (lower[k] <= upper[k]){
                if ((lower[k] <= i) && (i <= upper[k])){
                    val[k] = 255;
                }else{
                    val[k] = 0;
                }
            }else{
                if ((i <= upper[k]) || (lower[k] <= i)){
                    val[k] = 255;
                }else{
                    val[k] = 0;
                }
            }
        }
        //LUTの設定
        cvSet1D(lut, i, cvScalar(val[0], val[1], val[2]));
    }

    //3ChごとのLUT変換(各チャンネルごとに2値化処理)
    cvLUT(Color_img, Color_img, lut);
    cvReleaseMat(&lut);

    //各チャンネルごとのIplImageを確保する
    ch1_img = cvCreateImage(cvGetSize(Color_img), Color_img->depth, 1);
    ch2_img = cvCreateImage(cvGetSize(Color_img), Color_img->depth, 1);
    ch3_img = cvCreateImage(cvGetSize(Color_img), Color_img->depth, 1);

    //チャンネルごとに二値化された画像をそれぞれのチャンネルに分解する
    cvSplit(Color_img, ch1_img, ch2_img, ch3_img, NULL);

    //3Ch全てのANDを取り、マスク画像を作成する。
    Mask_img = cvCreateImage(cvGetSize(Color_img), Color_img->depth, 1);
    cvAnd(ch1_img, ch2_img, Mask_img);
    cvAnd(Mask_img, ch3_img, Mask_img);

    //入力画像(src_img)のマスク領域を出力画像(dst_img)へコピーする
    cvZero(dst_img);
    cvCopy(src_img, dst_img, Mask_img);

    //解放
    cvReleaseImage(&Color_img);
    cvReleaseImage(&ch1_img);
    cvReleaseImage(&ch2_img);
    cvReleaseImage(&ch3_img);
    cvReleaseImage(&Mask_img);

}

私なりのポイントは
  • cvLut関数を用いる事で、各3chごとに二値化するときに融通がきく。(cvThresholdを駆使しても可能ですが。)
  • cvCopy関数のマスクを使う事で1chのマスク画像で処理ができ、色の階調が失われない。
    cvAnd関数を使って3chのマスク画像とANDをとるよりも、メモリが少し節約できる。)

処理例

【入力画像(src_img)】
【OpenCV】色領域の抽出

緑領域をHSVを用いて抽出する場合、緑の色相は120°前後で、処理後画像に8bit3ch画像を用いると色相Hの値は0~360が0~180に丸め込まれるので、緑の値はHは60となり、Hを50~70の範囲で抽出する場合、

cv_ColorExtraction(src_img, dst_img, CV_BGR2HSV, 50, 70, 80, 255, 0, 255);

【処理画像(dst_img)】
【OpenCV】色領域の抽出

となります。

同様に赤の付近を抽出する場合は色相が0°付近なので、丸め込み後の値は0~10および170~180を抽出したい。
ということで、このように↓呼び出します。

cv_ColorExtraction(src_img, dst_img, CV_BGR2HSV, 170, 10, 80, 255, 0, 255);

【処理画像(dst_img)】
【OpenCV】色領域の抽出

となります。
lowerupperの値をにしているのがポイント

肌色領域を抽出したい!という場合も多いかと思いますので、入力画像を

【OpenCV】肌色領域の抽出

とし、

cv_ColorExtraction(src_img, dst_img, CV_BGR2HSV, 0, 10, 80, 255, 0, 255);

で処理した場合、このよう↓になりました。

【OpenCV】肌色領域の抽出

ちなみに、彩度の値を80~255としているのは、背景の白っぽい領域を除外するために、このようにしています。

色相などの値は、使うカメラや照明などにより値が多少異なります。
今回作成したcv_ColorExtraction関数の引数の値をいじくりながら、いろいろ試してみて下さい。
また、色空間も今回のHSVを使う以外にも、cv_ColorExtraction関数の3番目の引数に
  CV_BGR2HLSを指定するとHLS
  CV_BGR2Labを指定するとCIE Lab
の色空間に基づいて色領域を抽出出来るはず(未確認)なので、お試し下さい。

関連記事

【OpenCV】色変換(cvCvtColor)の組合せ
【OpenCV】マスク処理
色相、彩度、明度の計算方法
  

Loading...
スポンサーリンク



現在の閲覧者数: / 合計