개발 노트/파이썬 함수 목록

사진 속 인물 찾기 Face Tracking

LeeInGyu 2022. 2. 20. 13:57
import face_recognition
import cv2
from PIL import Image
import numpy as np
import sys

class FaceTrack:
    def __init__(self, char_image_path, target_image_path):
        self.character_image = self.image_load(char_image_path)
        self.target_image = self.image_load(target_image_path)
        self.result_image = self.image_load(target_image_path)
        self.return_image = self.image_load(target_image_path)
        self.compare = None
        self.color_list = [
            [255,0,0],
            [255,128,0],
            [255,255,0],
            [128,255,0],
            [0,255,0],
            [0,0,255],
            [127,0,255],
            [128,128,128]
        ]
    def main_loop(self):
        self.image_encoding_compare()
        self.check_and_draw_face_locations()

    def image_load(self, image_path):
        image = face_recognition.load_image_file(image_path)
        return image

    def image_encoding_compare(self):
        try:
            char_encoding = face_recognition.face_encodings(self.character_image)[0]
            tar_encoding = face_recognition.face_encodings(self.target_image)
            self.compare = face_recognition.compare_faces(char_encoding, tar_encoding)
        except IndexError as e:
            print(f"Can't finding face : {e} ")

    def check_and_draw_face_locations(self):
        face_locations = face_recognition.face_locations(self.target_image)
        index = 0

        for i in self.compare:
            if i:
                self.draw_rect(face_locations[index], index)
            index = index + 1

    def draw_rect(self, face_location, index):
        left, top, right, bottom = face_location

        for i in range(left, right+1):
            for j in range(-1,2):
                self.result_image[i][bottom+j] = self.color_list[index]
                self.result_image[i][top+j] = self.color_list[index]
        for i in range(bottom, top+1):
            for j in range(-1,2):
                self.result_image[left+j][i] = self.color_list[index]
                self.result_image[right+j][i] = self.color_list[index]

    def print_draw_face_locations(self):   
        face_locations = face_recognition.face_locations(self.return_image)
        index = 0

        for left, top, right, bottom in face_locations:
            for i in range(left, right+1):
                for j in range(-1,2):
                    self.return_image[i][bottom+j] = self.color_list[index]
                    self.return_image[i][top+j] = self.color_list[index]
            for i in range(bottom, top+1):
                for j in range(-1,2):
                    self.return_image[left+j][i] = self.color_list[index]
                    self.return_image[right+j][i] = self.color_list[index]

            index = index + 1

        return self.return_image

    def print_char_image(self):
        Image.fromarray(self.character_image)

    def print_tar_image(self):
        Image.fromarray(self.target_image)

    def print_result_image(self):
        Image.fromarray(self.result_image)

    def get_char_image(self):
        return self.character_image

    def get_tar_image(self):
        return self.target_image

    def get_result_image(self):
        return self.result_image
728x90
반응형