OpenCV2.4.1が公開されました

2012.6.2 OpencV2.4.1が公開されました。

 

OpenCV2.4.1のWindows版の入手先はこちら

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

 

OpenCV.2.4からOpenCV2.4.1への変更点はこちらを参照下さい。

http://code.opencv.org/projects/opencv/wiki/ChangeLog#241

日本語はこちらより

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

 

今回の変更では、ライブラリの構成的には変更が無いので、インストール方法についてはOpenCV2.4のインストール方法を参考にlibファイルのファイル名の240の部分を241に読み替えて参考にして下さい。

 

ちなみに、今回はOpenCV2.4の公開から約1ヶ月という短い期間でOpenCV2.4.1の公開となった訳ですが、今後も約1ヶ月間ペースでのバージョンアップが予定されています。

バージョンアップの予定についてはロードマップとして公開さているので参考まで↓

http://code.opencv.org/projects/opencv/roadmap

 

テキストフォーマット除去ソフト【EraceTextFormat】

Webページなどをコピーして、ワードやメールなどに貼り付けると、文字の大きさやフォーマットも、そのまま反映されるため邪魔な場合があります。

 

そんなテキストのフォーマットを削除するソフトを作ってみました。

 

と言っても、コピーされたテキストを文字列へ入れ、クリップボードへ入れなおすだけの、全部で20行にも満たない簡単なソフトです。

ただ、自分が欲しかったもので...

 

ソフトのダウンロードはこちら

(別途、.NET Framework 2.0が必要です。)

 

使い方は、文字列をコピー(Ctrl+C)し、このソフト(EraceTextFormat.exe)を実行して、ワードなどに貼り付ける(Ctrl+V)と、文字列のフォーマットが削除され、文字列のみを貼り付けてくれます。

【C#】ユーザーコントロールに『親コンテナにドッキングする』を追加する

ピクチャボックスなどのコントロールでは、コントロールの右上に黒い三角のマークが表示され、この三角のマークをクリックすると「親コンテナにドッキングする」などを行う事ができます。

 

 

自作のユーザーコントロールには、この三角のマークが表示されず、親コンテナにドッキングするにはDockプロパティを Fill に設定していると思います。

 

しかし、PictureBoxなどで慣れ親しんでいるので、この三角マークを出したい!

という事で、調べてみましたが、意外と簡単。

 

クラスの属性に

 

[Docking(DockingBehavior.Ask)]

 

を追加するのみ。(クラス宣言の直前に記載して下さい。)

例えば、こんな感じ↓

namespace WindowsControlLibrary1
{
    [Docking(DockingBehavior.Ask)]
    public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
        }
    }
}

これで、ユーザーコントロールにも親コンテナにドッキングするを追加する事ができます。

 

 

ちなみに、この黒の三角マークはスマートタグというそうです。

ラインセンサカメラとエンコーダとの同期撮影方法

ラインセンサカメラはラインセンサカメラ撮影システムでも紹介しているように、一般的にエンコーダを用いて同期撮影する事が多くあります。

 

フォトセンサ等の外部トリガから各種ディレーの設定を行い、ラインごとのスキャンタイミングをエンコーダと同期撮影する場合は以下のようになります。

(タイミングを制御するのはキャプチャボードの役目なので、各ボードメーカにより多少異なるかも?しれません。)

 

 

ラインセンサではエンコーダパルスの指定パルス毎(上図:指定パルス数2)に撮影していきますが、外部トリガが入力されてから、実際に撮影を開始するまでの微調整をエンコーダパルス数(上図:指定パルス数1)で行い、粗調整をライン数(上図:指定ライン数)で行います。

 

つまり、外部トリガが入力されてから、ラインセンサがスキャン開始するまでのエンコーダのパルス数(ディレイパルス数)は

 

ディレイパルス数=指定パルス数+指定パルス数2×指定ライン数

 

となります。

このことからも分かるように、ラインセンサで画像を撮影した時の縦横比の調整代は上図の指定パルス数2の値で決まります。

この事を考慮した上でエンコーダの分解能を選定下さい。

ただし、エンコーダのパルス数は画像入力ボード側でエンコーダのカウント数をA相の立上りと立下りをカウントし、パルス数を2倍にする(2逓倍)ものや、A相の立上り、B相の立上り、A相の立下り、B相の立下りをカウントしパルス数を4倍にする(4逓倍)ものもあります。

 

注意事項

■露光時間の設定について
ラインスキャンの露光時間については、ラインのスキャン間隔(ライントリガ間隔)で決まるものと、スキャン間隔とは別に露光時間を設定できるものとがあり、露光時間を設定できるか、できないかは、使用するラインセンサカメラに依存します。

 

■ラインセンサカメラの同期撮影設定について
ラインセンサカメラとエンコーダとを同期させるには、画像入力ボードからラインセンサカメラに同期信号を入力させる必要があります。そのためには、画像入力ボードとラインセンサカメラの両方の同期撮影設定が必要となります。

同期撮影には外部同期内部同期という言葉があり、カメラを基準にしてカメラ外の信号に同期して撮影するのが外部同期、カメラ内で生成した信号に同期して撮影するのが内部同期と言います。

外部同期は外部トリガ、内部同期はフリーラン自走モードなどとも言われる場合があります。

※ここでの外部トリガというのは、最初の図のフォトセンサからのトリガ信号ではなく、ラインスキャンの同期信号(ライントリガ)の事を差すので、混同しないようにご注意下さい。

 

■エンコーダのパルス選定について
エンコーダのパルス分解能が高い程、ラインセンサカメラで撮影した時の画像の縦横比の調整がより微調整が可能となりますが、画像入力ボードに接続できるエンコーダ信号に最高周波数の制限がある場合が多いので、特に高速で撮影する場合などはご注意下さい。

 

