| 79 | |
| 80 | == Boost.GIL 画像処理入門 == |
| 81 | |
| 82 | Generic Image Library |
| 83 | |
| 84 | === 目標 === |
| 85 | |
| 86 | (初歩的な) 動体検出ができるようになる! |
| 87 | |
| 88 | === GIL とな? === |
| 89 | |
| 90 | * 画像データ保持用コンテナとイテレータ。 |
| 91 | |
| 92 | === 前提知識 === |
| 93 | |
| 94 | * 色空間 |
| 95 | * RGB/RGBA ... o |
| 96 | * HSV ... x |
| 97 | * YCbCr ... x |
| 98 | * CMY/CMYK ... o |
| 99 | * L*a*b* ... x |
| 100 | * Grayscale ... o |
| 101 | * etc... |
| 102 | * 種類 |
| 103 | * ベクタ ... x |
| 104 | * ラスタ ... o |
| 105 | |
| 106 | * 画像の構造 |
| 107 | * ピクセルの集まり |
| 108 | * データ構造 |
| 109 | * データの持ち方は多様。配列を色別に分けたり分けなかったり… |
| 110 | * 動画像の構造 |
| 111 | * コマ送り |
| 112 | |
| 113 | === 基礎の基礎 === |
| 114 | |
| 115 | * 画像の入出力 |
| 116 | * JPEG, PNG, TIFF をサポート |
| 117 | {{{ |
| 118 | rgb8_image_t img; |
| 119 | jpeg_read_image("hoge.jpg", img); // 入力 |
| 120 | jpeg_write_view("fuga.jpg", view(img)); // 出力 |
| 121 | }}} |
| 122 | * 型宣言は ColorSpace, BitDepth, ClassType の組み合わせで表現 |
| 123 | * ColorSpace: rgb, bgr, cmyk, ... |
| 124 | * BitDepth: 8, 8s, 16, 16s, 32f, ... |
| 125 | * ClassType: image, view, loc, pixcel, ptr, ... |
| 126 | * 画像へのアクセス |
| 127 | * 直接 Image は操作しない。 Image View を使用 |
| 128 | {{{ |
| 129 | jpeg_read_image("hoge.jpg", img); // 読み込み |
| 130 | step1 = view(img); // View を取得 |
| 131 | step2 = subimage_view(step1, 200, 300, 150, 150); // 切り取り |
| 132 | step3 = color_converted_view<rgb8_view_t, gray8_pixel_t>(step2); // グレースケール化 |
| 133 | step4 = rotated180_view(step3); // 回転 |
| 134 | step5 = subsampled_view(step4, 2, 1); |
| 135 | jpeg_write_view("hoge_transform.jpg", step5); |
| 136 | }}} |
| 137 | * ピクセルへのアクセス |
| 138 | * image_view::operator() |
| 139 | * Iterator |
| 140 | * 画像の上から下に向かって水平行ごとに走査する。 |
| 141 | |
| 142 | === 動体検出アルゴリズム作成 === |
| 143 | |
| 144 | フレーム間の差分を引くところ |
| 145 | |
| 146 | * グレースケール化した画像の同位置ピクセルを引き算するだけ |
| 147 | |
| 148 | === 参考情報 === |
| 149 | |
| 150 | * http://sites.google.com/site/twinkleofsilence/ |
| 151 | * http://sssm.sakura.ne.jp/dev/gil.html |
| 152 | * http://sourceforge.net/projects/stllcv/ |
| 153 | |
| 154 | === 質疑応答 === |
| 155 | |
| 156 | * ビューを 1 から作ることは可能? |
| 157 | * 作れるけど簡単じゃないかも… |
| 158 | * ビューへの操作をイメージに固定することは可能? |
| 159 | * イメージへコピーするメソッドがある |
| 160 | * 色空間の独自実装は可能? |
| 161 | * 比較的簡単らしい |
| 162 | * 型名が Boost っぽくない |
| 163 | * 実は typedef 。裏ではすんげー長いテンプレート引数が… |
| 164 | * ビューのフィルタ操作による変換コストは? |
| 165 | * 色空間の変換を除けばコストは 0 のハズ |
| 166 | * 中身が const な image を作るには |
| 167 | * rgb8c_image_t のように BitDepth のうしろに "c" が入った型名を使う |
| 168 | * 関数が view を受け取るときは const 参照で受け取ることが推奨されている。この const は view の設定が const なのであって、画像自体が const になるわけではない。 |