湯LOG

主に自分用のメモ

ITK/VTKをPythonから使用するための準備

Requirements

  • CMakeのインストール
  • Pythonのインストール
  • VisualStudio

Build ITK/VTK

基本的な流れは以前書いた記事を参照してください。yuzatakujp1013.hatenablog.com
今回は、以前の記事に加えて、Python wrapping のビルドをしたいと思います。

CMake

Advanced Options にチェックをつけます。

BUILD_SHARED_LIBS CHECK
ITK_USE_64BITS_IDS UNCHECK
WRAP_ITK_PYTHON CHECK

環境によってはCMake変数が違うかもしれません。

PYTHON_EXECUTABLE C:/Python2.7/python.exe
PYTHON_INCLUDE_PATH C:/Python2.7/include
PYTHON_LIBRARY C:/Python2.7/libs/python27.lib
PYTHON_LIBRARY_DEBUG C:/Python2.7/python27.dll

Releaseモードでビルドする場合は、PYTHON_DEBUG_LIBRARYは設定しなくても大丈夫です。

あとはいつも通り設定し、Configure→Generateで終了。

VisualStudio上でALL_BUILD、INSTALLをする。

最後に、PYTHONPATH変数に$(ITK_DIR)\lib\InsightToolkit\WrapITK\Pythonを追加。

pythonを起動して、import itk が通れば無事完了です。

VTKについても同様です。(確か)

OpenCV tips

- Mat(C++)とCvMat(C)の変換

// Mat → CvMat 代入で変換.
Mat img1;
CvMat _img1 = img1;
// CvMat → Mat コンストラクタで変換.
CvMat img2;
Mat _img2(img2);

どちらの変換もデータはコピーされず参照する

- Matの初期化

Mat m1(3, 3, CV_32F, Scalar(0));
Mat m2(3, 3, CV_32F, 0);  // これだと0で初期化されない
Mat m2(3, 3, CV_32F, 5);  // 0以外は初期値として使われるがScalar()を使ったほうが良い

Matの初期化にはScalar()を使う

- Matのビット深度(ID)をチェック

std::cout << "depth(ID):" << img.depth() << endl;

//CV_8U -> 0
//CV_8S -> 1
//CV_16U -> 2
//CV_16S -> 3
//CV_32S -> 4
//CV_32F -> 5
//CV_64F -> 6

ビット深度は、1ピクセル内の1チャンネルの値を何ビットで表すかということ
数字はビット数で、Uはunsigned、Sはsigned、Fはfloating pointの意味

- CSVファイルをMatに読み込み(行列数指定)

// --------------------------------------------------------------------------------------
// CSV読み込み
//
// 戻り値(bool) 成功 true 失敗 false
//
bool CsvRead(const char* filename,    // CSVファイルの名前
            Mat &m,                 // データを格納するMat
            const int rows,         // 行数
            const int cols)            // 列数
{
    m.create(rows, cols, CV_64F);

    // CSVファイルを開く
    FILE *fp;
    errno_t err = fopen_s( &fp, filename, "r");
    if ( err != 0 )
    {
        fputs("file open error", stderr);
        return false;
    }

    // CSVデータ読み込み
    char line_buffer[1024];
    for(int row = 0; ( (int)fgets( line_buffer, 1024 - 1, fp ) != EOF ) && row < rows; row++)
    {
        if ( strchr( line_buffer, '\n') != NULL )
        {
            line_buffer[strlen(line_buffer)-1] = '\0';
        }

        char *sep_char_pointer;
        char *data_pointer = line_buffer;
        for ( int col = 0; col < cols; col++ )
        {
            m.at<double>(row, col) = atof( data_pointer );
            sep_char_pointer = strchr( data_pointer, (int)',');
            data_pointer = sep_char_pointer + 1;
        }
    }
    fclose(fp);

    return true;
}

- Pixelにアクセス

Mat img(row, col, CV_8UC3);
Mat_<Vec3b>& imgV = (Mat_<Vec3b>&)img;
b = imgV(y, x)[0];
g = imgV(y, x)[1];
r = imgV(y, x)[2];

- カラー画像をRGB各チャネル画像に分離

Mat imgColor(row, col, CV_8UC3);
vector<Mat> planes;
split(imgColor, planes);