■スキャンレートの設定について
スキャンレート(ラインスキャンする間隔)は上図の指定パルス数2で設定する事ができますが、当然ながらカメラの最速スキャンレートよりも速い設定をする事はできません。
特に高速でスキャンする場合、スキャンレートの設定は、画像の分解能のみならず、スキャン速度(時間)も考慮した上で設定して下さい。

 

■エンコーダパルスの安定性に関して
エンコーダとラインセンサカメラを同期させて撮影するときは、できるだけエンコーダのパルスが安定(定速)した状態で撮影して下さい。モータの定速区間での撮影をオススメします。

 

■駆動モータにステッピングモータを用いる場合の注意点!
駆動モータにステッピングモータを用いる場合、さらに注意が必要です。
ステッピングモータの移動量を横軸に時間、縦軸に移動量(回転角度)を取ると下図のようになります。

 

 

上図の丸の部分をパルスレベルで細かく見ると、下図のように階段状に回転角度が変化しています。
これは、モータがステップ駆動なので、このようになるのですが、ステージの慣性モーメントや回転速度によっても、フラツキ具合は異なるので、一概には言えませんが、台形駆動の定速駆動であっても、パルスレベルでみると一定では無いという事に注意して下さい。

 

さらに、これを踏まえた上で、エンコーダを使ってステージとラインセンサを同期させて撮影する事を考えます。
エンコーダと同期してラインセンサで撮影するという事は、一定間隔の角度で1ラインごと撮影するという事となります。
そこで、例えば下図のように赤の横線の間隔で撮影すると、青い線との交点の間隔(時間)でラインセンサ1ラインごとに撮影されるので、下図の縦線(オレンジの線)の間隔がラインセンサのスキャン間隔という事になります。

 

ここで注意しないといけないのが、上図のようにスキャン間隔がバラついてしまうと、場合によってはラインセンサカメラの最速のスキャンレートよりもエンコーダ同期信号の間隔(時間)の方が短くなってしまう場合があり、撮影できないラインが発生してしまう場合があります。

 

ラインセンサで撮影する場合、

 

最速のスキャンレート(時間)<エンコーダ同期信号の間隔(時間)

 

の条件を満たす事が必要です。

 

 

そうならないためにも、ステッピングモータでの移動(回転)分解能に対して、ラインセンサの撮影分解能(スキャン間隔)は余裕を持ってラインセンサ(最速スキャンレート)、モータ、ステージ(移動分解能)を選定して下さい。

 

このばらつき量はいろいろな条件が絡むので、一概には良く分かりませんが、経験値的にはモータ1パルスの±50%程度、ばらつく事を覚悟しておいた方が無難だと思います。

 

この、ステッピングモータがカクカク動く現象はモータ業界では、振動や騒音という用語で表現されます。
(参考)オリエンタルモータの技術資料 この↓資料のH-37ページを参照下さい。
http://www.orientalmotor.co.jp/knowledge/technical/pdf/SteppingMotor_Tech.pdf

振動が原因によりラインセンサで撮影できない現象が発生した場合、スキャン間隔(送り方向の撮影分解能、スキャンレート)は装置や検査の要求仕様などで決まってくるため、変えられないと思うので、マイクロステップ対応のモータドライバなどの低振動タイプのドライバの選定をするなどして、ステッピングモータの移動分解能に対してエンコーダ同期信号の分解能が大きくなるように設計して下さい。

 

関連記事

画像入力ボードとは?設定の勘所、CC信号とは?

ラインセンサカメラ撮影システム

ラインセンサカメラは1ラインの画素数が現在では最大16384画素のカメラがあるなど、高解像度で撮影できるという魅力があるものの、被写体を動かす必要があり、エリアセンサを使うよりも、どうしても撮影システムが複雑になってしまいます。

 

また、エリアセンサと比べると露光時間が高速(短くなる)になるがゆえの問題も発生しがちです。

 

今後、それらの問題等についても、まとめていこうと思いますが、まずは一般的な撮影システムは下図のようなイメージとなります。

 

ラインセンサカメラの選定方法

ラインセンサカメラを選定するには、おおむね以下の仕様を決める必要があります。

 

画素数 512, 1024, 2048, 4096, 6144, 7450, 8192, 12288, 16384など
画素サイズ 4.7, 5, 7, 14 μmなど
データレート 20,40,50,60,80,120,160,320,640Mhzなど
カメラ出力 CoaXPress,CameraLink,デジタル,アナログなど
レンズマウント Cマウント, Fマウント,M42,M72 など
その他 露光制御、シェーディング補正、アンチブルーミングの有無、
本体寸法など

 

上記の組み合わせは、それぞれ任意に組み合わせる事が出来る訳ではありませんが、ある程度意識する必要があります。

例えば、入手しやすいニコンの一眼レフ用のレンズ(Fマウント)を用いたい場合は、最大の画素数は7450画素ぐらいまでとなります。センサ長(画素サイズ×画素数)が43mmを超える場合はご注意下さい。

それ以上の画素数を使用する場合は、レンズマウントもM42、M72となり、レンズも高価なものとなります。

 

画素数、画素サイズ

画素数を決めるには、撮影する視野幅、撮影分解能(mm/pix)を決める必要があります。
例えば、

 

 視野幅     300mm
 最小欠陥サイズ 0.2mm

 

だとすると、まずは最小の欠陥を検出するのに何画素必要か?が重要になります。
何画素必要かは画像処理担当者と相談するなり、実際には実験しながら決める場合も多いと思いますが、ここでは4画素必要だとすると、

 

 画素分解能 = (最小欠陥サイズ) / (必要画素数) 
         = 0.2 / 4 
         = 0.05(mm/pix)

 

となります。

あとは視野幅より

 必要画素数 = 視野幅 / 画素分解能 
        = 300 / 0.05 
        = 6000画素

これより、6000画素以上のカメラ6144画素を選定します。

 

ただし、経験的には必要な画像分解能が約10μm以下となる場合は、レンズの限界でクッキリと10μmの物が撮影できなくなってくるので、ご注意下さい。

