見出し画像

Python3+OpenCV(顔と瞳の検出)

作成した画像処理環境を使って顔と瞳の検出を行いたいと思います
画像処理といっても基本はOpenCVの関数を並べるだけなので楽ちんですね
有難い限りです。

1.処理概要

画像1

2.コーディング

#! /usr/local/bin/python3

#------------------------------------------------------------
#-- import
#------------------------------------------------------------
import cv2


#------------------------------------------------------------
#-- global変数
#------------------------------------------------------------
#-- 解像度設定
gWIDTH      = 640
gHEIGHT     = 480

#-- 検出最小幅
gMINSIZE_F  = (130, 130)
gMINSIZE_E  = ( 70,  70)

#-- 文字表示設定
gTEXT       = "GOMAME COFFEE"
gCOLOR      = (  0,   0, 255)   #-- BGR
gOFFSET     = (10, 50)
gFONTSCALE  = 1
gTHICKNESS  = 3

#-- カメラ設定(video0)
gCap = cv2.VideoCapture(0)

#-- CASCADE設定
gCASCADE_PATH_FACE = '/usr/local/share/opencv4/haarcascades/haarcascade_frontalface_default.xml'
gCASCADE_PATH_EYE  = '/usr/local/share/opencv4/haarcascades/haarcascade_eye.xml'

gCASCADE_FACE = cv2.CascadeClassifier(gCASCADE_PATH_FACE)
gCASCADE_EYE  = cv2.CascadeClassifier(gCASCADE_PATH_EYE)


#------------------------------------------------------------
#-- Main
#------------------------------------------------------------
def main():
 #-- 広告
 sGomameCoffee()

 #-- カメラ設定
 sCamSet()

 while True:
     #-- 撮影
     ret, src = gCap.read()
     if(not ret):
         print("Error::ret is false")
         break

     #-- 顔と瞳の検出しモザイク処理を行う
     dst = sDetectFaceEye(src)

     #-- 画像に文字を入れる
     dst = sPutText(dst)

     #-- ディスプレイに画像を表示
     cv2.imshow("Picamera", dst)

     #-- 無限ループ脱出(Escキーで終了)
     key = cv2.waitKey(1)
     if(key == 27):
         break

 #-- クロージング
 sClose()


#------------------------------------------------------------
#-- カメラ設定
#------------------------------------------------------------
def sCamSet():
  gCap.set(cv2.CAP_PROP_FRAME_WIDTH,  gWIDTH)
  gCap.set(cv2.CAP_PROP_FRAME_HEIGHT, gHEIGHT)


#------------------------------------------------------------
#-- OpenCV終了処理
#------------------------------------------------------------
def sClose():
  gCap.release()
  cv2.destroyAllWindows()


#------------------------------------------------------------
#-- gomame coffee
#------------------------------------------------------------
def sGomameCoffee():
  print("----------------------------------------")
  print("-- GOMAME COFFEE")
  print("-- Nara city roasted beans shop")
  print("-- https://gomamecoffee.stores.jp/")
  print("----------------------------------------")


#------------------------------------------------------------
#-- putText
#------------------------------------------------------------
def sPutText(aSrc):
  dst = cv2.putText(aSrc, gTEXT, gOFFSET, cv2.FONT_HERSHEY_SIMPLEX, gFONTSCALE, gCOLOR, gTHICKNESS, cv2.LINE_AA)
  return dst


#------------------------------------------------------------
#-- detctFaceEye
#------------------------------------------------------------
def sDetectFaceEye(aSrc):
  #-- 元の画像を変更しない
  dst = aSrc

  #-- カラー画像をグレー画像に変換
  imgGray = cv2.cvtColor(aSrc, cv2.COLOR_BGR2GRAY)

  #-- 顔検出
  faces = gCASCADE_FACE.detectMultiScale(imgGray, minSize=gMINSIZE_F)

  #-- 検出した顔に処理を施す
  if( 0 < len(faces)):
      for x, y, w, h in faces:
          #-- 顔領域を切り出す
          face = dst[y:y+h, x:x+w]

          #-- 瞳検出
          eyes = gCASCADE_EYE.detectMultiScale(face, minSize=gMINSIZE_E)

          #-- 顔のモザイク処理
          cutSize = face.shape[:2][::-1]
          moza = cv2.resize(face, (cutSize[0]//20,  cutSize[0]//20))
          moza = cv2.resize(moza, cutSize,  interpolation = cv2.INTER_NEAREST)

          #-- モザイク画像に瞳の矩形表示
          for (ex, ey, ew, eh) in eyes:
              cv2.rectangle(moza, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)

          #--  モザイク画像を元の画像にはめ込む
          dst[y:y+h, x:x+w] = moza

          #-- モザイク画像に顔の矩形表示
          cv2.rectangle(dst, (x, y), (x + w, y + h), (255, 0, 0), 2)


  return dst


#------------------------------------------------------------
#--プログラム実行
#------------------------------------------------------------
if __name__ == '__main__':
  main()


#-- EOF -----------------------------------------------------

3.プログラムファイル

4.実行方法

$ ./gomamecoffeeFaceEye.py

5.処理結果

画像2

6.まとめ

cv2.resizeの引数で少しハマりました
整数を渡さないといけないのに浮動小数点になっていました
変数の型は意識しないとダメですね

※a // b # 切り捨て除算が便利でした
 10 /  3 = 3.33333...
 10 // 3 = 3

7.謝辞

今回お世話になったサイトです。
これらのサイトが無ければ露頭に迷っていたかもしれません。
改めてお礼を申し上げます。
#-- 顔・瞳検出
https://note.nkmk.me/python-opencv-face-detection-haar-cascade/
https://qiita.com/FukuharaYohei/items/116932920c99a5b73b32

#-- モザイク処理
https://tat-pytone.hatenablog.com/entry/2019/03/29/194641
https://rabbitfoot141.hatenablog.com/entry/2016/02/19/022723

#-- 切捨て除算
https://teratail.com/questions/179033