OpenCV에서 얼굴 인식 · 잘라내기

소개



이미지 안의 얼굴을 인식시켜 사각형의 테두리로 둘러싸는 코드를 개조해, 파일로서 잘라내는 코드를 작성해 보았습니다.

라이브러리 가져오기



OpenCV, Pillow 등의 라이브러리를 가져옵니다.
import os
import subprocess
from PIL import Image
import cv2 as cv

dir0 = 'org' 
dir1 = 'png'
dir2 = 'png_resize'
dir3 = 'face'

이미지 준비



원본 이미지(jpg, 크기 500×334px)를 org 폴더에 놓습니다. 이것을 png 파일로 변환하고 크기 너비를 600px로 조정한 다음 png_resize 폴더에 저장합니다.
files0 = os.listdir(dir0)
files0.sort()

for file in files0:

    if '.jpg'  in file:        
        command = 'sips --setProperty format png ' + dir0 +'/' + file +  ' --out ' + dir1 +'/' +  file.replace('.jpg','.png') 
        subprocess.call(command, shell=True)
        print(file) 

files1 = os.listdir(dir1)
files1.sort()

# aaa.jpg  

for file in files1:   
    if '.png' in file:   
        img0 = os.path.join(dir1, file)
        img0_img = Image.open(img0)
        h = img0_img.height
        w = img0_img.width
        img1_img = img0_img.resize((600,round(600*h/w)))
        img1 = os.path.join(dir2, file) 
        img1_img.save(img1)
        print(file) 

# aaa.png

files2 = os.listdir(dir2)
files2.sort()    



얼굴 식별기 설치



얼굴 식별자는 여기에 공개되어 있습니다.
face_cascade = cv.CascadeClassifier('haarcascade_frontalface_default.xml')
#face_cascade = cv.CascadeClassifier('haarcascade_profileface.xml')

얼굴 식별자 실행, 얼굴 이미지 잘라내기



얼굴 이미지를 잘라냅니다. 잘라내기 범위를 검출 범위보다 상하 좌우 10px 넓게하고 있습니다.
for file in files2:
    if '.png' in file:
        dirfile = os.path.join(dir2, file) 
        img = cv.imread(dirfile)
        gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

        faces = face_cascade.detectMultiScale(gray, 1.3, 5)

        for (x,y,w,h) in faces:
            face = img[y-10:y+h+10, x-10:x+w+10]
            face_name = str(file.strip('.png'))+'_'+str(x)+'_'+str(y)+'.png'
            dirface = os.path.join(dir3,face_name)
            facefile = cv.imwrite(dirface, face) 
            #cv.rectangle(img,(x-10,y-10),(x+w+10,y+h+10),(255,0,0),2)
            print(face_name)  

# aaa_152_22.png
# aaa_11_70.png
# aaa_438_41.png
# aaa_79_106.png
# aaa_385_140.png
# aaa_190_175.png
# aaa_269_171.png
# aaa_76_206.png
# aaa_527_257.png
# aaa_91_277.png
# aaa_254_330.png
# aaa_446_348.png  

위 이미지에서 총 12장의 얼굴 이미지가 잘립니다. 얼굴의 대부분이 찍혀 있으면 잘라내기에 성공하고 있는 것을 알 수 있습니다.




끝에



집합 사진으로부터 사진 첨부로 명부를 만드는 경우등으로 사용할 수 있을 것 같습니다. 훈련 된 식별자가 캐스케이드 파일로 공개되면 누구나 사용할 수있어 편리합니다.

참고



htps : // / cs. 오펜 cv. rg/4.1.0/d7/d8b/단순히 l_py_휴식_에서 c치온. HTML
htps : // 기주 b. 코 m / 오렌지 cv / 오페인 cv / t 레에 / 마 s r / data /

좋은 웹페이지 즐겨찾기