# サンプルコードを見てみよう

Visual Studioの環境が整ったので，プログラムを書いて動かしてみましょう．

以下のプログラムを見てください．

```cpp
#include <opencv2/opencv.hpp>
#include <opencv2/opencv_lib.hpp>
#include <opencv2/highgui/highgui.hpp>

int main(void)
{
  cv::Mat src_img;
  src_img = cv::imread("ファイルパス", 1);
  // 画像が読み込まれなかったらプログラム終了
  if(src_img.empty()) return -1;

  // 結果画像表示
  cv::namedWindow("Image", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
  cv::imshow("Image", src_img);
  cv::waitKey(0);
}
```

プログラムの説明をします．

まず，OpenCVが提供する関数(プログラム)は，cv::～といった名前がつけられています(cv::Mat,cv::imshow()など)．

これらの関数を利用するために，opencv.hpp,opencv\_lib.hpp，highgui.hppというヘッダーファイルを読み込ませる必要があります．今のところは`「今からOpenCVの関数を使いますよ～」`という合図だと思ってもらえれば良いでしょう．

(ヘッダーファイルについてはもっと詳しく知りたい人のために、この節の最後に説明を載せておきました．参考にしてください．)

```cpp
    cv::Mat src_img;
```

`Mat`クラスはMatrix(行列)の略で，2次元の行列を用意します．

OpenCVでは，画像を2次元の行列として扱います．

![](https://2160312601-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M3sMj-40xF-Lk9SgbWF%2F-M3sMjP1oaC_UT9JpkR-%2F-M3sMsle6bnENIuuUPZA%2FRGB.png?generation=1585788721603796\&alt=media)

今回扱うのはカラー画像ですから，1枚の画像につき3つの行列を作ることになります．

コンピュータで扱うことの出来るディジタル画像は，基本的に赤・緑・青の3つの色の強さの度合いの組み合わせで表現されています．

ディジタル画像についての色の表現方法や，詳しい表色系の説明については，この講義では詳しく話をする時間がないので省略させて頂きます．とりあえず，この時点では`画像は行列によって表現される`と覚えておいて下さい．

```cpp
    src_img = imread("ファイルパス", 1);
```

`imread`という関数は，ファイルから画像を読み込む為の関数です．引数はそれぞれ，ファイルの存在する場所(パス)，画像の読み込みモードです．画像の読み込みモードは1ならばカラー，0ならばグレースケールに変換します．

なお，グレースケール画像として読み込む場合は，白黒成分を表すだけで良いですから，行列は1つだけ用意されます．

```cpp
　// 画像が読み込まれなかったらプログラム終了
  if(src_img.empty()) return -1;
```

画像が上手く読み込めなかった場合は，プログラムが止まるようにします．このような処理を`例外処理`といいます．このプログラムは，指定した画像を読み込めなければ，その後の処理を行うことが出来ません．指定した画像がない場合，プログラムは正しく動くことが出来ないのです．そこでプログラムが不正に終了したり，また暴走する事を防ぐために例外処理のコードを書いておくのです．

```cpp
　// 結果画像表示
  namedWindow("Image", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
  imshow("Image", src_img);
  waitKey(0);
```

`namedWindow()`は読み込んだ画像を表示するためのウィンドウを作る関数です．

ここでは，src\_imgという名前のウィンドウを，カメラのキャプチャサイズに合わせてウィンドウを作れというコードを書いています．

ウィンドウサイズは自分で自由に指定することも出来ますが，特別な理由が無い限りはオートサイズにしておく方が良いでしょう．

なお，ウィンドウの名前には日本語も使用出来ます．

`imshow()`はnamedWindow()で作ったウィンドウに，読み込んだ画像を入れて画面に表示する関数です．imshow()はnamedWindow()とセットで使うということを覚えておきましょう．

先のnamedWindow()でImageという名前のウィンドウを作ったので，Imageウィンドウにsrc\_img(つまり，読み込んだ画像)を入力して表示させるという命令をしています．

`waitKey()`は指定したキーのキー入力があるまで次のコードを実行せずに待機する関数です．引数に0を指定した場合は，キーボードのいずれかのキーを押すまで待機する，という意味になります．

実行すると，ファイルパスで指定した画像が画面に表示されます．

![](https://2160312601-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M3sMj-40xF-Lk9SgbWF%2F-M3sN6ZFbLPh2yITsxp1%2F-M3sN7baD4tU-DPaqYMR%2F%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88_2015_12_16_11_37.png?generation=1585788786018645\&alt=media)

## ヘッダーファイル(.h/.hpp)とは

ヘッダーファイルは，C言語やC++系の言語を使用する時に使われるファイルで，主に外部ファイルで定義された関数の形や構造体の形などを予め定義しておき，様々なプログラムで繰り返し使用できるようにまとめています．

`stdio.h`は**standard IO**の略で，コンピュータプログラムにおける入出力に関する関数をまとめたファイルです．

コンピュータ演習2やコンピュータ演習3を受けた人は，`printf()`や`scanf()`などの関数を使って，コンソール画面に文字列を表示したり，キーボードからの入力を受け付けたりしましたね．この関数は，`stdio.h`をimportしたおかげで使えるのです．

OpenCVの場合も同じで，cv::Matのようにcv::と名前がついている関数については，OpenCV専用のヘッダーファイルをimportすることで使えるようになるというわけです．

### .hと.hppの違い

ここで，`.h`と`.hpp`の違いって何?という疑問が出てくるかもしれません．

率直に言ってしまうと，.hも.hppも本質的には変わりがありません．

以下の表はC言語,C++の各ファイルとその拡張子の対応を示しています．

| 種類            | 拡張子    |
| ------------- | ------ |
| C言語のプログラムファイル | \*.c   |
| C言語のヘッダーファイル  | \*.h   |
| C++のプログラムファイル | \*.cpp |
| C++のヘッダーファイル  | \*.hpp |

単純に両者のファイルが似ているので，差別化を行っているだけです．

C++のヘッダーファイルでも.hという拡張子をつけることができますが，どちらの言語で扱うヘッダファイルなのかわからなくなるので，.hppという拡張子で保存することが望ましいでしょう．
