Skip to content

Instantly share code, notes, and snippets.

@fddcddhdd
Last active December 2, 2015 07:02
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fddcddhdd/8c4693c853c29f20eac6 to your computer and use it in GitHub Desktop.
Save fddcddhdd/8c4693c853c29f20eac6 to your computer and use it in GitHub Desktop.
RaspberryPi + USBカメラ + Paython + OpenCV を使って、顔モザイク処理済のWebフォトアルバムを自動生成するシステム
# -*- coding:utf-8 -*-
# OpenCVの検出器を指定
cascade_list = [
'/usr/share/opencv/haarcascades/haarcascade_frontalface_alt.xml', #正面顔
'/usr/share/opencv/haarcascades/haarcascade_profileface.xml', #横顔
# '/usr/share/opencv/haarcascades/haarcascade_eye.xml', #目
# '/usr/share/opencv/haarcascades/haarcascade_eye_tree_eyeglasses.xml', #眼鏡を掛けた目
# '/usr/share/opencv/haarcascades/haarcascade_frontalface_alt2.xml', #正面顔
# '/usr/share/opencv/haarcascades/haarcascade_frontalface_alt_tree.xml', #正面顔
# '/usr/share/opencv/haarcascades/haarcascade_frontalface_default.xml', #正面顔
# '/usr/share/opencv/haarcascades/haarcascade_fullbody.xml', #全身
# '/usr/share/opencv/haarcascades/haarcascade_lefteye_2splits.xml', #左目
# '/usr/share/opencv/haarcascades/haarcascade_lowerbody.xml', #下半身
# '/usr/share/opencv/haarcascades/haarcascade_mcs_eyepair_big.xml', #目
# '/usr/share/opencv/haarcascades/haarcascade_mcs_eyepair_small.xml', #目
# '/usr/share/opencv/haarcascades/haarcascade_mcs_leftear.xml', #左耳
# '/usr/share/opencv/haarcascades/haarcascade_mcs_lefteye.xml', #左目
# '/usr/share/opencv/haarcascades/haarcascade_mcs_mouth.xml', #口
# '/usr/share/opencv/haarcascades/haarcascade_mcs_nose.xml', #鼻
# '/usr/share/opencv/haarcascades/haarcascade_mcs_rightear.xml', #右耳
# '/usr/share/opencv/haarcascades/haarcascade_mcs_righteye.xml', #右目
# '/usr/share/opencv/haarcascades/haarcascade_mcs_upperbody.xml', #上半身
# '/usr/share/opencv/haarcascades/haarcascade_righteye_2splits.xml', #右目
# '/usr/share/opencv/haarcascades/haarcascade_smile.xml', #笑顔
# '/usr/share/opencv/haarcascades/haarcascade_upperbody.xml' #上半身
]
#ライブラリを読み込む
import cv2
from PIL import Image
import datetime
#カメラから画像データを生成(解像度はカメラハードウェアに依存)
capture = cv2.VideoCapture(0)
capture.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH, 640) #2048
capture.set(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT, 480) #1539
if capture.isOpened() is False:
raise("IO Error")
ret, cv_image = capture.read()
capture.release()
# 日時ファイル名で、とりあえず保存
output_file = datetime.datetime.now().strftime('%Y%m%d%H%M%S') + ".jpg"
cv2.imwrite(output_file, cv_image)
imageOut = Image.open(output_file)
# 処理を軽くするためにグレイスケール変換
image_gray = cv2.cvtColor(cv_image, cv2.COLOR_BGR2GRAY)
# 指定した検出器の数だけループ
for cascade_xml in cascade_list:
# 顔の情報データ
cascade = cv2.CascadeClassifier(cascade_xml)
# ライブラリに顔検出してもらう
facerect = cascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=1, minSize=(1, 1))
# 顔が1つ以上あったら
if len(facerect) > 0:
# 顔検出した部分をモザイク
for rect in facerect:
rect = rect.tolist() # とりあえずnumpyのままだと使い辛いのでリストに変換。
# 顔だけ切り抜いて
face = imageOut.crop((rect[0], rect[1], rect[0]+rect[2], rect[1]+rect[3]))
face = face.resize((rect[2]/40, rect[3]/40)) # 40分の1のサイズに圧縮。
face = face.resize(rect[2:]) # 元に戻せばモザイク画像の完成。
# モザイクかけたものを元の画像に貼り付ける。
imageOut.paste(face, tuple(rect[:2]))
# 修正したJPGファイル
imageOut.save(output_file)
# Webサーバにアップロードする
from ftplib import FTP
ftp = FTP("") #ホスト名
ftp.set_pasv("true")
ftp.login("", "") #ログインIDとパス
fp = open(output_file, "rb") #アップロードするファイル名
upload_path = '/' + output_file[0:10] #ファイル名からフォルダを生成(これだと、時間単位で生成)
try:
ftp.mkd(upload_path)
except:
print 'can not ftp mkdir'
ftp.cwd(upload_path)
ftp.storbinary("STOR "+output_file, fp) #ホスト側のディレクトリ
ftp.close()
fp.close()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment