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