- グレー画像3枚でカラー画像を作成

Mat imgColor;
merge(vector<Mat>(3, imgGray), imgColor);

- 重心の計算

Mat img(100, 100, CV_8U); // 処理画像
Moments m = moments(img, true); // モーメントを計算
int cx = (int)(m.m10/m.m00); // 重心のX座標
int cy = (int)(m.m01/m.m00); // 重心のY座標

0以外の値を持った画素領域の重心

- 画素数のカウント

Mat img(100, 100, CV_8U); // 処理画像
Moments m = moments(img, true); // モーメントを計算
int count = (int)m.m00; // 値を持った画素数

- 輝度ウインドウ処理を施して画面表示

void WindowedShow(const string& windowName,    // 表示するウインドウ名
                const Mat& img,                // 画像データ
                const double windowMin,        // 輝度ウインドウの下限
                const double windowMax)        // 輝度ウインドウの上限
{
    Mat imgShow(img.size(), CV_8U);
    img.convertTo(imgShow, CV_8U, 255.0/(windowMax - windowMin), -windowMin);
    namedWindow(windowName, CV_WINDOW_AUTOSIZE);
    imshow(windowName, imgShow);
}

実数型や16bit整数型のイメージを表示する時に使う
最小値、最大値はcv::minMaxLoc(img, &min, &max)で取得可能

- 画像全体のPixel値をシフトする

cv::Mat img(height, width, CV_8U, (void*)pdata);
int shift = -5;
// img = img + shift とは書けない
cv::add(img, (double)shift, img); // これが正解
// 同時に型の変換も行うconvertTo()も使える
// imgCvrt = img * gain + bias;
img.convertTo(imgCvrt, CV_32F, gain, bias);


随時更新します。

SQL初心者のおぼえがき(4)

以下の記事の続きです。yuzatakujp1013.hatenablog.com
yuzatakujp1013.hatenablog.com
yuzatakujp1013.hatenablog.com

4回にわたってMySQLの基本的なコマンドを見ていきましたが、おそらく今回で最後となります。

新しいテーブルの作成

これまで扱ってきたテーブルに加え、postsテーブルを新たに作成します。

mysql> create table posts (
    -> id int not null primary key auto_increment,
    -> user_id int not null,
    -> title varchar(255),
    -> body text,
    -> created datetime
    -> );
mysql> insert into posts(user_id, title, body, created) values
    -> (1, 'title-1 by taguchi', 'body-1', '2012-05-11 14:00:00'),
    -> (1, 'title-2 by taguchi', 'body-2', '2012-05-11 12:00:00'),
    -> (2, 'title-3 by suzuki', 'body-3', '2012-05-11 13:00:00'),
    -> (4, 'title-4 by kimura', 'body-4', '2012-05-11 10:00:00'),
    -> (4, 'title-5 by kimura', 'body-5', '2012-05-11 09:00:00');

複数のテーブルの操作

JOIN

複数のテーブルをまたがる場合、少し書き方がめんどうになってきます。

SELECT "テーブル名1"."フィールド名1" , "テーブル名2"."フィールド名2" from "テーブル名1","テーブル名2"

これだけだとちょっとわかりづらいので例を見てみましょう。
例えば、blog_usersテーブルのnameと、postsテーブルのtitleを紐付けて表示したい場合

mysql> select blog_users.name,posts.title from blog_users,posts where blog_users.id = posts.user_id;
+---------+--------------------+
| name    | title              |
+---------+--------------------+
| taguchi | title-1 by taguchi |
| taguchi | title-2 by taguchi |
| suzuki  | title-3 by suzuki  |
| kimura  | title-4 by kimura  |
| kimura  | title-5 by kimura  |
+---------+--------------------+

where文では、blog_usersテーブルのユーザIDとpostsテーブルのIDが等しいものを表示するよう条件を指定しています。
このように、複数のテーブルのデータを結合することを一般にJOINといいます。

UNION

次に、二つのSQL文の結果を結合するコマンドを見ていきます。
これにはUNION文を使います

[SQL文1] UNION [SQL文2]
mysql> select created from blog_users union select created from posts;
+---------------------+
| created             |
+---------------------+
| 2015-05-11 10:00:00 |
| 2015-06-21 20:00:00 |
| 2015-06-28 15:00:00 |
| 2015-06-29 16:00:00 |
| 2012-05-11 14:00:00 |
| 2012-05-11 12:00:00 |
| 2012-05-11 13:00:00 |
| 2012-05-11 10:00:00 |
| 2012-05-11 09:00:00 |
+---------------------+

UNION文はJOINと多少類似しますが、UNIONでは同じデータの種類に対して使われます。
また、UNIONは重複した値は一つにまとめるようになっています。(これはDISTINCT文に近い)
重複を許し、条件に一致するデータを表示したいときは UNION ALL を使います。

Subquery

SELECT "フィールド1" FROM "テーブル1" WHERE "フィールド2" [比較演算子]
(SELECT "フィールド1" FROM "テーブル2" WHERE "条件");

WHERE 句又は HAVING 句にもう一つのSQL文を挿入すると、テーブルの結合や他のテーブルの情報の抽出が可能になります。(Subqueryという)
今回のテーブルではいい感じのSQL文が作れなそうなので例は割愛します、、


以上で、自分が重要だと感じたMySQLコマンドの紹介を終わります。

SQL初心者のおぼえがき(3)

以下の記事の続きです。yuzatakujp1013.hatenablog.com
yuzatakujp1013.hatenablog.com

レコードの更新、削除

今まで特に触れていなかったレコードの更新・削除をしていきます。
まずは現在のテーブルを見てみます。

mysql> select * from users;
+----+---------+---------------+--------+-------+---------------------+
| id | name    | email         | team   | score | created             |
+----+---------+---------------+--------+-------+---------------------+
|  1 | taguchi | taguchi@email | blue   |   5.5 | 2015-05-11 10:00:00 |
|  2 | suzuki  | suzuki@email  | yellow |   8.2 | 2015-06-21 20:00:00 |
|  3 | yukawa  |               | red    |   2.3 | 2015-06-21 13:00:00 |
|  4 | kimura  | kimura@email  | yellow |   7.4 | 2015-06-28 15:00:00 |
|  5 | tanaka  | tanaka@email  | blue   |   4.2 | 2015-06-29 16:00:00 |
+----+---------+---------------+--------+-------+---------------------+

yuzawaさんのemailが抜けています。
そこで、yuzawaさんのemailを更新します。
レコードの更新には、UPDATE文を使います。

UPDATE ”テーブル名” SET "レコード名" = 値 WHERE 条件
mysql> update users set email = 'yukawa@email' where id = 3;

これで、レコードの更新は完了です。

次にレコードの削除に移ります。
レコードの削除はDELETE文を使います。

DELETE FROM "テーブル名" WHERE 条件
mysql> delete from users where score < 3.0;

これで、スコアが3.0未満のフィールドは消えました。

テーブルの構造を変更

続いて、フィールドの追加・変更・削除、インデックスの追加・削除、テーブルの名前変更などについて見ていきます。

フィールドを加える
ALTER TABLE "テーブル名" ADD "追加したいフィールド名" "サイズ"
mysql> alter table users add full_name varchar(255) after name;
フィールドを変更
ALTER TABLE "テーブル名" CHANGE "新しいフィールド名" "変更元フィールド名" "新しいフィールドのサイズ"
mysql> alter table users change full_name full_name varchar(100);
フィールドを削除
ALTER TABLE "テーブル名" DROP "フィールド名"
mysql> alter table users drop full_name;

インデックスの追加・削除

インデックスの追加はADD、削除はDROPです。

mysql> alter table users add index email (email);
mysql> alter table users drop index email;

テーブルの名前の変更

ALTER TABLE "テーブル名" RENAME "新しいテーブル名"
mysql> alter table users rename blog_users;
mysql> show tables;
+-------------------------+
| Tables_in_test_database |
+-------------------------+
| blog_users              |
+-------------------------+


なんか雑になってしまった。。。
次は複数のテーブルを扱っていきたいと思います。

SQL初心者のおぼえがき(2)

前回の続き。yuzatakujp1013.hatenablog.com

テーブルとレコードを更新しておきます。

mysql> create table users(
    -> id int not null primary key auto_increment,
    -> name varchar(255),
    -> email varchar(255),
    -> team enum('blue', 'red', 'yellow'),
    -> score double,
    -> created datetime
    -> );
mysql> insert into users (name, email, team, score, created) value
    -> ('taguchi', 'taguchi@email', 'blue', 5.5, '2015-05-11 10:00:00'),
    -> ('suzuki', 'suzuki@email', 'yellow', 8.2, '2015-06-21 20:00:00'),
    -> ('yukawa', 'yukawa@email', 'red', 2.3, '2015-06-21 13:00:00'),
    -> ('kimura', 'kimura@email', 'yellow', 7.4, '2015-06-28 15:00:00'),
    -> ('tanaka', 'tanaka@email', 'blue', 4.2, '2015-06-29 16:00:00');

レコードの抽出

レコードの抽出にはSELECT文を使います。

SELECT "フィールド名" FROM "テーブル名"
mysql> select * from users;
+----+---------+---------------+--------+-------+---------------------+
| id | name    | email         | team   | score | created             |
+----+---------+---------------+--------+-------+---------------------+
|  1 | taguchi | taguchi@email | blue   |   5.5 | 2015-05-11 10:00:00 |
|  2 | suzuki  | suzuki@email  | yellow |   8.2 | 2015-06-21 20:00:00 |
|  3 | yukawa  | yukawa@email  | red    |   2.3 | 2015-06-21 13:00:00 |
|  4 | kimura  | kimura@email  | yellow |   7.4 | 2015-06-28 15:00:00 |
|  5 | tanaka  | tanaka@email  | blue   |   4.2 | 2015-06-29 16:00:00 |
+----+---------+---------------+--------+-------+---------------------+
5 rows in set (0.00 sec)

これは全てのフィールド(*)を、usersテーブルから抽出する処理です。
ちなみに、フィールドが多すぎるとき、横幅が収まりきらないときは

mysql> select * from users \G;

とするといい感じに表示してくれます。

レコード内の重複を許さない場合は、DISTINCT文を使います。

mysql> select distinct team from users;
+--------+
| team   |
+--------+
| blue   |
| yellow |
| red    |
+--------+

また、レコード名に別名を付けたい場合は、

SELECT "テーブル別名"."フィールド1" "フィールド別名" FROM "テーブル名" "テーブル別名";

テーブルの規模が大きくなったり、複雑になってくると有効になってきます。(最初は特に意識する必要ないかも)

条件付きで抽出

データを選択的に抽出する場合はWHERE文を追加します。

SELECT "フィールド名" FROM "テーブル名" WHERE "条件"
mysql> select * from users where score = 5.5;
+----+---------+---------------+------+-------+---------------------+
| id | name    | email         | team | score | created             |
+----+---------+---------------+------+-------+---------------------+
|  1 | taguchi | taguchi@email | blue |   5.5 | 2015-05-11 10:00:00 |
+----+---------+---------------+------+-------+---------------------+
1 row in set (0.00 sec)

この時の条件式には、等号=、等号否定!=(<>)、不等号<, > などがあります。
また、○○以上△△以下と指定したい場合はBETWEENを使います。

mysql> select * from users where score between 5.0 and 8.0;
+----+---------+---------------+--------+-------+---------------------+
| id | name    | email         | team   | score | created             |
+----+---------+---------------+--------+-------+---------------------+
|  1 | taguchi | taguchi@email | blue   |   5.5 | 2015-05-11 10:00:00 |
|  4 | kimura  | kimura@email  | yellow |   7.4 | 2015-06-28 15:00:00 |
+----+---------+---------------+--------+-------+---------------------+

また、○○または△△と指定したい場合はINを使います。(ORを使ってもできます)

mysql> select * from users where team in ('red', 'blue');
+----+---------+---------------+------+-------+---------------------+
| id | name    | email         | team | score | created             |
+----+---------+---------------+------+-------+---------------------+
|  1 | taguchi | taguchi@email | blue |   5.5 | 2015-05-11 10:00:00 |
|  3 | yukawa  | yukawa@email  | red  |   2.3 | 2015-06-21 13:00:00 |
|  5 | tanaka  | tanaka@email  | blue |   4.2 | 2015-06-29 16:00:00 |
+----+---------+---------------+------+-------+---------------------+

曖昧な抽出をするときには、LIKE文を追加します。

mysql> select * from users where email like '%@email';

