【TermuxとOpenCV】画像から顔を検出する
AndroidのTermuxでなぜかOpenCVが動くようになったので、顔検出の実行をテストする。
実行環境
- Android
- Termux
- Python3.9
- JupyterNotebook
- 外部ライブラリ
- OpenCV(顔検出用)
- matplotlib(画像表示と保存用)
- 画像ファイル(顔検出用画像)
- 顔検出用カスケードファイル
目次
カスケードファイルがあるか確認
通常、OpenCVをインストールすると顔や目などを検出する為のカスケードファイル(拡張子はxml)
もダウンロード保存される。これが無いと検出できない。
まずは端末内にダウンロードされているかを確認する。以下のコマンドをTermuxで実行する。
$ find -name haarcascade_frontalface_alt.xml
このコマンドで、引数に指定したファイルを全フォルダカレントディレクトリ以下から検索する。
- もし見つかれば相対パスが出力される。
- 見つからなければ何も表示されない。
- 検索するファイル名を間違えると検索失敗する。
なので、
$ find -name haar*.xml
で曖昧検索するとファイル名の間違いは減らせるかも。
カスケードファイルが無かったら、ダウンロードする
カスケードファイルをダウンロード
無かったので、 次のようにしてネット上からファイルをダウンロードしてきます。
$ wget https://raw.githubusercontent.com/opencv/opencv/master/data/haarcascades/haarcascade_frontalface_alt.xml
wget 指定URL
で入力する。
これで顔検出(正面)用カスケードファイルがカレントディレクトリにダウンロードされ、「haarcascade_frontalface_alt.xml
」で保存されます。
もしwgetコマンドが入ってなければ
$ pkg install wget
で先にwgetをインストールしてから行う。
※)必ずしもwgetを使う必要はありません。
画像の用意
顔検出用の画像を用意してください。
カスケードファイルが正面顔用なので、正面を向いたもの。横向いてたりすると検出されない。
◆ 用意した画像
実装
画像とカスケードファイルが準備できたら、あとはコードを書くのみ。
import cv2 # 画像読み込み img = cv2.imread("noumen.JPG") # カスケード分類器の読み込み(カレントディレクトリに保存してある) cascade = cv2.CascadeClassifier("./haarcascade_frontalface_alt.xml") # グレースケールに変換 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 顔検出 face = cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=3, minSize=(30, 30)) # 顔を赤色の矩形で囲む for (x, y, w, h) in face: cv2.rectangle(img, (x, y), (x + w, y+h), (0, 0, 200), 3)
# 画像表示・保存用にインストール import matplotlib.pyplot as plt # 表示 #plt.imshow(img)
# 検出済み画像の保存 cv2.imwrite("face.jpg", img)
True
検出結果
◆ JupyterNotebookのキャプチャ
※)OpenCVは画像のRGB配列を逆から読むので青く表示されています。
◆ できた画像
参考リンク
PythonでOpenCVを使った顔検出してみた - Hello Ys world ?
おわりに
動作を確認した。しかしなぜOpenCVが動くようになったのかが謎…インストール失敗続きで諦めていたのですが。
良かった良かった🤭