index †
第1回の趣旨 †
Linux †
- ディレクトリの変更,コンパイルなどLinuxの操作に慣れよう。
OPenCVサンプルプログラム †
- サンプルプログラムを動かしてみよう。
- サンプルプログラムを改造してみよう。
サンプルの実行 †
サンプルプログラムのダウンロード †
- ここからダウンロード。
- ダウンロードしたら適当な場所で解凍しましょう。
まずは,サンプルプログラムを動かしてみよう †
- samples/open_saveのディレクトリに移動し、以下のコマンドを実行し、コンパイルします。
$make
- コンパイルが通ったら、以下のコマンドを実行します。
$./main
- 何かキーを押すとopen_saveのフォルダにJPG形式で読み込んだ画像を保存し、終了します(save_img.jpg)。
- サンプルプログラムは全部で5種類あります(readme参照)。
他のサンプルプログラムも問題無く動くことを確認して下さい。
- 他のサンプルプログラムでは、コマンドライン引数で読み込む処理になっています。
コマンドライン引数で画像を指定する場合は以下のコマンドを実行します。
$./main ../images/00.bmp
- サンプルで読み込む画像はsamplesフォルダ内のimagesにあります。
別の画像を読み込んでみましょう。
解説 †
makeファイル †
makeは、修正を加えたファイルの管理と、それらのファイルを再コンパイル・再リンクし、
実行可能ファイルを作成するための作業を簡略化するユーティリティです。
makeはMakefileに記述された指示に従って動作します。
つまり、今まではコンパイルのときに
g++ main main.cpp -g 'pkg-config opencv --cflags' 'pkg-config opencv --libs' -lstdc++ -o
と入力していましたが、それを
make
と入力するだけでよくなります。
Makefileの中身を見てみると、コンパイルに必要な情報が書き込まれていることがわかります。
特に分割コンパイルやたくさんのライブラリを指定するときに、makeは有用なツールになりますので、
その文法など調べてみてください。
コマンドライン引数 †
コマンドライン引数とは、main関数に渡す引数のことです。
コマンドライン引数のないmain関数では、例えば、
int main(void)
と括弧の中にvoidを書きます。
コマンドライン引数のあるmain関数では、例えば、
int main(int argc, char *argv[])
と書きます。
ここで、int argcは引数の総個数で、char *argv[]は引数の文字列を指すポインタの配列を表します。
argv[0]にはプログラム名が格納されます。
argv[1]以降には、実行時に入力した文字列が格納されます。
また、argcが表す引数の総個数にはプログラム名が含まれます。
例えば、実行時に実行ファイル名の後にスペースを空けて文字列を入力します。
./main ../images/00.bmp
このとき、argc = 2となり、argv[1] = "../images/00.bmp"となります。
OpenCV 1.0の基本構造体 †
OpenCVにはたくさんの基本構造体があらかじめ定義されています。
もっともよく使う構造体が画像情報を格納するIplImage?構造体です。
typedef struct _IplImage{
char *imageData; /*画像データへのポインタ*/
int width; /*画像の幅*/
int height; /*画像の高さ*/
int widthStep; /*画像データの幅のバイト数(画素数ではない)*/ ... etc.
}IplImage;
cvLoadImage?でロードされた画像の情報は、このIplImage?構造体として格納されます。
画像がない場合はNULLが返り値として渡されます。
構造体のメンバにアクセスするには、アロー演算子を使います。
例えば、構造体名imgの画像の幅の値を取得したいときは、
img->width
と記述します。
練習1:サンプルを改造してみよう †
- scanfを使って任意の画像を読み込めるようにしてみよう。
- 同様に,scanfを使って画像に処理を加えるパラメータ(スケール、切り取り位置、回転角度など)
を入力できるようにしてみよう。
課題1:画像処理ソフトを作ろう(基本編) †
下記の機能をコマンドで実行できる画像処理ソフトを作成してください †
コマンドの例
(読み込み)read ../images/00.bmp
(リサイズ)resize 0.5
- 画像ファイルの読み込み・保存
- コマンドライン引数ではなく、ソフトの起動後でも任意のファイルを指定して読み込めるようにしてください。
- 下記の画像処理を施した画像を、任意のファイル名で保存できるようにしてください。
- リサイズ
- 任意のスケールを指定してリサイズできるようにしてください。
- 切り取り
- 任意の位置とサイズを指定して画像の一部を切り取れるようにしてください。
- 反転
- 任意の軸(水平、垂直、両方)で反転できるようにしてください。
- 回転
- 任意の位置(x,y座標)、回転角度、スケールを指定して回転できるようにしてください。
- その他
注意事項 †
- 指定したファイルが存在しない、パラメータが足りない、異常なパラメータが指定されたなど、
処理が実行できない場合には、適切なエラーメッセージを表示してください。
- 適宜コメントを入れたり、関数化したりして、他人にもわかりやすいプログラムになるように心がけてください。
全くコメントのないものは減点します。
- 他人のプログラムを写したことが判明した場合は、両者とも0点になります。
- 課題内容に対応していないプログラムには点をつけられません。
提出方法 †
- 第3回(4/26)の講義中に課題プログラムのコンパイルと実行が正しくできるかを確認します。
- 下記の提出物を第3回の講義日(4/26)の24:00までにCLEで提出してください。
- 提出物一式を入れるフォルダの名前は学生番号(ログインIDではない!)とし、zipファイルに圧縮してください。
- 提出物
- ソースコード
- コンパイルに使用するMakefile
- 作成したソフトの仕様や実行方法等を記載したReadme.txt
- その他、コンパイル・実行に必要なファイル
評価方法 †
- 仕様を満たしているか。
- ソースコードの可読性の高さ。
- 機能ごとに関数を分け、わかりやすい関数名をつけているか
(機能ごとにソースを分けて分割コンパイルをしてもよい)。
- 分かりやすい変数名をつけているか。
- 分かりやすいコメントを記述しているか。
- 機能に対応した分かりやすいコマンドであるか。
- 無駄な処理を行っていないか。
- 工夫に応じて加点します。
参考になるサイト †
質問がある場合 †
- 中西研 大西までメールをください.
なお,件名は「AP2017:課題1」としてください.
yuya.onishi_AT_ams.eng.osaka-u.ac.jp (_AT_は@に変えてください)