Transcript CV02-2

コンピュータビジョン特論第2回
コンピュータでの画像の扱いと
OpenCVの使い方
加藤丈和
2006年10月11日
今回の内容
• コンピュータビジョンについて学ぶ準備として、
画像の撮影のしくみ、コンピュータ上での画
像の扱いについて学ぶ。
• OpenCVのインストール方法、基本的な使い
方について学ぶ。
画像の撮影のしくみについて
• カメラで画像を撮影して、コンピュータに取り
込む仕組み
– ここでは取り込みまでの仕組みの概要について
• 色についての詳細は第6回
• カメラモデルや幾何的なしくみの詳細は第9回から第
11回
画像の撮影のしくみ(モノクロ)
カメラ
同期信号(30Hz、24Hzなど)
レンズ
絞り
メモリ
同軸ケーブル(NTSC)
IEEE1394(DCAM, DV)
USB(motion jpeg)など
エンコーダ
被写体
受光素子が二次元
配列上に並んでいる
キャプチャカード
インタフェース
デコーダ
撮像素子(CCD,CMOS)
メモリに取り込む
受光素子:フォトトランジスタ
など光を電荷に変換する素
子
受光素子の数を画素数と呼ぶ
画像の撮影のしくみ(カラー、3CCD方式)
絞り レンズ
CCD(赤)
入射光
CCD(緑)
分光器(プリズム)
CCD(青)
CCD
3CCD方式:分光器(プリズム)で分光し
て赤、緑、青それぞれの光を3個のCCD
で撮影する
各色の解像度が高い(色にじみがない)
コストがかかる
小型化が困難
画像の撮影のしくみ(カラー、単版式)
カラーフィルタの例
(ベイヤー配列)
絞り レンズ
CCD カラーフィルタ
入射光
各画素ごとに3色均等配置するのが
理想的だが3倍の素子が必要
画素数Nに対して
赤と青はN/4の解像度
緑はN/2の解像度
変換式によって各画素をRGBに変換
(フィルタの配列と変換式は
各メーカーがしのぎを削っている)
各色不均一な配列
→ベイヤー配列、ベイヤーパターン
低コスト、小型化が容易
人間の目には自然(色の分解能が低い)
単版式:CCDの前にカラーフィルタを
置いて1個のCCDで各色を撮影
コンピュータ上での画像の取り扱い
高さ(height)
左上が原点
の場合が多い
幅(width)
画像は、二次元配列上にならんだデータの集まり
一個のデータを、画素(pixel)と呼ぶ
画像サイズ:幅×高さや画素数で表す
640x480 100万画素
カラー画像は、複数の画像の重ね合わせで
表現する
それぞれの画像のことを、プレーン(plane)、
もしくは、チャンネル(channel)と呼ぶ
RGB(赤、緑、青)の3プレーンを用いることが多い
他にも、YUVやHSVなどや
αチャンネル(透明度)を用いる場合がある
画像のメモリ配置
1つの画素の1つのチャンネルのデータ
のビット数をデプスと呼ぶ
例。256段階ならデプスは8ビット
R G B
1画素のビット数を
bps(ビットパーピクセル)と呼ぶ
bps = デプス×チャンネル数
R G B R G B
(n,0)
(0,1)
次の行の先頭までのバイト数を
ラスタスキャン:
ラインステップと呼ぶ
左上から右に順番にメモリ上に配置され
右端までくると一段下の左端から順に配置される
R G B R G B
(0,0)
(1,0)
複数チャンネルの場合は画素ごとに各チャンネルを並べることが多い
チャンネルごとに並べる場合もある
動画の取り扱い
フレーム
t
•
•
•
•
画像が時間軸上に並んでいる
一枚一枚の画像をフレームと呼ぶ
1秒間のフレーム数をフレームレート(fps)と呼ぶ
必要なメモリが膨大になるので、通常1から数フレー
ム分の画像のみメモリにおいて処理する
OpenCVによる画像処理プログラミング
• OpenCVのインストールに関する解説
• 前述のコンピュータによる画像の扱いを踏ま
えて、OpenCVによる基本的な画像の扱いを
学ぶ
OpenCVのインストール方法、プログ
ラムのコンパイル方法
• テキスト参照
注意:
• Fedora Core 5のopencvパッケージは、カメラまわりのライ
ブラリが組み込まれていないので、ソースからコンパイルしな
おすか
http://vrl.sys.wakayama-u.ac.jp/CV/opencv-fc5/
においてあるパッケージを利用すること
• Opencv-0.9.9のサンプルプログラムのビルドはmakeで行な
う
• Opencv-0.9.5以前ではpkg-configの変わりにopencvconfigを使う
プログラムで画像を扱う
(IplImage構造体)
• テキスト4.2節
R G B R G B
(0,0)
(1,0)
R G B R G B
(n,0)
(0,1)
新しい画像の作成
640×480の画像サイズ、デプス8、3チャンネルの画像を作る
ファイルからの画像の読み書き
IplImage *image;
読み込み
書き込み
isColor
1:カラー画像として読み込み
0:濃淡画像として読み込み
-1:画像ファイルに従う
画像ファイルのフォーマットはsuffix(拡張子)から自動的に判断する
読み込めるフォーマットは、ppm, pgm, pbm, png, jpeg, tiff, bmpなど
セーブできる画像は、デプスが8(符号なし)、1か3チャンネルの画像の
み
それ以外の場合は、cvSave(マニュアル参照)を使うか、自分で保存用の
関数を作成すること
画素へのアクセス
• ある画素のメモリ上のアドレスを計算
x座標×チャンネル数×デプス
y座標
unsigned char *pixel; /* デプスが8ビット符号なし
の場合 */
*depth
x座標
y座標×widthStep
デプスが8以外の場合
RGB3チャンネルの場合
赤:pixel[0]
緑:pixel[1]
青:pixel[2]
画素の型と変数の型の関係
unsigned char *pixel; /* デプスが8ビット符号なし
の場合 */
こちらが使える環境なら
こちらのほうが安全
uint8_t *; or unsigned char *
sint8_t *; or signed char *
uint16_t *; or unsigned short *
sint16_t *; or signed short *
uint32_t *; or unsigned int *
sint32_t *; or signed int *
float *
double *
どのCでも使えるが
サイズは環境依存
サンプルプログラム(前半)
サンプルプログラム(後半)
実行結果
• 画素値を反転
動画像処理
• ムービーファイルを読みこんで処理
• カメラから直接キャプチャ
– Windowsの場合:VFW(Video for Windows)に
対応したカメラ(ほとんど)
– Linuxの場合:Video4Linux対応のカメラ、もしく
はDCAM(IEEE1394非圧縮)のカメラ
– MacOSXの場合:QuickTime対応のカメラ
(iSightなど)
動画の処理(Capture構造体)
(テキスト図11のサンプルより)
• Capture構造体で動画の取り込みを行なう
• ムービーからの取り込みもカメラからの取り
込みも可能
IplImage *image;
カメラの番号(-1にすると自動選択)
→cvCaptureFromAVI(“ファイル名”);
画像を1フレーム読み込む
課題レポート
•
•
•
OpenCVもしくは、その他の画像を処理する環境を
インストールする
テキスト図3(Example3.c)程度の簡単なプログラ
ムを作成し、動作を確認する。(処理内容は何でも
良い)
レポートには次の内容をまとめる
1. 動作環境
•
•
•
•
OSとそのバージョン
使用ライブラリとそのバージョン(ライブラリを使用しない場合は
なし)
コンパイラとそのバージョン
実験に使えるカメラの有無
2. プログラムリスト(長い場合は主要部分のみ)
3. 実行結果
4. 処理内容の説明と考察