%は任意の文字列を意味しており、この場合、@emailがつくレコードを抽出します。
任意の1文字としたい場合は、_(アンダーバー)を使います。

並び替え・件数の制限

データの値で並び替えしたい場合は、ORDER BYを使います。(降順の場合は末尾にDESCを追加)

mysql> select * from users order by score;
+----+---------+---------------+--------+-------+---------------------+
| id | name    | email         | team   | score | created             |
+----+---------+---------------+--------+-------+---------------------+
|  3 | yukawa  | yukawa@email  | red    |   2.3 | 2015-06-21 13:00:00 |
|  5 | tanaka  | tanaka@email  | blue   |   4.2 | 2015-06-29 16:00:00 |
|  1 | taguchi | taguchi@email | blue   |   5.5 | 2015-05-11 10:00:00 |
|  4 | kimura  | kimura@email  | yellow |   7.4 | 2015-06-28 15:00:00 |
|  2 | suzuki  | suzuki@email  | yellow |   8.2 | 2015-06-21 20:00:00 |
+----+---------+---------------+--------+-------+---------------------+

抽出件数の制限をする場合には、LIMITを使います。

mysql> select * from users order by score desc limit 2;
+----+--------+--------------+--------+-------+---------------------+
| id | name   | email        | team   | score | created             |
+----+--------+--------------+--------+-------+---------------------+
|  2 | suzuki | suzuki@email | yellow |   8.2 | 2015-06-21 20:00:00 |
|  4 | kimura | kimura@email | yellow |   7.4 | 2015-06-28 15:00:00 |
+----+--------+--------------+--------+-------+---------------------+

これは、スコアの値を降順で並び替えた結果のうち上位2件のみ表示させる文です。

「抽選で1名選ぶ」という処理をしたい場合にもLIMITを使います。
ランダムで1名選ぶ必要があるので乱数を発生させるRAND()を使います。

mysql> select * from users order by rand() limit 1;
+----+--------+--------------+------+-------+---------------------+
| id | name   | email        | team | score | created             |
+----+--------+--------------+------+-------+---------------------+
|  5 | tanaka | tanaka@email | blue |   4.2 | 2015-06-29 16:00:00 |
+----+--------+--------------+------+-------+---------------------+

データの集計

レコードの総件数を調べたい場合、COUNT文を使います。

mysql> select count(*) from users;
+----------+
| count(*) |
+----------+
|        5 |
+----------+

また、最大値(MAX)、最小値(MIN)、平均値(AVG)、合計値(SUM)などといった計算も可能です。

mysql> select max(score) from users;
+------------+
| max(score) |
+------------+
|        8.2 |
+------------+

グループ集計したい場合は、GROUP BYを使います。
例えば、チームごとで平均点を算出したい場合

mysql> select team, avg(score) from users group by team;
+--------+------------+
| team   | avg(score) |
+--------+------------+
| blue   |       4.85 |
| red    |        2.3 |
| yellow |        7.8 |
+--------+------------+

SUMやAVGなどの関数の値に条件付けを行いたい場合、残念ながらWHERE文は使うことができません。
そこで、HAVING文を使います。

mysql> select team, avg(score) from users group by team having avg(score) > 5.0; 
+--------+------------+
| team   | avg(score) |
+--------+------------+
| yellow |        7.8 |
+--------+------------+

文字列

あるレコードの文字列の長さを取得したい場合はLENGTH()を使います。

mysql> select email, length(email) from users;
+---------------+---------------+
| email         | length(email) |
+---------------+---------------+
| taguchi@email |            13 |
| suzuki@email  |            12 |
| yukawa@email  |            12 |
| kimura@email  |            12 |
| tanaka@email  |            12 |
+---------------+---------------+

文字列を連結させたい場合は、CONCAT文を使います。

CONCAT ( 文字列 1, 文字列 2, 文字列 3, ...)
mysql> select concat(name, '(',team,')') from users;
+----------------------------+
| concat(name, '(',team,')') |
+----------------------------+
| taguchi(blue)              |
| suzuki(yellow)             |
| yukawa(red)                |
| kimura(yellow)             |
| tanaka(blue)               |
+----------------------------+

結果の名前が長ったらしくてわかりづらいので、AS文で名前を変えましょう。

