LoginSignup
23
26

More than 5 years have passed since last update.

Raspberry PiにOpenCVを入れて、顔検出した結果の画像を簡単に集める方法 with Python

Last updated at Posted at 2016-09-29

はじめに

機械学習に必要な人の顔の画像を集めようと思ったら結構大変だったので、ちょっと作業負荷を軽減させるためにスクリプトを作ってみました。

OpenCVのインストール

以下のコマンドでインストールします。
ちなみに、Python2.7用です。

$ sudo apt install libopencv-dev python-opencv

機能

集合写真の画像URLを指定すると、インターネット上から画像をダウンロードして顔検出し、検出結果の画像を保存するというものです。

ライブラリの読込

使用するライブラリを読み込みます。

import cv2
import sys
from PIL import Image
import urllib
import os

画像用フォルダの作成

検出用、結果用の画像それぞれを保存するフォルダを作成します。

if os.path.exists("input") == False:
    os.mkdir("input")

if os.path.exists("output") == False:
    os.mkdir("output")

画像データのダウンロード

指定したURLからinputフォルダに画像を保存します。
また、URLから画像ファイルの名前を取得します。
※ 例では「photo.jpg」

url = "http://hoge.com/photo.jpg"

# ファイル名の取得
tmp = url.split("/")
imgname = tmp[len(tmp)-1]
imgpath = "input/" + imgname

# 画像データのダウンロード
response = urllib.urlopen(url)

with open(imgpath, "wb") as fout:
    fout.write(response.read())

画像データの加工

フルカラーだと処理に時間がかかるので、グレースケールに変換します。

# 画像データ読込
image = cv2.imread(imgpath)
# グレースケール変換
image_gray = cv2.cvtColor(image, cv2.cv.CV_BGR2GRAY)

顔の検出処理

顔を検出するための学習済データを読み込み、検出します。

# HAAR分類器の指定
cascade_path = "haarcascades/haarcascade_frontalface_alt.xml"

# カスケード分類器の特徴量を取得する
cascade = cv2.CascadeClassifier(cascade_path)

# 検出処理
faces = cascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=1, minSize=(1, 1))

print "検出結果",len(faces),"人"

検出結果から顔の画像を切り取り保存

グレースケールに変換する前の画像データから顔の画像を切り取り、保存します。
この時、機械学習で使いやすいように画像サイズを50x50にリサイズしておきます。

img = Image.open(imgpath)

for i in range(len(faces)):
    [x,y,w,h] = faces[i]
    imgCroped = img.crop((x,y,x+w,y+h)).resize((50, 50))
    filename = "output/%s_%02d.jpg" % (imgname.split(".")[0], i)
    imgCroped.save(filename)

できた!!
いくつか顔以外のものも検出されますが、概ね満足(^-^)

おわりに

Google先生に「集合写真」でお伺いをすると大量に高解像度の写真が出てきますね。
ちょっと驚きました。

23
26
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
26