Category Archives: OpenCV

OpenCV(3) OpenCV Face Detection

Python, OpenCVで顔検出と瞳検出(顔認識、瞳認識)

静止画の特徴検出

静止画: 画像ファイルを読み込んで顔検出と瞳検出

Macにhomebrewでopencv3をインストールした場合、

/usr/local/opt/opencv/share/OpenCV/haarcascades/
に学習済のHaar-like特徴を用いた分類器のデータ(xmlファイル)がある。

以下のようにいくつかの種類のデータが用意されている。

  • 正面の顔検出用: haarcascade_frontalface_default.xml
  • 瞳検出用: haarcascade_eye.xml
  • 笑顔検出用: haarcascade_smile.xml

cv2.CascadeClassifier()でパスを指定してxmlファイルを読み込む。

サンプル画像の用意

上の写真をダウンロードして保存し、必要なフォルダを作成して、写真を移動してください。

$ mkdir data
$ mkdir data/src
$ mkdir data/dst
$ cp ~/Downloads/Lenna_test_image.png data/src/lena_square.png

検出領域の枠を描画

そしてViでサンプルコードを作成

$ vi test2.py 

サンプルコード(test2.py)

import cv2
  
face_cascade_path = '/usr/local/opt/opencv/share/'\
                    'OpenCV/haarcascades/haarcascade_frontalface_default.xml'
eye_cascade_path = '/usr/local/opt/opencv/share/'\
                   'OpenCV/haarcascades/haarcascade_eye.xml'

face_cascade = cv2.CascadeClassifier(face_cascade_path)
eye_cascade = cv2.CascadeClassifier(eye_cascade_path)

src = cv2.imread('data/src/lena_square.png')
src_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

faces = face_cascade.detectMultiScale(src_gray)

for x, y, w, h in faces:
    cv2.rectangle(src, (x, y), (x + w, y + h), (255, 0, 0), 2)
    face = src[y: y + h, x: x + w]
    face_gray = src_gray[y: y + h, x: x + w]
    eyes = eye_cascade.detectMultiScale(face_gray)
    for (ex, ey, ew, eh) in eyes:
        cv2.rectangle(face, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)

cv2.imwrite('data/dst/opencv_face_detect_rectangle.jpg', src)

 

処理結果

$ python2 test2.py
[ INFO:0] Initialize OpenCL runtime…

$ ls -al data/dst/
total 256
drwxr-xr-x 3 chen staff 96 6 20 00:48 .
drwxr-xr-x 5 chen staff 160 6 20 00:50 ..
-rw-r–r–@ 1 chen staff 110477 6 25 01:07 opencv_face_detect_rectangle.jpg

ファイル data/dst/opencv_face_detect_rectangle.jpg が作成されたことが確認した。

検出領域にモザイク処理

検出した領域にモザイクをかけたりすることもできる。

Viでサンプルコードを作成

$ vi test3.py 

import cv2
  
face_cascade_path = '/usr/local/opt/opencv/share/'\
                    'OpenCV/haarcascades/haarcascade_frontalface_default.xml'
eye_cascade_path = '/usr/local/opt/opencv/share/'\
                   'OpenCV/haarcascades/haarcascade_eye.xml'

face_cascade = cv2.CascadeClassifier(face_cascade_path)
eye_cascade = cv2.CascadeClassifier(eye_cascade_path)

src = cv2.imread('data/src/lena_square.png')
src_gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)

faces = face_cascade.detectMultiScale(src_gray)

ratio = 0.05

for x, y, w, h in faces:
    cv2.rectangle(src, (x, y), (x + w, y + h), (255, 0, 0), 2)
    face = src[y: y + h, x: x + w]
    face_gray = src_gray[y: y + h, x: x + w]
    eyes = eye_cascade.detectMultiScale(face_gray)
    for (ex, ey, ew, eh) in eyes:
        # cv2.rectangle(face, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)
        eye = face[ey: ey + eh, ex: ex + ew]
        small = cv2.resize(eye, None, fx=ratio, fy=ratio, interpolation=cv2.INTER_NEAREST)
        face[ey: ey + eh, ex: ex + ew] = cv2.resize(small, (ew, eh), interpolation=cv2.INTER_NEAREST)

cv2.imwrite('data/dst/opencv_eye_detect_mosaic.jpg', src)

処理結果

$ python2 test3.py
[ INFO:0] Initialize OpenCL runtime…

$ ls -al data/dst/
total 512
drwxr-xr-x 4 chen staff 128 6 25 01:45 .
drwxr-xr-x 5 chen staff 160 6 20 00:50 ..
-rw-r–r–@ 1 chen staff 108333 6 25 01:51 opencv_eye_detect_mosaic.jpg
-rw-r–r–@ 1 chen staff 110477 6 25 01:07 opencv_face_detect_rectangle.jpg

ファイル data/dst/opencv_eye_detect_mosaic.jpg が作成されたことが確認した。

参考

OpenCV(2) OpenCV Read image

画像ファイルを読み込み

おなじみのlenaさんの画像を使う

PythonのOpenCVで画像ファイルを読み込みはcv2.imreadを使う。

実行するコードと画像が別の場所にあるとして、
一度image_pathに画像のディレクトリのパスを指定します。
ここでは、”/Users/chen/Downloads/”とする。

動作確認環境は以下の通り
– Python 3.6
– OpenCV 3.2

何はともあれ画像出力

read_and_show.py
import cv2

#画像読み取り
image_path = "lenaさんの画像を格納してるディレクトリのパス" #例えば "/Users/chen/Downloads/"
image = cv2.imread(image_path+"lena.jpg")  #画像読み取り imread(filename)

#画像表示
cv2.imshow("image",image) #画像出力 imshow(window_name, matrix)
cv2.waitKey()             #キー入力待ち waitKey(delay=0)
cv2.destroyAllWindows()   #ウィンドウを消す destroyAllWindows()

無事表示ができました。

問題は、キーを押してもプログラムは終了されない、そのプロセスを殺して、やっと終了できた。

参考:

  • https://note.nkmk.me/python-opencv-imread-imwrite/

OpenCV(1) Install OpenCV by Homebrew

Homebrew導入

もしHomebrew導入されてない場合は、下記のコマンドで導入

/usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)”

ChenLab-Mac-Urania:~ chen$ brew -v
Homebrew 1.5.10

Python, OpenCVの導入

ChenLab-Mac-Urania:~ chen$ python -V
Python 2.7.10

続いて、opencvの導入

ChenLab-Mac-Urania:~ chen$ brew install opencv
Updating Homebrew…

沢山のメッセージが流れ、終わったらしい。

インストールしたものを確認。

ChenLab-Mac-Urania:~ chen$ which python3
/usr/local/bin/python3
ChenLab-Mac-Urania:~ chen$ which python2
/usr/local/bin/python2
ChenLab-Mac-Urania:~ chen$ python3 -V
Python 3.6.5
ChenLab-Mac-Urania:~ chen$ python2 -V
Python 2.7.15
ChenLab-Mac-Urania:~ chen$

これて環境準備OK.