diff --git a/.idea/Filteristic.iml b/.idea/Filteristic.iml index d9e6024..fdc701d 100644 --- a/.idea/Filteristic.iml +++ b/.idea/Filteristic.iml @@ -2,7 +2,7 @@ - + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 8d93904..67debe4 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/assest/people_faces.jpg b/assest/people_faces.jpg new file mode 100644 index 0000000..aae71cf Binary files /dev/null and b/assest/people_faces.jpg differ diff --git a/assest/shape_predictor_68_face_landmarks.dat:Zone.Identifier b/assest/shape_predictor_68_face_landmarks.dat:Zone.Identifier new file mode 100644 index 0000000..65f3fa5 --- /dev/null +++ b/assest/shape_predictor_68_face_landmarks.dat:Zone.Identifier @@ -0,0 +1,4 @@ +[ZoneTransfer] +ZoneId=3 +ReferrerUrl=https://github.com/JeffTrain/selfie/blob/master/shape_predictor_68_face_landmarks.dat +HostUrl=https://raw.githubusercontent.com/JeffTrain/selfie/master/shape_predictor_68_face_landmarks.dat diff --git a/filters/__pycache__/dogfilter.cpython-39.pyc b/filters/__pycache__/dogfilter.cpython-39.pyc index 7d42965..f26d396 100644 Binary files a/filters/__pycache__/dogfilter.cpython-39.pyc and b/filters/__pycache__/dogfilter.cpython-39.pyc differ diff --git a/filters/__pycache__/filter1.cpython-39.pyc b/filters/__pycache__/filter1.cpython-39.pyc index 3d23894..ce2cc11 100644 Binary files a/filters/__pycache__/filter1.cpython-39.pyc and b/filters/__pycache__/filter1.cpython-39.pyc differ diff --git a/filters/__pycache__/rainbow.cpython-39.pyc b/filters/__pycache__/rainbow.cpython-39.pyc new file mode 100644 index 0000000..736d17e Binary files /dev/null and b/filters/__pycache__/rainbow.cpython-39.pyc differ diff --git a/filters/rainbow.py b/filters/rainbow.py new file mode 100644 index 0000000..f180e2a --- /dev/null +++ b/filters/rainbow.py @@ -0,0 +1,60 @@ +import cv2 +import numpy as np +import dlib +from math import hypot +path = r"assest\snapchat-filters-png-4068.png" +filter_image = cv2.imread(path) +# Loading Face detector +detector = dlib.get_frontal_face_detector() +predictor_path = r"assest\shape_predictor_68_face_landmarks.dat" +predictor = dlib.shape_predictor(predictor_path) + + +def rainbow_filtering(cap,rows, cols): + filter1 = np.zeros((rows, cols), np.uint8) + _, frame = cap.read() + filter1.fill(0) + gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) + faces = detector(frame) + # if faces: + try: + + for face in faces: + landmarks = predictor(gray_frame, face) + + # filter coordinates + # top_filter = (landmarks.part(27).x, landmarks.part(24).y) + center_filter = (landmarks.part(57).x, landmarks.part(57).y) + left_filter = (landmarks.part(2).x, landmarks.part(2).y) + right_filter = (landmarks.part(14).x, landmarks.part(14).y) + + filter_width = int(hypot(left_filter[0] - right_filter[0], + left_filter[1] - right_filter[1]) * 0.9) + filter_height = int(filter_width * 1.3) + + # New filter position + top_left = (int(center_filter[0] - filter_width / 2), + int(center_filter[1] - filter_height / 2 + 20)) + bottom_right = (int(center_filter[0] + filter_width / 2), + int(center_filter[1] + filter_height / 2)) + + # Adding the new filter + # coloring + filtery = cv2.resize(filter_image, (filter_width, filter_height)) + filtery_gray = cv2.cvtColor(filtery, cv2.COLOR_BGR2GRAY) + _, filter1 = cv2.threshold(filtery_gray, 25, 255, cv2.THRESH_BINARY_INV) + + filter_area = frame[top_left[1]: top_left[1] + filter_height, top_left[0]: top_left[0] + filter_width] + filter_area_no_filter = cv2.bitwise_and(filter_area, filter_area, mask=filter1) + final_filter = cv2.add(filter_area_no_filter, filtery) + + frame[top_left[1]: top_left[1] + filter_height, + top_left[0]: top_left[0] + filter_width] = final_filter + + cv2.imshow("Frame", frame) + except: + _, frame_f = cap.read() + cv2.imshow("Frame", frame_f) + # else: + # _, frame_f = cap.read() + # cv2.imshow("Frame", frame_f) diff --git a/helpers/faces.jpg b/helpers/faces.jpg new file mode 100644 index 0000000..1fbf48d Binary files /dev/null and b/helpers/faces.jpg differ diff --git a/helpers/faces.jpg:Zone.Identifier b/helpers/faces.jpg:Zone.Identifier new file mode 100644 index 0000000..1f94afa --- /dev/null +++ b/helpers/faces.jpg:Zone.Identifier @@ -0,0 +1,4 @@ +[ZoneTransfer] +ZoneId=3 +ReferrerUrl=https://www.google.jo/ +HostUrl=https://thumbs.dreamstime.com/z/set-people-faces-smiling-face-collection-group-79112820.jpg diff --git a/helpers/faces2.jpg b/helpers/faces2.jpg new file mode 100644 index 0000000..c33fb78 Binary files /dev/null and b/helpers/faces2.jpg differ diff --git a/helpers/faces2.jpg:Zone.Identifier b/helpers/faces2.jpg:Zone.Identifier new file mode 100644 index 0000000..73296cd --- /dev/null +++ b/helpers/faces2.jpg:Zone.Identifier @@ -0,0 +1,4 @@ +[ZoneTransfer] +ZoneId=3 +ReferrerUrl=https://www.google.jo/ +HostUrl=https://image.shutterstock.com/shutterstock/photos/498141919/display_1500/stock-photo-set-of-people-faces-498141919.jpg diff --git a/helpers/faces2.png:Zone.Identifier b/helpers/faces2.png:Zone.Identifier new file mode 100644 index 0000000..8041cbb --- /dev/null +++ b/helpers/faces2.png:Zone.Identifier @@ -0,0 +1,3 @@ +[ZoneTransfer] +LastWriterPackageFamilyName=Microsoft.ScreenSketch_8wekyb3d8bbwe +ZoneId=3 diff --git a/helpers/import_image.py b/helpers/import_image.py new file mode 100644 index 0000000..822906b --- /dev/null +++ b/helpers/import_image.py @@ -0,0 +1,53 @@ +import cv2 +import dlib +from math import hypot + +path = r"snapchat-filters-png-4068.png" +filter_image = cv2.imread(path) +# Loading Face detector +detector = dlib.get_frontal_face_detector() +predictor_path = r"shape_predictor_68_face_landmarks.dat" +predictor = dlib.shape_predictor(predictor_path) +image = cv2.imread('faces2.jpg') +gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) +faces = detector(image) + +for face in faces: + landmarks = predictor(gray, face) + + # filter coordinates + # top_filter = (landmarks.part(27).x, landmarks.part(24).y) + center_filter = (landmarks.part(57).x, landmarks.part(57).y) + left_filter = (landmarks.part(2).x, landmarks.part(2).y) + right_filter = (landmarks.part(14).x, landmarks.part(14).y) + + filter_width = int(hypot(left_filter[0] - right_filter[0], + left_filter[1] - right_filter[1]) * 0.9) + filter_height = int(filter_width * 1.3) + + # New filter position + top_left = (int(center_filter[0] - filter_width / 2), + int(center_filter[1] - filter_height / 2 + 25)) + bottom_right = (int(center_filter[0] + filter_width / 2), + int(center_filter[1] + filter_height / 2)) + + # Adding the new filter + # coloring + filtery = cv2.resize(filter_image, (filter_width, filter_height)) + filtery_gray = cv2.cvtColor(filtery, cv2.COLOR_BGR2GRAY) + _, filter1 = cv2.threshold(filtery_gray, 25, 255, cv2.THRESH_BINARY_INV) + + filter_area = image[top_left[1]: top_left[1] + filter_height, top_left[0]: top_left[0] + filter_width] + filter_area_no_filter = cv2.bitwise_and(filter_area, filter_area, mask=filter1) + final_filter = cv2.add(filter_area_no_filter, filtery) + + image[top_left[1]: top_left[1] + filter_height, + top_left[0]: top_left[0] + filter_width] = final_filter + +cv2.imshow("Frame", image) +cv2.waitKey(0) + + + + + diff --git a/helpers/one_face.jpg b/helpers/one_face.jpg new file mode 100644 index 0000000..98903ab Binary files /dev/null and b/helpers/one_face.jpg differ diff --git a/helpers/people_faces.jpg:Zone.Identifier b/helpers/people_faces.jpg:Zone.Identifier new file mode 100644 index 0000000..9f6c585 --- /dev/null +++ b/helpers/people_faces.jpg:Zone.Identifier @@ -0,0 +1,4 @@ +[ZoneTransfer] +ZoneId=3 +ReferrerUrl=https://www.google.jo/ +HostUrl=https://i.pinimg.com/originals/97/e4/2a/97e42a82fc7911961d3ca55f54d1372c.jpg diff --git a/helpers/pngfind.com-pilgrim-hat-png-41504.png b/helpers/pngfind.com-pilgrim-hat-png-41504.png new file mode 100644 index 0000000..040e657 Binary files /dev/null and b/helpers/pngfind.com-pilgrim-hat-png-41504.png differ diff --git a/helpers/pngfind.com-pilgrim-hat-png-41504.png:Zone.Identifier b/helpers/pngfind.com-pilgrim-hat-png-41504.png:Zone.Identifier new file mode 100644 index 0000000..e0353ac --- /dev/null +++ b/helpers/pngfind.com-pilgrim-hat-png-41504.png:Zone.Identifier @@ -0,0 +1,4 @@ +[ZoneTransfer] +ZoneId=3 +ReferrerUrl=https://www.pngfind.com/download/hmboo_black-pilgrim-hat-picture-clip-art-pilgrim-hat/ +HostUrl=https://www.pngfind.com/pngs/b/4-41504_pilgrim-hat-png.png diff --git a/helpers/shape_predictor_68_face_landmarks.dat b/helpers/shape_predictor_68_face_landmarks.dat new file mode 100644 index 0000000..e0ec20d Binary files /dev/null and b/helpers/shape_predictor_68_face_landmarks.dat differ diff --git a/helpers/snapchat-filters-png-4068.png b/helpers/snapchat-filters-png-4068.png new file mode 100644 index 0000000..70eca2e Binary files /dev/null and b/helpers/snapchat-filters-png-4068.png differ diff --git a/main.py b/main.py index 8abb01a..345238a 100644 --- a/main.py +++ b/main.py @@ -1,8 +1,9 @@ import cv2 import numpy as np import dlib -from filters.filter1 import filtering -from filters.dogfilter import filteringdog +# from filters.filter1 import filtering +# from filters.dogfilter import filteringdog +from filters.rainbow import rainbow_filtering # Loading Camera and Nose image and Creating mask cap = cv2.VideoCapture(0) _, frame = cap.read() @@ -10,7 +11,7 @@ rows, cols, _ = frame.shape filter1 = np.zeros((rows, cols), np.uint8) while True: - filteringdog(cap,rows, cols) + rainbow_filtering(cap,rows, cols) key = cv2.waitKey(1) if key == 27: break \ No newline at end of file