また、この如何にクッキリと撮影できるか?という問題ですが、カメラの中心付近で撮影するのと、量端部分で撮影するのとでは、性能が異なり量端に近いほど不利となります。

 

ここで重要な事は大は小を兼ねないということ。
同じデータレートの場合、画素数が少ない方がより高速にスキャンすることができます。
また、画素数が少ない方がラインセンサの画素サイズの大きいカメラを選定できる可能性が
あるので、画素サイズの大きい方が一般的に明るく撮影する事が出来ます。

 

データレート、スキャンレート

データレートは画像のデータを吐き出すための同期信号の周波数を表し、320MHz、640MHzというような表現をします。

 

スキャンレートは1ライン分のデータを1秒間あたり何ライン取得するか?の値で、40kHzや70kHzというように表現します。一般にカメラの性能を表す場合は最速のスキャンレートで表す場合が多いです。

また、スキャンレートはHzの逆数を取って、25μSec、14μSecと表現する場合もあります。

 

 

スキャンレートが遅い(スキャン間隔の時間が長い)と縦方向につぶれた画像となり、
スキャンレートが速い(スキャン間隔の時間が短い)と縦方向にまのびした画像となります。

 

スキャンレートが遅い スキャンレートが最適 スキャンレートが速い

 

スキャンレートが速いと必然的に露光時間も短くなってしまうので、画像が暗くなってしまいます。
スキャンレートが遅いと露光時間を長く取る事ができるので、明るく撮影する事が出来るのですが、
露光時間に関しては露光時間≒スキャンレートとなるカメラや、露光時間をスキャンレートとは別に
設定できるカメラがあります。(当然、スキャンレートよりも長い露光時間の設定はできません。)
露光時間を設定できないカメラの場合は、カメラのゲイン設定やレンズの絞りなどで画像の明るさを
調整します。

 

[計算例]
 ワークの送り速度  200mm/sec
 送り方向の分解能  0.05mm/pix

 

の場合、

 

 スキャンレート = (送り速度) / (分解能) = 200 / 0.05 = 4kHz
          = (分解能) / (送り速度) = 0.05 / 200 = 250μsec

 

となるので、最速スキャンレートの4kHz以上のラインセンサカメラを選定します。

スキャンレートは検査処理能力に直結するので、速くしがちですが、スキャンレートが速いと露光時間も短くなり、その分、明るい照明が必要となります。また、スキャンレートが速いと、カメラのケーブル長も長くするとノイズの影響を受けやすく、あまり長くする事ができません。最悪、1Mでないとダメなケースもあるので、ご注意下さい。最近では、この問題を解決するため、ケーブルの中間部分を光ファイバーに変換しケーブル長を延ばしたり、高速のスキャンレートが可能でありながら、ケーブル長を延ばす事のできるCoaXPressという規格も登場しています。

 

カメラ出力

カメラのデータ出力にはCoaXPRess、CameraLinkとデジタル、アナログとがあります。
現状では低速低分解能のカメラではアナログ、高速高分解能のカメラではCameraLinkが多くなっていますが、カメラリンクケーブルは規格品ですので、ケーブル長が1、2、5、7、10、15mのいづれかになります。
また、高速データレートのラインセンサカメラとなると、使用できるケーブル長も制限される場合が
ありますのでご注意下さい。

 

レンズマウント

ラインセンサカメラの場合、センサ長が比較的長いので、
ニコンのFマウント もしくは
ペンタックスのKマウント
を使うのが一般的です。(Fマウントの方が多い)

 

これらは35mmフィルムレンズ用のレンズですので、センサ長が43mmまでのカメラで使用が可能です。
他にも、よりガタの無いようにレンズを固定するため、M42のねじマウントを使ったり、
センサ長が43mmを超える場合は、M42、M72のねじマウントを使う場合があります。
レンズメーカについては光学部品/カメラバイヤーズガイドのページを参照下さい。
レンズの選定についてはレンズ選定(視野、撮影距離など)のページを参照下さい。

 

ただし、経験的には、Fマウントのレンズを使う場合には、視野やワーキングディスタンスなどから、レンズの焦点距離を計算して、レンズを選定するよりもニコンのマイクロニッコール55mmのレンズを用いてワーキングディスタンスを調整し、撮影したい視野幅に合わせこむ方が綺麗な画像を撮影できる場合が多いです。

 

まとめ

カメラの選定については照明や画像処理なども考慮し選定を行って下さい。
むやみに撮影分解能やスキャンレートを上げてしまうと、高価なカメラ、レンズ、照明、画像入力ボードが必要となってしまうので、トータルバランスが重要です。

 

ラインセンサカメラのメーカについては、カメラ接続リストとカメラメーカーリンクのページのPDFファイルが参考になると思います。

(※私の会社のページですが、うちのボードを選択して頂けると嬉しいです。)

 

他にもマビックというマシンビジョンの方法をまとめたホームページに産業用CCD/CMOSカメラ検索CameraChoiceというページがあるので、こちらも参考になると思います。

カラーエリアCCDセンサのしくみ(単板式、三板式)

カラーのエリアセンサのカメラでは3CCD方式(三板式)単板式というのがあります。
工業用のカラーのCCDカメラでは、単板式のカメラの方が多く採用されています。
他にも富士フィルムが採用したハニカム方式やシグマのカメラで採用されている三層方式などがあります。

 

3CCDセンサ(三板式)

ホームビデオカメラでもおなじみの3CCD方式。
ダイクロイックプリズムでR,G,Bに分光して、各色用のエリアセンサで撮影します。

 

 

CCDを3つ使うので、カメラ本体が大きくなりやすく、価格も高価になってしまいますが、色の再現性の面では単板式に比べて有利となります。

 

単板式

通常のモノクロエリアCCDの各画素の上にR,G,Bそれぞれの色のみを通す光学フィルタを下図のような配置で装着し、画像を撮影後、各画素ともR,G,Bの輝度値を演算処理しカラーの画像に変換します。

 

 

 

この並びをベイヤ(Bayer)配列と言います。

 

