File size: 4,686 Bytes
364ca9d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import os
import cv2
import numpy as np
import mediapipe as mp
from deepface import DeepFace

class DataProcessing:
    def __init__(self):
        self.face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_alt2.xml')
        self.mp_face_mesh = mp.solutions.face_mesh
        self.mp_drawing = mp.solutions.drawing_utils

    def enhance_contrast_histeq(self, image):
        img = image.copy()
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        resized_gray = cv2.resize(gray, (250, 190))
        enhanced_image = cv2.equalizeHist(resized_gray)

        cv2.imwrite("./static/result_upload2.jpg", enhanced_image)
        cv2.imwrite("./static/temporary/result_upload2.jpg", enhanced_image)

        return enhanced_image

    def face_cropping_pred(self, img):
        for i in range(0, 4):
            if os.path.exists(f"./static/result_upload{i}.jpg"):
                os.remove(f"./static/result_upload{i}.jpg")
                print("File terhapus")
            else:
                print("File tidak ditemukan.")

        # img = cv2.imread(filepath)
        cv2.imwrite("./static/result_upload0.jpg", img)
        cv2.imwrite('./static/temporary/result_upload0.jpg', img)
        try:
            DeepFace.extract_faces("./static/result_upload0.jpg")
            offset = 40
            gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
            faces = self.face_cascade.detectMultiScale(gray, 1.1, 5)

            for (x, y, w, h) in faces:
                offset = 80
                y_offset = 20
                y1 = max(0, y - offset + y_offset)
                y2 = min(y + h + offset + y_offset, img.shape[0])
                x1 = max(0, x - offset)
                x2 = min(x + w + offset, img.shape[1])

                # Mengambil area sekitar wajah
                faces = img[y1:y2, x1:x2]

                cv2.imwrite("./static/result_upload1.jpg", faces)
                cv2.imwrite('./static/temporary/result_upload1.jpg', faces)

                return faces
        except:
            print("error")

    def detect_landmark(self, img):
        print("test")
        image1 = img.copy()
        image2 = img.copy()

        with self.mp_face_mesh.FaceMesh(min_detection_confidence=0.1, min_tracking_confidence=0.6) as face_mesh:
            image2 = cv2.cvtColor(image2, cv2.COLOR_BGR2RGB)
            image2.flags.writeable = False
            results = face_mesh.process(image2)
            image2.flags.writeable = True
            image2 = cv2.cvtColor(image2, cv2.COLOR_RGB2BGR)

            if results.multi_face_landmarks:
                for face_landmarks in results.multi_face_landmarks:
                    self.mp_drawing.draw_landmarks(
                        image=image2,
                        landmark_list=face_landmarks,
                        connections=self.mp_face_mesh.FACEMESH_TESSELATION,
                        landmark_drawing_spec=self.mp_drawing.DrawingSpec(color=(0, 0, 0), thickness=0, circle_radius=0),
                        connection_drawing_spec=self.mp_drawing.DrawingSpec(color=(0, 0, 255), thickness=1, circle_radius=0))

            cv2.imwrite('./static/result_upload2.jpg', image2)
            cv2.imwrite('./static/temporary/result_upload2.jpg', image2)

            subtracted_img = np.zeros(image1.shape, np.uint8)

            for i in range(image1.shape[0]):
                for j in range(image1.shape[1]):
                    subtracted_img[i, j] = abs(int(image1[i, j][0]) - int(image2[i, j][0]))

            cv2.imwrite('./static/result_upload3.jpg', subtracted_img)
            cv2.imwrite('./static/temporary/result_upload3.jpg', subtracted_img)

    def annotate_face_mesh(self, image):
        with self.mp_face_mesh.FaceMesh(min_detection_confidence=0.1, min_tracking_confidence=0.6) as face_mesh:
            image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
            image.flags.writeable = False
            results = face_mesh.process(image)
            image.flags.writeable = True
            image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)

            if results.multi_face_landmarks:
                for face_landmarks in results.multi_face_landmarks:
                    self.mp_drawing.draw_landmarks(
                        image=image,
                        landmark_list=face_landmarks,
                        connections=self.mp_face_mesh.FACEMESH_TESSELATION,
                        landmark_drawing_spec=self.mp_drawing.DrawingSpec(color=(0, 0, 0), thickness=0, circle_radius=0),
                        connection_drawing_spec=self.mp_drawing.DrawingSpec(color=(0, 0, 255), thickness=1, circle_radius=0))
            return image