Last active
December 2, 2015 07:02
-
-
Save fddcddhdd/8c4693c853c29f20eac6 to your computer and use it in GitHub Desktop.
RaspberryPi + USBカメラ + Paython + OpenCV を使って、顔モザイク処理済のWebフォトアルバムを自動生成するシステム
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- 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