カラー画像への変換は下図のように各R,G,Bの撮影出来ていない画素については周辺の画素の輝度値を用いで補間し、カラーへと変換します。

 

ほとんどの工業用のCCDカメラではカメラ内部でカラーに変換されますが、画素数の大きなカメラや高速のカメラでは、カラーに変換することで、データ容量が1画素8ビットから24ビットに容量が3倍となってしまうため、下図のようにモノクロのまま出力される場合もあるので、ご注意下さい。

 

 

高価なデジタルカメラなどでは、カラーの変換をカメラ任せにはしないでソフトで処理る場合もあり、変換する前の画像データをRAWデータ、変換する処理のことをRAW現像と呼びます。(たぶん、デジカメ用語)
RAW現像は他にもベイヤ演算デモザイキングなどと呼びます。

 

もっとも基本的な補間方法としては、たとえば赤の画素では上下左右の輝度値を平均し緑の輝度値を求め、斜め方向の輝度値を平均して青の輝度値を求めます。
同じ用に緑や青の画素についても処理を行うと、カラーの画像へと変換することができます。

 

比較的有名な変換方法には適応型カラープレーン補間法ACPI:Advanced Color Plane Interpolation)というのがあるので、上記キーワードで検索してみて下さい。

 

しかし実際にベイヤ演算を行ってみると、擬色と呼ばれる本来の色とは異なる色が出たり、通称ラーメンノイズと呼ばれる渦巻き状のパターンが発生したりと、なかなかうまくいきません。

 

これらのノイズを如何に防ぐかが各カメラメーカーやRAW現像ソフトメーカの腕の見せ所で、各社のノウハウとなっているため、私は実際にどうのような処理を行っているのか?よく分かっていません...

 

RAW現像については、現像ソフトで比較的有名な市川ラボラトリーのSILKPIXというソフトがあるので、下記ページを見て頂くと参考になると思います。

http://www.isl.co.jp/SILKYPIX/japanese/special/movie/

 

このように単板のカラーカメラはR,G,Bの足りない画素を補間してカラー画像を撮影しているので、画像の輪郭などが重要な場合、モノクロカメラの方が性能は良くなります。

 

以前は、カラー画像を使えば、モノクロにも変換できるし、カラーカメラはモノクロカメラを兼ねる!と思っていたのですが、モノクロカメラの方が有利な場合もあるので、特に色情報を必要としない場合はモノクロカメラを使う方がオススメです。(データ容量も少なくてすみますし...)

 

このへんの話は、少し古いですが、トランジスタ技術の2009年7月号に書いてあるので、ご興味のある方は、参照してみて下さい。

【C#】XMLドキュメントコメント

クラスやメソッドのコメントは以前は

//--------------------------------------------------------------- 
//【関数名 】:Test 
//【処理概要】:評価用の関数 
//【引数  】:Para1 = パラメータ1 
//      :Para2 = パラメータ2 
//      :Para3 = パラメータ3 
//【戻り値 】:エラー内容 
//【備考  】: 
//--------------------------------------------------------------- 
int Test(int Para1, float Para2, double Para3){

のような感じで書いていたのですが、.NET環境、特にC#においてはXML形式でコメントを書くことで、より応用が広がります。

 

と言っても、C#ではXMLの部分は自動で書いてくれるので、かなり便利です。

やり方は以下の通り。

 

まず、クラスやメソッド、フィールドのある程度の大枠(メソッドの場合は、少なくとも引数の部分)を書いておきます。

public int Test(int Para1, float Para2, double Para3) 
{ 
	return 0; 
}

次に、コメントを付けるクラスやメソッドなどのすぐ上の行で////を3個入力します。
すると、自動で以下のようなコメントが付いてくれます。

/// <summary>
/// 
/// </summary> 
/// <param name="Para1"></param> 
/// <param name="Para2"></param> 
/// <param name="Para3"></param> 
/// <returns></returns> 
public int Test(int Para1, float Para2, double Para3) 
{ 
    return 0; 
}

<summary>はクラスやメソッドなどの概要
<param>は引数の説明
<returns>は戻り値の説明
を表します。
他にも使えるタグがあるので、詳細は下記msdnを参照下さい。
http://msdn.microsoft.com/ja-jp/library/5ast78ax

 

このタグに挟まれた部分にそれそれの説明を下記のように記載します。

/// <summary>
/// Testメソッドの概要
/// </summary> 
/// <param name="Para1">Para1の説明</param> 
/// <param name="Para2">Para2の説明</param> 
/// <param name="Para3">Para3の説明</param> 
/// <returns></returns> 
public int Test(int Para1, float Para2, double Para3) 
{ 
    return 0; 
}

するとインテリセンスの表示の時に

 

 

のように、コメントに記載した部分がヒントで表示してくれます。

 

各引数の説明も、このように↓

 

 

表示しれくれます。

 

さらに、プロジェクトのプロパティでビルド→XMLドキュメントファイルの部分にチェックをいれ、XMLファイルを出力させる設定にすると、Sandcastleというようなヘルプファイル作成ソフトを使って、このXMLファイルを渡すとmsdnのようなヘルプファイルを作る事も可能になります。

 

他のVB.NETやC++/CLIでは、自動でXMLの部分を作ってくれないのですが、XMLの部分は同じ文法で書く事ができます。

 

やっぱC#ってすごい!

【参考書籍】信号処理入門

この本は、知り合いの人から勧められた本なのですが、私も勧めたくなる本でした。

 

画像処理を勉強すると、とりあえずの集大成的なものがフーリエ変換だと思います。

しかし、いきなり公式が出来てきて何だか良く分からないままFFTまでやってみたりと、とても難しいという印象のまま終わってみたりもします。

この本は、そんなもう一度ちゃんとフーリエ変換を理解したいという人にはオススメです。
図が多めで、そんなに難しくは無いと思います。

 

信号処理の概要から始まり、ベクトル→内積→正規直交基底→フーリエ変換→DFT→FFTという流れで説明されています。

この流れがまさにお見事!

フーリエ変換の公式などは本の後半に書いてありますが、いきなり最後の部分を見るのではなく、最初から丁寧に読むと良いと思います。

 

今ではフーリエ変換って正規直交基底との内積でしょ!?

画像処理だと正規化相関も内積、3×3フィルタみたいのも内積、というぐらいの認識でいます。

内積ってサイコ―!!と思えるようになったのも、この本のおかげです。

 

 

目次

1 信号処理とは
1.1 信号処理はどんなとき必要か
1.2 どんな信号があるか
1.3 アナログ信号とディジタル信号
1.4 サンプリング問題
2 信号処理の例
2.1 波形の平滑化
2.2 雑音の圧縮
3 数学の準備体操
3.1 信号処理を学ぶために
3.2 信号の表現
3.3 2次元ベクトルの距離と内積
3.4 正規直交基
3.5 多次元ベクトル空間から関数空間へ
3.6 正規直交関数系
4 相関関数
4.1 関数の類似性を測る
4.2 相互相関関数
4.3 自己相関関数
5 フーリエ級数展開
5.1 フーリエ級数展開とは
5.2 偶関数と奇関数
5.3 周期が2πでない場合
5.4 複素フーリエ級数展開
5.5 パーシバルの定理
5.6 フーリエ級数展開の実例
5.7 フーリエ級数展開の重要な性質
6 DFTとFFT
6.1 ディジタル信号のフーリエ解析
6.2 離散フーリエ変換(DFT)
6.3 DFTの性質
6.4 高速フーリエ変換(FFT)
7 フーリエ変換
7.1 フーリエ級数展開からフーリエ変換へ
7.2 フーリエ変換の性質
7.3 デルタ関数と白色雑音
8 線形システムの解析
8.1 線形システム解析へのアプローチ
8.2 入出力信号の関係
8.3 インパルス応答
8.4 周波数領域でのシステムの表現

 

 

と言っても、フーリエ変換は、あまり使わないな~

 

使える数学へ戻る

 

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

2013年3月現在、OpenCVの最新バージョンはVer.2.4.4です。
OpenCV2.4.4のダウンロードは下記ページより入手して下さい。

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

 

また、インストール方法はlibファイルのxxx240.lib,xxx240d.libの部分をxxx244.lib,xxx244d.libに読み替えて下さい。

 

下記はVer.2.4.0の説明です。


 

2012.5.1 OpenCV2.4の正式版が公開されました。

 

OpenCV2.3.1からの変更点は下記リンク先よりご確認下さい。

 

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

 

日本語版は下記を参照下さい。

 

OpenCV2.3.1→OpenCV2.4betaへの変更点

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

 

OpenCV2.4beta→OpenCV2.4への変更点

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

 

インストール上で気になるポイントは

●SURFおよびSIFT処理の特許が申請されている処理アルゴリズムは別のモジュール(opencv_nonfree240.dll)へ移動

●OpenCVで使用している並列化ライブラリ(TBB)がOpenCVのパッケージに同梱
注)Release版のTBBのみ、Debug実行する場合は別途TBBを入手する必要があります。

ぐらいでしょうか。

 

以下、Windows版のインストール方法について記します。

 

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

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

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

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

 

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

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

 

 

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

 

c:\opencv
┣ 3rdparty
┣ android
┣ build
┃┣ common
┃┃ ┗tbb
┃┃      ┣ ia32
┃┃      ┗ intel64
┃┣ 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ファイルのあるフォルダを指定します。

 

また、別途OpenCVからTBBというライブラリも使用するので、この2つのPathを設定します。

 

32bitプログラムでVisualStudio2010を使用する場合は

 

;C:\opencv\build\x86\vc10\bin;C:\opencv\build\common\tbb\ia32\vc10

 

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

 

別の環境にOpenCVをインストールする場合は下記の表を参考に
使用する環境に合わせてディレクトリを指定して下さい。

 

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

 

ただし、同梱されているTBBはRelease版のみのため、Debug実行すると

 

コンピュータにtbb_debug.dllが無いため・・・

 

と表示されてしまします。

Debug実行も行う場合は、別途TBBをこちら

http://threadingbuildingblocks.org/file.php?fid=77

 

のページの最新版をクリックし、Windowsの場合は tbb×××_win.zipのファイルをダウンロードし、解凍したdllファイルを上記で指定したフォルダの中へコピーして下さい。

 

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

(Visual Studioの上の方(メニューの下)に表示されているWin32の部分をx64にして下さい。)

 

なんだか良く分からない場合は、OSが64bitであっても、32bit版のOpenCVを使った方がハマりにくいと思います。

 

VisualStudio2010での使用方法

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

 

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

 

適当な名前を付け、保存する場所を指定し、OKボタンをクリックします。

 

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

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

#include "stdafx.h"

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

 

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

 

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

 

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

 

 

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

// OpenCV2.4Sample.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_core240d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_imgproc240d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_highgui240d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_objdetect240d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_contrib240d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_features2d240d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_flann240d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_gpu240d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_haartraining_engined.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_legacy240d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_ts240d.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_video240d.lib")
#else
    //Releaseモードの場合
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_core240.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_imgproc240.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_highgui240.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_objdetect240.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_contrib240.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_features2d240.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_flann240.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_gpu240.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_haartraining_engined.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_legacy240.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_ts240.lib")
    #pragma comment(lib,"C:\\opencv\\build\\x86\\vc10\\lib\\opencv_video240.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;
}

上記サンプルは32bitでVisualStudio2010で開発する場合の設定です。
環境が異なる場合は #pragma comment の部分のパスを環境に合わせて変更して下さい。

 

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

 

opencv_core240、opencv_imgproc240、opencv_highgui240、opencv_objdetect240

 

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

 

SIFTもしくはSURFを使用する場合は、別途、

 

Releaseの場合:opencv_nonfree240.lib

Debugの場合  :opencv_nonfree240d.lib

 

が必要となります。

 

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

 

その他

VisualStudio2005でOpenCV2.4を使用する場合は自分でOpenCV2.4をコンパイルするか、
VisualStudio2008用のライブラリを使用する場合は
Microsoft Visual C++ 2008 SP1 再頒布可能パッケージ (x86)
VisualStudio2010用のライブラリを使用する場合は
Microsoft Visual C++ 2010 SP1 再頒布可能パッケージ (x86)

 

が必要となります。ただし、VisualStudio2005からはReleaseモードのみ実行可能なので、Debugモードでも実行したい場合はExpress Editionでも構わないのでVisualStudioをインストールすると実行可能です。

 

OpenCV2.4でCMakeを使って自分でOpenCVをコンパイルする場合は、OpenCV2.3の場合の説明ですが、下記ページを参照下さい。

 

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

 

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

 

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

 

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

 

トラブルシューティング

●「コンピュータにopencv_core240d.dllがないため、プログラムを開始できません。・・・」と表示される。

 

 

このエラーメッセージはdllの参照設定が正しくできていない可能性があります。
Pathの設定を確認し、設定したらPCの再起動をしてみて下さい。
コンピュータにtbb_debug.dllが無いため・・・と表示されている場合はTBBのライブラリ(*.dll)のdebug版のファイルを入手し、指定したPathへdllファイルが入っているか?Pathの設定が正しいか?deご確認下さい。

 

error LNK2019: 未解決の外部シンボル・・・と表示される。

この未解決のシンボルのエラーの場合、libファイルの設定が不足している場合が考えられます。

 

libファイルの参照設定が正しいか?(本記事では、ソースコード中に記載した#pragma commentの部分)をご確認下さい。

 

fatal error C1083: include ファイルを開けません。と表示される。

ヘッダファイルの参照設定が正しくない可能性があります。

 

プロジェクトのプロパティで構成のプロパティC/C++全般を選択して、OpenCV2のフォルダのあるディレクトリ(C:\opencv\build\include)を追加のインクルードディレクトリに指定しているか?ご確認下さい。※includeというフォルダが2か所あるのでご注意下さい。

 

Visual Studio Expressで64bit対応するには?

Expressでは標準的には64bitプログラムを作成することはできないようです。
ただし、SDKインストールすることで可能という情報もあるので、試してみては如何でしょうか?

方法 : Visual C++ プロジェクトを 64 ビット プラットフォーム用に設定する

 

OpenCVへ戻る

画像センシング展/SSII2012

2012.6.6(水)~2012.6.8(金)にパシフィコ横浜にて画像センシング展2012 が開催されます。

 

この展示会は12月に開催される画像機器展に並んで画像処理機器(カメラ、レンズ、キャプチャボード、照明、画像処理ライブラリなど)が一堂に会する大きな(画像処理の展示会としては)展示会です。

 

画像処理を使った検査システムなどを検討している方であれば、是非とも参加されると良いと思います。
技術相談コーナーなどもあります。
何故か私も最終日の最後の時間に相談コーナーを担当する事に...

http://www.adcom-media.co.jp/iss/gijutsu_schedule/?ml_20120604

 

また、主に出展社による無償のイメージングセミナーも開催されるので、興味のある内容があれば参加されると良いと思います。

 

私は「KINECT テクノロジーと NUI の可能性」という内容に興味津々。(仕事とは全く関係ありませんが。)

 

今回の展示会では、Kinect for Windowsが出た事でKinectの商用利用が可能になったので、Kinect関連の展示や発表がある事を期待しつつ...

 

同時開催でSSII2012というシンポジウム(有料)も開催されます。

 

こちらは主に研究論文発表の内容ですが、画像処理の研究に携わっている方であれば、かなり有意義だと思います。

 

主な内容

特別講演 http://www.ssii.jp/special_program_lecture.html

チュートリアル http://www.ssii.jp/special_program_tutorial.html

オーガナイズドセッション http://www.ssii.jp/special_program_organized.html

ん~、気になる。

【参考書籍】〔速攻入門〕 C#プログラミング すぐに現場で使える知識

最近はC#を基礎から勉強しようと思い、わんくま同盟でも活躍されている著者の面々にあこがれて買ったこの本。
サブタイトルの「JavaかC++の知識があれば、いっそう有利な最短ルート」とあるように、この本はC++やJavaと比較しながら説明されています。

 

とくに良かった点は、「C#の××はC++では○○に相当しますが、△△な点が異なります。」というような表現は多かった事。
知りたかったポイントや、知らなくてちょっとヒヤっとした点など、簡素にまとまっています。

 

C#は過去に何かしらのプログラムをやった事があって、.NETの名前空間に慣れれば何となくプログラムできてしまいますが、逆に過去の知識が邪魔をして陥り易いミスもあると思います。

 

そんなC#をある程度やって、初級から中級、上級をめざす方にお勧めな本だと思います。
逆にまったくC#が初めてだと、ちょっと難しく感じると思います。

 

 

目次

Part 1 C#の文法 速攻入門
Chapter 1 C#とは?
1.1 C#の特徴
1.2 .NET Framework
Chapter 2 プログラム構造
2.1 基本的な構文―Hello World
2.2 コメント
2.3 名前空間
2.4 型―名前空間に属するメンバー
2.5 Mainメソッド
Chapter 3 手続きの記述
3.1 式の概要
3.2 ステートメントの概要
3.3 変数の宣言
3.4 演算子
3.5 制御構文
3.6 オーバーフローのチェック
3.7 例外処理
3.8 usingステートメント
3.9 型情報
3.10 既定値
3.11 lockステートメント
3.12 ラムダ式
3.13 クエリ式
Chapter 4 型
4.1 値型と参照型の違い
4.2 組み込み型
4.3 ジェネリック
Chapter 5 クラス
5.1 クラスの定義
5.2 アクセシビリティ
5.3 クラスのメンバー
5.4 静的メンバー
5.5 継承
5.6 クラスの分割定義
5.7 外部メソッド
5.8 匿名クラス
Chapter 6 インターフェイス
6.1 インターフェイスの定義
6.2 インターフェイスの実装
Chapter 7 構造体
7.1 構造体の定義
7.2 クラスあるいは構造体の選択
Chapter 8 列挙型
8.1 列挙型の定義
8.2 列挙型の利用
8.3 ビットフラグ
8.4 拡張メソッドの利用
Chapter 9 デリゲート
9.1 デリゲートの定義
9.2 デリゲートの利用
9.3 匿名関数
Chapter 10 配列
10.1 配列の利用
10.2 多次元配列
10.3 System.Array型
10.4 配列の共変性
Chapter 11 Null許容型
11.1 Null許容型の利用
11.2 Nullable構造体
11.3 型変換
11.4 演算子
Chapter 12 属性
12.1 属性の例
12.2 属性の定義
12.3 属性の適用
12.4 属性値の実行時取得
12.5 C#コンパイラが使用する属性
12.6 相互運用のための属性
Chapter 13 安全でないコード
13.1 ポインターとは?
13.2 「安全でないコード」の注意点
13.3 unsafeコンテキスト
13.4 ポインター型
13.5 sizeof演算子の利用
13.6 アドレスの固定化
13.7 スタックの割り当て
13.8 固定サイズバッファーの埋め込み
Part 2 C#のポイント 速攻入門
Chapter 1 ジェネリック
1.1 ジェネリックの利用方法
1.2 内部的な方式の比較
1.3 実装方式の比較
1.4 メンバー参照
1.5 強い型付け
Chapter 2 定数と読み取り専用
2.1 バージョニング問題
2.2 フィールドの再代入禁止とオブジェクトの不変性
2.3 引数の既定値
Chapter 3 例外処理
3.1 例外の利用場面
3.2 try-catchとtry-finally
Chapter 4 リソース管理
4.1 ガベージコレクション
4.2 デストラクター
Chapter 5 イベント駆動
5.1 イベント構文
5.2 イベントとメモリリーク
Chapter 6 暗黙的な型指定
6.1 冗長性の排除
6.2 オーバーロードとジェネリック
6.3 varと匿名型
Chapter 7 データ処理
7.1 反復子構文
7.2 反復子構文を使ったデータの加工
7.3 LINQ
Part 3 C#活用 速攻入門
Chapter 1 ファイルの読み書き
1.1 サンプルの内容
1.2 LINQを使ったCSVファイルの読み書き
1.3 ReadLinesの内部挙動
1.4 LINQを使わない例
1.5 ファイルの読み書きに関係するその他のクラス
Chapter 2 GUI
2.1 簡単なGUIアプリケーションの例
2.2 GUIと非同期処理
2.3 視覚的デザインツールの利用
2.4 ビューの分離
Chapter 3 Webアクセス
3.1 Webページの表示
3.2 Webアクセスのためのクラス
3.3 Webサービスの利用
3.4 Webアクセスに関係するその他のクラス
Chapter 4 Win32 APIとCOMの扱い
4.1 単純なP/Invokeの例
4.2 文字列を受け渡しするP/Invoke
4.3 文字列を渡す場合のその他の方法
4.4 構造体を利用したP/Invoke
4.5 COMのやり取り
4.6 MS Officeなどとのやり取り
Chapter 5 データベースアクセス
5.1 一番シンプルなADO.NET
5.2 ExecuteReaderとMARS
5.3 DataSetを使ったデータアクセス方法
5.4 DataSetなどで隠蔽されたデータの行方
5.5 DataSetを使ってデータの絞り込みを行う方法
5.6 DataSetを使ったデータの更新削除
5.7 LINQ to SQLを使ってデータの絞り込みを行う方法
5.8 LINQ to SQLを使った更新方法
5.9 LINQ to SQLのその他の違い
5.10 LINQ to SQLのSELECTでストアドプロシージャを使う方法
5.11 Entity Frameworkを利用したデータアクセス
5.12 Entity FrameworkのSELECTでストアドプロシージャを使う方法
5.13 どの技術を使うのが良いのか?
Chapter 6 並列処理
6.1 Threadクラスを利用する方法
6.2 同期化の方法
6.3 プロセスをまたいだ排他処理
6.4 スレッドセーフなコレクション
6.5 デリゲートを利用する方法
6.6 BackgroundWorkerを利用する方法
6.7 Taskを利用する方法
6.8 Parallel.For,Parallel.ForEachを利用する方法
6.9 Parallel LINQを利用する方法
Chapter 7 実行時コード生成
7.1 静的なコード
7.2 リフレクション
7.3 動的に生成したコードのキャッシュ

 

 

OpenCV-2.4.0-GPU-demos-packが公開

OpenCV2.4Betaの公開に引き続き、GPU(CUDA4.1)を使ったOpenCV処理のデモソフト(OpenCV-2.4.0-GPU-demos-pack)が公開されました。

 

入手先はこちら

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

 

このデモを動かすにはCUDA4.1が必要で、インストールされていない場合は、こちら↓

http://developer.nvidia.com/cuda-toolkit-41

 

のサイトの少し下の部分 Developer Drivers Downloads より環境に合わせたドライバをダウンロード、インストールする事で、OpenCV-2.4.0-GPU-demos-packが動作可能となります。

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,

Kinect for Windowsとfor XBOX360の比較

KinectをWindows PCで使うのが正式に許されたKinect for Windowsですが、目玉は

 

●商用利用が可能

●Nearモードの対応

 

ですが、実際に使ってみた比較をまとめてみたいと思います。

 

仕様についての比較はUnaNancyOwenさんのまとめ?ブログが詳しいので、そちらを参照下さい。

 

まず、Kinect for Windowsの特徴Nearモードですが、センサーから40cmまでプレーヤーを認識してくれるというモードで、このよう↓にモニタの上に配置して比較してみました。

 

 

この配置で机に座ると、センサから顔までの距離が約40cmm

 

最初はNearモードは近い距離でも測定できるように広角撮影をしてくれるのか?と思っていましたが、見え方はDefaultモードでも同じで、測定可能範囲がNearモードで、400~3000mm、Defaultモードで800~4000mmになります。
(別のドライバを使っていた時は400mm~でDepthデータは拾えていたので、XBOX360そのものは400mmからの測定能力を持っていると思うのだが...)

 

ただし、プレーヤーを認識するまでには、一度、約120cmぐらい離れないと認識してくれません。

 

また、通常のモードではプレーヤーのスケルトン(関節の位置)も認識してくれますが、Nearモードではユーザーの中心(おそらくプレーヤー領域の重心)のみ1点の認識となります。

 

これについては次期SDKのバージョン1.5で改善されるようです。

(参考)

http://blogs.msdn.com/b/kinectforwindows/archive/2012/03/26/what-s-ahead-a-sneak-peek.aspx

 

深度データそのものに関してはNearモードもDefaultモードも変わらず、表示方法が変わるだけのようです。

 

実際に撮影した様子はこちら↓

■Kinect for Windowsで撮影(Nearモードで撮影しています。)

 

Kinect for XBOX360で撮影

 

まず、気になるのがカラー画像の画質の違い。

Kinect for Windowsでは全体的に霧がかかったようで、少し暗くてボケた感じ。

Kinect for XBOX360の方がキレイな感じがします。

 

そこで、Kinect本体をよーく見てみると、カラーカメラそのものが別物でした。

Kinect for Windowsカメラ Kinect for XBOX360カメラ

 

Kinect for Windowsにはピンホールカメラっぽい物が付いています。

 

また、細かい部分ですが、Kinect for Windowsでは台座を左右に回す事が出来ます。(マニュアルで)

 

 

と言う事で、Kinectが商用利用できるという事はインパクトが大きいのですが、今のところは無理してKinect for Windowsを買う必要は無かったかも?

 

次のバージョンのSDKでどれだけ関節の位置を認識してくれるか?によって、使い方も広がっていくと思われます。

 

※注意点(私がハマった事)
Kinect for Windowsセンサーの箱の底にも書いてありますが、センサをPCに接続する時はUSB2.0のバスを占有するように接続して下さい。
例えば、DualでKinectを接続したい場合やUSBカメラと同時に接続したい場合など、近い場所のUSBポートに接続すると何かしらのデバイスが認識しなくなる場合があります。
その場合はUSBポートを遠い場所(全面と背面とか)やUSBコネクタを抜差ししてみるなど、してみて下さい。

 

ちなみに、今回はモニタの上にそ~っとKinectを置いてみましたが、専用のマウントホルダーなる物も販売されていました。

 

 

後日、マウントホルダーを購入しました。

 

これを使うと机周りもスッキリしてオススメです!

 

【参考書籍】KINECT for Windows SDK プログラミング C#編

2012年2月の初旬に公開されたKinect for WindowsのSDKですが、もうすでにこのSDKの書籍が発刊されました。

 

著者はKinect + OpenNIの本(KINECTセンサープログラミング)を書いた中村薫さんほか。

仕事が早い!!!

 

 

Kinect for Windos SDKにはC++とC#のサンプルがあるのですが、今回はそのC#版について。

 

C#版のSDKは良く出来ていて、カラー画像、深度データ、スケルトンがそれぞれイベントで取得できるので、非常に簡単にデータが取得できます。

この本ではKinectの概要からインストール方法、応用へと、この一冊でほぼ網羅されているのではないでしょうか?

サンプルプログラムもVisual C# 2010 Express版で公開されているので、役にたつと思います。

どこでもタッチスクリーンというサンプルも面白そう。

 

ただ、WPFをやった事の無い私にとって、その部分がちょっと引っかかるのですが、ソースを見た限りだと、そんなにも難しくないかも?

と思っていたら、ちゃんとWPFを使わないFormを使った説明もありました。

 

このFormを使った方法については、私も以前、作った事があるので、下記のページ

 

Kinect for Windows SDK C#サンプルプログラム

 

も参考にして頂けると幸いです。

(深度データをBitmapへ渡す部分が本のサンプルとちょっと違います。)

 

また、OpenCVやOpenGLを使った例が載っていますが、それぞれ.NETのラッパーライブラリを使ったものなので、少しは簡単?だと思われます。(まだ未評価なもので。)

 

目次

1.導入

1.1 Kinectの概要
1.2 ライセンス
1.3 セットアップ
1.4 プロジェクトの作成

2.基本機能

2.1 Kinect for Windowsの概要
2.2 RGBカメラ
2.3 距離カメラ
2.4 プレイヤーの認識
2.5 スケルトンの認識
2.6 WindowsFormsを利用した実装
2.7 音声の取得
2.8 延元後方の取得
2.9 チルトモーター
2.10 Kinectの挿抜検出
2.11 ここまでの全プログラム

3.応用編

3.1 OpenCVを利用した顔認識
3.2 身長を測る
3.3 どこでもタッチスクリーン
3.4 背景マスク
3.5 光学迷彩
3.6 ポーズを認識する
3.7 ロボットを操作する
3.8 Kinectをマウス代わりにする
3.9 音声を認識する
3.10 音源方向のプレイヤーを特定する
3.11 OpenGLを利用した点群の表示

4.便利なライブラリ

4.1 Coding4Fun Kiect Toolkit
4.2 Kinect Toolbox

5.APIリファレンス

5.1 Kinect制御関連APIリファレンス
5.2 RGBカメラ関連APIリファレンス
5.3 距離カメラ関連APIリファレンス
5.4 骨格関連APIリファレンス
5.5 音声関連APIリファレンス

6.ユーザビリティ

6.1 ユーザビリティとは
6.2 良いデザイン
6.3 NUI(ナチュラルユーザーインターフェース)
6.4 Kinectを利用したインターフェース
6.5 最後に

補遺
A StreamingWavePlayer
B SendInput