Google ColaboratoryでOpenCVをためす

# 自分のPCには、何もソフトウェアをインストールせずに、次のような画像処理をためすことができます

入力画像（元画像）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275020/6fbd8238-90b6-382d-f14b-6546ebb94357.png">

出力画像（変換後の画像）、猫の顔の位置を認識して、そこに円を書き足しています。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275020/7edcf3f8-3231-1bfe-1d66-6ed63bca0595.png">

Google Colaboratoryを使用しますので、Googleアカウントは必要になります。




# 1. Google Colaboratoryにつなげます

###「Googleドライブ」と検索して、Googleアカウントでサインインします。
<img width="360px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275020/21565a2f-eb73-fb83-5f50-ebb285a64678.png">


### 「新規」「その他」「アプリの追加」を選択します。
<img width="360px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275020/bb2f12a9-aa13-ade4-19a7-3afb04fd5750.png">

### Colaboratoryを選択します。
<img width="360px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275020/a4e7a3db-b3d9-63fa-4264-c7236cc6d3db.png">

### 「続行」をクリックして、Colaboratoryをインストールします。
<img width="360px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275020/bd7b79d4-645c-9f23-5d8e-4921f63eaedb.png">

### インストールが終わると、「新規」「その他」から、「Google Colaboratory」を選ぶことができます。
<img width="360px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275020/86af74cd-6f28-a973-e8fa-bdf1e027b534.png">

### 「Google Colaboratory」を選択すると、新規ファイルが作られてColaboratoryが始まります。
<img width="360px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275020/eb54f426-b6fa-beae-33a3-851c47d19458.png">


これ以降は、3.必要なファイルを用意する、以外はすべてColaboratoryの中での操作となります。

# 2. OpenCV、描画ライブラリ(matplotlib)の読み込み

Colaboratoryの最初のセルに以下を打ち込んで、Shift+Enterキーを押す。OpenCVのバージョン（2020.08.17時点で4.1.2）が表示されればOKです。

```python
%matplotlib inline # matplotlibの出力をインライン(ポップアップじゃない)にする。
import cv2 # opencvの読み込み
import matplotlib.pyplot as plt # matplotlibを読み込んで、pyplotを pltという名前で使う。
print(cv2.__version__) # opencvのバージョンを表示して、読み込みを確認する。
# 出力
# 4.1.2
```



# 3. 必要なファイルを用意する

### [https://github.com/opencv/opencv/tree/master/data/haarcascades](https://github.com/opencv/opencv/tree/master/data/haarcascades)から学習済みのデータをダウンロードする。

とりあえず、猫の顔を認識するための、haarcascade_frontalcatface.xml ファイルをクリックします。
<img width="360px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275020/4c04131d-f4dc-7d3c-332a-733562cac963.png">

「Raw」を「右クリック」してファイルを保存します。
<img width="360px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275020/1a2f497d-26e4-11d2-2e4d-cfc8e016f3d1.png">


# 4. ファイルをColaboratoryにアップします

次のコードを、2つ目のセルに記述してShift+Enterキーを押します。

```python
from google.colab import files # colaboratoryのライブラリからファイル操作を使用する。
f = files.upload() # ファイルをアップロードする。
```
「ファイル選択」を押して、ファイルをアップロードします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275020/ac7c6e5a-70a2-74bf-abcc-9bdebfc08e4c.png">

ファイルは次の2つをアップします。

1. 変換したい画像ファイル
2. haarcascade_frontalcatface.xml (3.必要なファイルを用意する、でダウンロードしたファイル）

以下のコードを次のセルに記述してShift+Enterを押して実行し、アップロードしたファイルの名前が出力されることを確認してください（この例の場合、変換したい画像のファイル名は、"IMG_20200808_181512.jpg"です）。

```python
!ls # システムコマンドのlsを実行して、ファイルがアップされているか確認する。
# 出力
# haarcascade_frontalcatface.xml	IMG_20200808_181512.jpg  sample_data
```




# 5. OpenCVで画像を読み込む

新しいセルに、次のコードを記述してShift+Enterを押して実行してください。

```python
# ファイル名(IMG_20200808_181512.jpg)は、自分の画像のファイル名に変えてください。
img = cv2.imread("./IMG_20200808_181512.jpg") # 画像の読み込み
show_img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) # 表示のためBGRをRGBに変換する。
plt.imshow(show_img) # matplot.libを用いて読み込んだ画像を表示します。
```

次のように、アップロードした画像が表示されればOKです。
またアップロードファイルは、ある程度時間が経つとColaboratory内から消えてしまうので、その時は、再度アップロードしてください。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275020/e02746e9-9764-6e98-54bf-1e0de6f062ab.png">

# 6. 顔認識して、顔の位置に丸と矢印を描画する

次のコードを新しいセルに書いて、Shift+Enterを押して実行してください。cv2.circle、cv2.putTextの詳細は、[OpenCVの描画機能](http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_gui/py_drawing_functions/py_drawing_functions.html)などをご参照ください。

```python
# 学習済みファイルからモデルを生成
face_cascade = cv2.CascadeClassifier('./haarcascade_frontalcatface.xml')
# グレー画像を生成
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 顔認識
faces = face_cascade.detectMultiScale(gray, 1.3, 5)

# 認識結果でループする x,y:顔矩形の左上, w,h:顔矩形の幅と高さ
for (x,y,w,h) in faces:
  # 顔の位置に丸を描く
  img = cv2.circle(img,(x+int(w/2),y+int(h/2)),int(max(w/2,h/2)),(0,0,255),12)
  # 文字によって矢印を描く
  cv2.putText(img,"<---",(x+w,y+int(h/2)),
    cv2.FONT_HERSHEY_SIMPLEX,8,(0,0,255),32,cv2.LINE_AA)

# 描画用にRGBに変換 
show_img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
# 結果の描画
plt.imshow(show_img)
```

次のように猫の顔に丸が書かれ、矢印が付いていれば成功です。
<img width="360px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275020/b5e737a6-1453-2d3d-808e-e138397b8eb6.png">
ただ、顔を認識できない時もあります。例えば、この画像では、後ろに三毛猫さんがこちらを向いているのですけど、その顔は、認識できていません。

# 7. OpenCVのその他の機能

[OpenCV-Pythonチュートリアル](http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_tutorials.html)等のサイトをご参照ください。