自分のPCには、何もソフトウェアをインストールせずに、次のような画像処理をためすことができます
出力画像(変換後の画像)、猫の顔の位置を認識して、そこに円を書き足しています。
Google Colaboratoryを使用しますので、Googleアカウントは必要になります。
1. Google Colaboratoryにつなげます
###「Googleドライブ」と検索して、Googleアカウントでサインインします。
「新規」「その他」「アプリの追加」を選択します。
Colaboratoryを選択します。
「続行」をクリックして、Colaboratoryをインストールします。
インストールが終わると、「新規」「その他」から、「Google Colaboratory」を選ぶことができます。
「Google Colaboratory」を選択すると、新規ファイルが作られてColaboratoryが始まります。
これ以降は、3.必要なファイルを用意する、以外はすべてColaboratoryの中での操作となります。
2. OpenCV、描画ライブラリ(matplotlib)の読み込み
Colaboratoryの最初のセルに以下を打ち込んで、Shift+Enterキーを押す。OpenCVのバージョン(2020.08.17時点で4.1.2)が表示されればOKです。
%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から学習済みのデータをダウンロードする。
とりあえず、猫の顔を認識するための、haarcascade_frontalcatface.xml ファイルをクリックします。
4. ファイルをColaboratoryにアップします
次のコードを、2つ目のセルに記述してShift+Enterキーを押します。
from google.colab import files # colaboratoryのライブラリからファイル操作を使用する。
f = files.upload() # ファイルをアップロードする。
ファイルは次の2つをアップします。
- 変換したい画像ファイル
- haarcascade_frontalcatface.xml (3.必要なファイルを用意する、でダウンロードしたファイル)
以下のコードを次のセルに記述してShift+Enterを押して実行し、アップロードしたファイルの名前が出力されることを確認してください(この例の場合、変換したい画像のファイル名は、"IMG_20200808_181512.jpg"です)。
!ls # システムコマンドのlsを実行して、ファイルがアップされているか確認する。
# 出力
# haarcascade_frontalcatface.xml IMG_20200808_181512.jpg sample_data
5. OpenCVで画像を読み込む
新しいセルに、次のコードを記述してShift+Enterを押して実行してください。
# ファイル名(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内から消えてしまうので、その時は、再度アップロードしてください。
6. 顔認識して、顔の位置に丸と矢印を描画する
次のコードを新しいセルに書いて、Shift+Enterを押して実行してください。cv2.circle、cv2.putTextの詳細は、OpenCVの描画機能などをご参照ください。
# 学習済みファイルからモデルを生成
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)
次のように猫の顔に丸が書かれ、矢印が付いていれば成功です。
ただ、顔を認識できない時もあります。例えば、この画像では、後ろに三毛猫さんがこちらを向いているのですけど、その顔は、認識できていません。
7. OpenCVのその他の機能
OpenCV-Pythonチュートリアル等のサイトをご参照ください。