mysql> select concat(name, '(',team,')') as LABEL from users;
+----------------+
| LABEL          |
+----------------+
| taguchi(blue)  |
| suzuki(yellow) |
| yukawa(red)    |
| kimura(yellow) |
| tanaka(blue)   |
+----------------+

また、文字列の先頭1文字だけ抽出するのにSUBSTRING文を使います。
strにおけるpos番目の位置から、len個の文字を読み込みます。

SUBSTRING (str, pos, len)
mysql> select name, substring(team, 1, 1) as TEAM_INITIAL from users;
+---------+--------------+
| name    | TEAM_INITIAL |
+---------+--------------+
| taguchi | b            |
| suzuki  | y            |
| yukawa  | r            |
| kimura  | y            |
| tanaka  | b            |
+---------+--------------+


とりあえずこんなところ。
レコードの更新、削除などについてまだ触れていなかったので次回に。(更新しました)yuzatakujp1013.hatenablog.com

InsightApplicationsのビルド

InsightApplicationsとは

簡単に言うとITKを使った医用画像アプリケーションです。
ITKのセグメンテーションやレジストレーションの実装などがアプリケーション化されています。
ITK - Segmentation & Registration Toolkit

手順

以前書いた、以下のセットアップが終わっている前提で進めていきます。yuzatakujp1013.hatenablog.com

CMake_GUI

ITKのビルド時に

ITKV3_COMPATIBILITY Check
ITK_LEGACY_REMOVE UnCheck

とする必要があります。なので、ITKのビルドをやり直しましょう。

あとは普通にITKAPPのビルド

[Where is the source code]: C:/Program Files (x86)/insight_App/ITKApps
[Where to build the binaries]: C:/bin_ITKAPP

[Advanced] Check

[Configure]ボタンを押す → visualstudio2013 64bit を選択

[各種設定]
といっても特に変更するところはありません。
しいて言えば、

USE_VolviewPlugIns UnCheck

としたところ。VolViewが入ってなかったので。(あとで入れようかな)

・Configure, Generateが無事終了したらITKApps.slnを開く
・[ALL_BUILD]をビルド
...なんと、エラーが発生

'InsightApplications\MRIBiasCorrection\OptionList.cxx(37): error C2664: 'std::make_pair' : cannot convert parameter 1 from 'std::string' to 'const std::string &&'' and 'You cannot bind an lvalue to an rvalue reference'

なにやら型の違いによるエラーっぽい。
自分と同じく困っている人がいないかぐぐってみると、いました。
http://comments.gmane.org/gmane.comp.lib.itk.devel/1735
C++のバージョンによるものなのかな?

make_pair()

のところを

pair()

にしたところ、解決することができました!
ここはちゃんと対処してほしいところ。。
そんなこんなでALL_BUILD、INSTALLが無事終了しました。
これでITKAppsが使えるようになったと思います。
どんなことができるか等、おいおい紹介できたらと思います。

ITK+VTK+Qtのビルド

・Build VTK with Qt

CMake_GUI

[Where is the source code]: C:/Program Files (x86)/VTK_6.3/vtk
[Where to build the binaries]: C:/bin_VTK

[Advanced] Check

[Configure]ボタンを押す → visualstudio2013 64bit を選択

[各種設定]

BUILD

BUILD_EXAMPLES Check(おまかせ)
BUILD_SHARED_LIBS UnCheck(rapperを使う場合Check)
BUILD_TESTING UnCheck(時間かかるので)

CMAKE

CMAKE_CONFIGURATION_TYPES Debug;Release
CMAKE_INSTALL_PREFIX C:/bin_VTK

(ここは特に問題がなければデフォルトから変えないほうがいいかも)

MODULE

Module_vtkGUISupportQtOpenGL Check
Module_vtkRenderingOpenGL Check

OPENGL

OPENGL_gl_LIBRARY opengl32
OPENGL_glu_LIBRARY glu32

QT

