index

第1回の趣旨

Linux

  • ディレクトリの変更,コンパイルなどLinuxの操作に慣れよう。

OpenCVサンプルプログラム

  • サンプルプログラムを動かしてみよう。
  • サンプルプログラムを改造してみよう。

サンプルの実行

サンプルプログラムのダウンロード

  1. ここからダウンロード。
  2. ダウンロードしたらホームディレクトリに解凍しましょう。

準備(パスの設定)

  1. ダウンロードしたディレクトリ中の.bash_profileをホームディレクトリにコピーします。
    $cp ~/samples/.bash_profile ~/
  2. .bash_profileに書かれているコードを実行します。
    $source ~/.bash_profile
    もし、実行中に
    ./hoge: error while loading shared libraries: libopencv_core.so.3.2: cannot open shared object file: No such file or directory
    のエラーが表示された場合は、上のsourceコマンドを再実行してください。

サンプルプログラムを動かしてみよう

  1. samples/open_saveのディレクトリに移動し、以下のコマンドを実行し、コンパイルします。
    $make
  2. コンパイルが通ったら、以下のコマンドを実行します。
    $./main
  3. 何かキーを押すとopen_saveのフォルダにJPG形式で読み込んだ画像を保存し、終了します(save_img.jpg)。
  4. サンプルプログラムは全部で5種類あります(readme参照)。
    他のサンプルプログラムも問題無く動くことを確認して下さい。
  5. 他のサンプルプログラムでは、コマンドライン引数で読み込む処理になっています。
    コマンドライン引数で画像を指定する場合は以下のコマンドを実行します。
    $./main ../images/00.bmp
  6. サンプルで読み込む画像はsamplesフォルダ内のimagesにあります。
    別の画像を読み込んでみましょう。

解説

makeファイル

makeは、修正を加えたファイルの管理と、それらのファイルを再コンパイル・再リンクし、
実行可能ファイルを作成するための作業を簡略化するユーティリティです。
makeはMakefileに記述された指示に従って動作します。
つまり、今まではコンパイルのときに

$g++ main.cpp -g -I/usr/local/include/opencv2 -I/usr/local/include/opencv -lopencv_core -lopencv_imgcodecs -lopencv_highgui -lopencv_imgproc -o main

と入力していましたが、それを

$make

と入力するだけでよくなります。

-I/***はヘッダファイルを探すディレクトリへのパス***を指定します。

-l***はライブラリ***へリンクします。

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 3.2の基本クラス(構造体)

OpenCVにはたくさんの基本クラスがあらかじめ定義されています。
もっともよく使うクラスが画像情報を格納するMatクラスです。

class CV_EXPORTS Mat{
    char *data; /*画像データへのポインタ*/
    int cols; /*画像の幅*/
    int rows; /*画像の高さ*/ ... etc.
};

imread関数でロードされた画像の情報は、このMatクラスとして格納されます。
画像がない場合はdataメンバがfalseを返します。

クラスのメンバにアクセスするには、ドット演算子を使います。
例えば、クラス名imgの画像の幅の値を取得したいときは、

img.cols

と記述します。

練習1:サンプルを改造してみよう

  1. resize.cppをscanfを使って任意の画像を読み込めるようにしてみよう。
  2. 同様に,scanfを使って画像に処理を加えるパラメータ(スケール)を入力できるようにしてみよう。
    そのときに0以下や2以上の数値が入力された場合にエラーメッセージを表示して終了するようにしてください。

課題1:画像処理ソフトを作ろう(基本編)

下記の機能を実行できる画像処理ソフトを作成してください [#q9c7dd3f]

  1. 画像ファイルの読み込み
    • 実行後に画像を指定できるようにしてください。
  2. 画像処理
    • 下記の処理からコマンドにより一つを選択できるようにし、それを実行してください。
    1. リサイズ
      • 任意のスケールを指定してリサイズできるようにしてください。
    2. 切り取り
      • 任意のスケールを指定して画像の一部を切り取れるようにしてください。
    3. 反転
      • 任意の軸(水平、垂直、両方)で反転できるようにしてください。
    4. 回転
      • 任意の回転角度とスケールを指定して回転できるようにしてください。
    5. その他
      • 画像処理に関する機能を実装してください。
  3. 処理後の画像の表示と保存
    • 任意のファイル名で処理画像を保存できるようにしてください。

実行例

$./main
画像ファイルを指定してください。
../images/00.bmp(入力)
処理を選択してください (resize, cut, flip, rotation, or other)。
resize(入力)
リサイズのスケールを入力してください。
0.5(入力)
保存ファイル名を入力してください。
resized00.png(入力)

注意事項

  • 指定したファイルが存在しない、パラメータが足りない、異常なパラメータが指定されたなど、
    処理が実行できない場合には、適切なエラーメッセージを表示してください。
  • 適宜コメントを入れたり、関数化したりして、他人にもわかりやすいプログラムになるように心がけてください。
    全くコメントのないものは減点します。
  • 他人のプログラムを写したことが判明した場合は、両者とも0点になります。
  • 課題内容に対応していないプログラムには点をつけられません。

提出方法

  • 第3回(4/25)の講義中に課題プログラムのコンパイルと実行が正しくできるかを確認します。
  • 下記の提出物を第3回の講義日(4/25)の24:00までにCLEで提出してください。
  • 提出物一式を入れるフォルダの名前は学生番号(ログインIDではない!)とし、zipファイルに圧縮してください。
  • 提出物
    • ソースコード
    • コンパイルに使用するMakefile
    • 作成したソフトの仕様や実行方法等を記載したReadme.txt
    • その他、コンパイル・実行に必要なファイル

評価方法

  • 仕様を満たしているか。
  • ソースコードの可読性の高さ。
    • 機能ごとに関数を分け、わかりやすい関数名をつけているか
      (機能ごとにソースを分けて分割コンパイルをしてもよい)。
    • 分かりやすい変数名をつけているか。
    • 分かりやすいコメントを記述しているか。
  • 機能に対応した分かりやすいコマンドであるか。
  • 無駄な処理を行っていないか。
  • 工夫に応じて加点します。

参考になるサイト

質問がある場合

  • 中西研 大西までメールをください.
    なお,件名は「AP2018:課題1」としてください.
    yuya.onishi_AT_ams.eng.osaka-u.ac.jp (_AT_は@に変えてください)

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-03-19 (月) 23:36:05 (189d)