コンピュータビジョン特論第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 入射光 単版式:CCDの前にカラーフィルタを置いて1個のCCDで各色を撮影 画素数Nに対して 赤と青はN/4の解像度 緑はN/2の解像度 変換式によって各画素をRGBに変換 (フィルタの配列と変換式は 各メーカーがしのぎを削っている) 低コスト、小型化が容易 人間の目には自然(色の分解能が低い) 各画素ごとに3色均等配置するのが理想的だが3倍の素子が必要 各色不均一な配列 →ベイヤー配列、ベイヤーパターン
コンピュータ上での画像の取り扱い 左上が原点 の場合が多い 幅(width) 画像は、二次元配列上にならんだデータの集まり 一個のデータを、画素(pixel)と呼ぶ 高さ(height) 画像サイズ:幅×高さや画素数で表す 640x480 100万画素 カラー画像は、複数の画像の重ね合わせで表現する それぞれの画像のことを、プレーン(plane)、もしくは、チャンネル(channel)と呼ぶ RGB(赤、緑、青)の3プレーンを用いることが多い 他にも、YUVやHSVなどや αチャンネル(透明度)を用いる場合がある
画像のメモリ配置 1つの画素の1つのチャンネルのデータ のビット数をデプスと呼ぶ 例。256段階ならデプスは8ビット R G B 1画素のビット数を bps(ビットパーピクセル)と呼ぶ bps = デプス×チャンネル数 R G B R G B R G B R G B (0,0) (1,0) (n,0) (0,1) 次の行の先頭までのバイト数を ラインステップと呼ぶ ラスタスキャン: 左上から右に順番にメモリ上に配置され 右端までくると一段下の左端から順に配置される 複数チャンネルの場合は画素ごとに各チャンネルを並べることが多い チャンネルごとに並べる場合もある
動画の取り扱い 画像が時間軸上に並んでいる 一枚一枚の画像をフレームと呼ぶ 1秒間のフレーム数をフレームレート(fps)と呼ぶ 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の変わりにopencv-configを使う
プログラムで画像を扱う (IplImage構造体) テキスト4.2節 R G B R G B R G B R G B (0,0) (1,0) (n,0) (0,1)
新しい画像の作成 640×480の画像サイズ、デプス8、3チャンネルの画像を作る
ファイルからの画像の読み書き IplImage *image; 読み込み 書き込み 1:カラー画像として読み込み 0:濃淡画像として読み込み -1:画像ファイルに従う isColor 画像ファイルのフォーマットはsuffix(拡張子)から自動的に判断する 読み込めるフォーマットは、ppm, pgm, pbm, png, jpeg, tiff, bmpなど セーブできる画像は、デプスが8(符号なし)、1か3チャンネルの画像のみ それ以外の場合は、cvSave(マニュアル参照)を使うか、自分で保存用の関数を作成すること
画素へのアクセス ある画素のメモリ上のアドレスを計算 x座標×チャンネル数×デプス unsigned char *pixel; /* デプスが8ビット符号なし の場合 */ y座標 *depth デプスが8以外の場合 x座標 RGB3チャンネルの場合 赤:pixel[0] 緑:pixel[1] 青:pixel[2] y座標×widthStep
画素の型と変数の型の関係 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構造体で動画の取り込みを行なう ムービーからの取り込みもカメラからの取り込みも可能 カメラの番号(-1にすると自動選択) IplImage *image; →cvCaptureFromAVI(“ファイル名”); 画像を1フレーム読み込む
課題レポート OpenCVもしくは、その他の画像を処理する環境をインストールする テキスト図3(Example3.c)程度の簡単なプログラムを作成し、動作を確認する。(処理内容は何でも良い) レポートには次の内容をまとめる 動作環境 OSとそのバージョン 使用ライブラリとそのバージョン(ライブラリを使用しない場合はなし) コンパイラとそのバージョン 実験に使えるカメラの有無 プログラムリスト(長い場合は主要部分のみ) 実行結果 処理内容の説明と考察