QT_QMAKE_EXECUTABLE C:/Qt/5.4/msvc2013_opengl/bin/qmake.exe
Qt5Core_DIR C:/Qt/5.4/msvc2013_opengl/lib/cmake/Qt5Core
Qt5Gui_DIR C:/Qt/5.4/msvc2013_opengl/lib/cmake/Qt5Gui
Qt5Network_DIR C:/Qt/5.4/msvc2013_opengl/lib/cmake/Qt5Network
Qt5OpenGL_DIR C:/Qt/5.4/msvc2013_opengl/lib/cmake/Qt5OpenGL
Qt5Sql_DIR C:/Qt/5.4/msvc2013_opengl/lib/cmake/Qt5Sql
Qt5WebKitWidgets_DIR C:/Qt/5.4/msvc2013_opengl/lib/cmake/Qt5WebKitWidgets
Qt5WebKit_DIR C:/Qt/5.4/msvc2013_opengl/lib/cmake/Qt5WebKit
Qt5Widgets_DIR C:/Qt/5.4/msvc2013_opengl/lib/cmake/Qt5Widgets
Qt5_DIR C:/Qt/5.4/msvc2013_opengl/lib/cmake/Qt5

VTK

VTK_ALL_NEW_OBJECT_FACTORY Check
VTK_Group_Imaging Check
VTK_Group_Qt Check
VTK_QT_VERSION 5
VTK_INSTALL_QT_PLUGIN_DIR ${CMAKE_INSTALL_PREFIX}/${VTK_INSTALL_QT_DIR}
VTK_RENDERING_BACKEND OPENGL(NOT OPENGL2)

[Add Entry]

Name: CMAKE_DEBUG_POSTFIX
Type: STRING
Value: -gd

・Configure, Generateが無事終了したらVTK.slnを開く(管理者で開かないとINSTALLで失敗する場合あり)
・[ALL_BUILD]をビルド
・[INSTALL]をビルド
INSTALLではCMAKE_INSTALL_PREFIXで指定したディレクトリ内にincludeとlibフォルダをまとめてくれます。
特にエラーがなければ終了!

環境変数VTK_DIRを作成してVTKのパスを設定する。
環境変数QTDIRを作成してQtのパス(C:\Qt\Qt5.4.0\5.4\msvc2013_opengl)を設定する。
環境変数Pathに;%VTK_DIR%\bin;%QTDIR%\binを追加する。

・Build ITK

CMake_GUI

[Where is the source code]: C:/Program Files (x86)/InsightToolkit-4.7.1
[Where to build the binaries]: C:/bin_ITK

[Advanced] Check

[Configure]ボタンを押す → visualstudio2013 64bit を選択

[各種設定]

BUILD

BUILD_EXAMPLES Check(おまかせ)
BUILD_SHARED_LIBS UnCheck(rapperを使う場合Check)
BUILD_TESTING UnCheck(時間かかるので)

CMAKE

CMAKE_INSTALL_PREFIX C:/bin_ITK/INSTALL

なぜかC:/bin_ITKにしようとしたらエラーになりました。
(ここは特に問題がなければデフォルトから変えないほうがいいかも)

ITK_USE_REVIEW CHECK
ITK_USE_64BITS_IDS CHECK

MODULE

itkVtkGlue CHECK

OTHER

VTK_DIR C:/bin_VTK

・Configure, Generateが無事終了したらITK.slnを開く
・[ALL_BUILD]をビルド
・[INSTALL]をビルド
特にエラーがなければ終了!
ただ、自分の場合はitkVtkGlue-4.7.libが見つかりませんとエラーが出ました。
どうやらitkVtkGlue-4.7.libがちゃんと生成されてないみたいです。
C:/bin_ITK/lib/CmakeにあるitkVtkGlue.cmakeを見てみると、どうやら必要なvtkのヘッダーのパスがうまく通ってない?
おそらく、vtkの[CMAKE_INSTALL_PREFIX]がデフォルトではC:/Program Files (x86)/VTKとなっていて、ここを変更してしまったためパスがうまく読み込めていなかったのかと。
またCMakeからやり直すのは面倒なので、module/bridge/itkVtkGlueにあるitkVtkGlue.slnを開き、追加のインクルードディレクトリでC:/bin_VTK/includeを追加します。
そしてALL_BUILD、INSTALLをすると無事にitkVtkGlue-4.7.libが生成できました。
もっとうまい方法あると思いますが、、

最後に、環境変数ITK_DIRを作成してITKのパスを設定します。
環境変数Pathに;%ITK_DIR%\binを追加。

ITK+VTK+Qtのビルドについての情報があまりなかったので参考にしていただければと思います。