-
Notifications
You must be signed in to change notification settings - Fork 8
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fixed minor bugs in PyFry.py, Added basic gui made with tkinter #15
base: master
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,6 @@ | ||
import cv2 | ||
from PIL import Image, ImageOps, ImageEnhance | ||
from PIL import ImageTk | ||
import os | ||
from utils.utils import Colors | ||
from imutils import face_utils | ||
|
@@ -12,54 +13,58 @@ | |
-> Detecting eye coordinates and applying the deepfry eye flare in the center::DONE | ||
|
||
''' | ||
def userInput(): | ||
#Allowing user to choose the image that has to be deepfried | ||
root = tk.Tk() | ||
root.withdraw() | ||
global filepath | ||
filepath = list(root.tk.splitlist(filedialog.askopenfilenames(title="PyFry - Choose Image"))) | ||
print("picture location = ",filepath) | ||
|
||
# def userInput(): | ||
# #Allowing user to choose the image that has to be deepfried | ||
# root = tk.Tk() | ||
# root.withdraw() | ||
# global filepath | ||
# filepath = list(root.tk.splitlist(filedialog.askopenfilenames(title="PyFry - Choose Image"))) | ||
# print("picture location = ",filepath) | ||
|
||
|
||
def irisCoords(eye): | ||
#Finding the center point of the eye using the average outer extremes average of the eyes | ||
mid = (eye[0] +eye[3])/2 | ||
# Finding the center point of the eye using the average outer extremes average of the eyes | ||
mid = (eye[0] + eye[3])/2 | ||
mid = (int(mid[0]), int(mid[1])) | ||
return mid | ||
|
||
|
||
def generateHue(img): | ||
#Generating and increasing prominency of red band of the image | ||
# Generating and increasing prominency of red band of the image | ||
img = img.convert('RGB') | ||
red = img.split()[0] #(R,G,B) | ||
red = img.split()[0] # (R,G,B) | ||
red = ImageEnhance.Contrast(red).enhance(2.0) | ||
red = ImageEnhance.Brightness(red).enhance(1.5) | ||
red = ImageOps.colorize(red, Colors.RED, Colors.YELLOW) | ||
img = Image.blend(img, red, 0.77) | ||
#Keeping a 100% sharpness value for now, But would probably be better with a higher sharpness value | ||
# Keeping a 100% sharpness value for now, But would probably be better with a higher sharpness value | ||
img = ImageEnhance.Sharpness(img).enhance(150) | ||
return img | ||
|
||
|
||
def crushAndBack(img): | ||
img = img.convert('RGB') | ||
w,h = img.width, img.height | ||
w, h = img.width, img.height | ||
img = img.resize((int(w ** .95), int(h ** .95)), resample=Image.LANCZOS) | ||
img = img.resize((int(w ** .90), int(h ** .90)), resample = Image.BILINEAR) | ||
img = img.resize((int(w ** .90), int(h ** .90)), resample = Image.BICUBIC) | ||
img = img.resize((w,h), resample = Image.BICUBIC) | ||
img = img.resize((int(w ** .90), int(h ** .90)), resample=Image.BILINEAR) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I can see you have made a lot of spaces and changes to already working code, Not that it does any harm. I would suggest not to touch the working part of code unless raised in open source projects 😄 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. yeah,got it. |
||
img = img.resize((int(w ** .90), int(h ** .90)), resample=Image.BICUBIC) | ||
img = img.resize((w, h), resample=Image.BICUBIC) | ||
return img | ||
|
||
|
||
def addFlare(img): | ||
''' Initialising dlib for frontal facial features ''' | ||
flare = Image.open('flare.png') | ||
detect = dlib.get_frontal_face_detector() | ||
predict = dlib.shape_predictor("assets\shape_predictor_68_face_landmarks.dat") | ||
face_landmarks_file = "assets/shape_predictor_68_face_landmarks.dat" | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Maybe you can add a dynamic addition of the face_landmarks_file from the GUI, That'll be clean 👍 |
||
face_landmarks_file = os.path.abspath(face_landmarks_file) | ||
predict = dlib.shape_predictor(face_landmarks_file) | ||
|
||
(lS, lE) = face_utils.FACIAL_LANDMARKS_68_IDXS["left_eye"] | ||
(rS, rE) = face_utils.FACIAL_LANDMARKS_68_IDXS["right_eye"] | ||
|
||
|
||
imgCV = cv2.imread('test.jpg') | ||
#imgCV = cv2.imread('test2.jpg') | ||
|
||
imgCV = cv2.imread('temp.jpg') | ||
# imgCV = cv2.imread('test2.jpg') | ||
|
||
gray = cv2.cvtColor(imgCV, cv2.COLOR_BGR2GRAY) | ||
subjects = detect(gray, 0) | ||
|
@@ -75,50 +80,108 @@ def addFlare(img): | |
This is used to find the basic coordinates of the area in which the flare image will be pasted | ||
''' | ||
|
||
rn=(rightEye[4][0]-rightEye[0][0])*3 | ||
ln=(leftEye[4][0]-leftEye[0][0])*3 | ||
rn = (rightEye[4][0]-rightEye[0][0])*3 | ||
ln = (leftEye[4][0]-leftEye[0][0])*3 | ||
|
||
rec0=(leftEye[1][0]-ln,leftEye[1][1]-ln) | ||
rec1=(leftEye[4][0]+ln,leftEye[4][1]+ln) | ||
rec2=(rightEye[1][0]-rn,rightEye[1][1]-rn) | ||
rec3=(rightEye[4][0]+rn,rightEye[4][1]+rn) | ||
print("Area for left eye",rec0,rec1) | ||
print("Area for right eye",rec2,rec3) | ||
rec0 = (leftEye[1][0]-ln, leftEye[1][1]-ln) | ||
rec1 = (leftEye[4][0]+ln, leftEye[4][1]+ln) | ||
|
||
rec2 = (rightEye[1][0]-rn, rightEye[1][1]-rn) | ||
rec3 = (rightEye[4][0]+rn, rightEye[4][1]+rn) | ||
|
||
print("Area for left eye", rec0, rec1) | ||
print("Area for right eye", rec2, rec3) | ||
|
||
""" Area Assignment for left eye and right eye""" | ||
areaLeft=(rec0[0],rec0[1],rec1[0],rec1[1]) | ||
areaRight=(rec2[0],rec2[1],rec3[0],rec3[1]) | ||
areaLeft = (rec0[0], rec0[1], rec1[0], rec1[1]) | ||
areaRight = (rec2[0], rec2[1], rec3[0], rec3[1]) | ||
|
||
""" Resizing the flare image to fit the area""" | ||
flareLeft=flare.resize((rec1[0]-rec0[0],rec1[1]-rec0[1])) | ||
flareRight=flare.resize((rec3[0]-rec2[0],rec3[1]-rec2[1])) | ||
flareLeft = flare.resize((rec1[0]-rec0[0], rec1[1]-rec0[1])) | ||
flareRight = flare.resize((rec3[0]-rec2[0], rec3[1]-rec2[1])) | ||
|
||
"""Pasting the flare image on the area. | ||
Third parameter is an alpha channel that provides transparency for the png""" | ||
img.paste(flareLeft,areaLeft,flareLeft) | ||
img.paste(flareRight,areaRight,flareRight) | ||
img.paste(flareLeft, areaLeft, flareLeft) | ||
img.paste(flareRight, areaRight, flareRight) | ||
return img | ||
|
||
|
||
def main(): | ||
userInput() | ||
|
||
for img_path in filepath: | ||
def pyfry(): | ||
# grab a reference to the image panels | ||
global panelA, panelB | ||
# open a file chooser dialog and allow the user to select an input | ||
# image | ||
img_path = filedialog.askopenfilename() | ||
print(img_path) | ||
|
||
# ensure a file path was selected | ||
if len(img_path) > 0: | ||
img = Image.open(img_path) | ||
#img = Image.opne('test2.jpg') | ||
img = img.convert('RGB') | ||
img = crushAndBack(img) | ||
img = generateHue(img) | ||
img.save('temp.jpg') | ||
img = addFlare(img) | ||
img.show() | ||
#img.save('output2.jpg') | ||
|
||
# img.show() | ||
# img.save('output2.jpg') | ||
filename = os.path.splitext(os.path.basename(img_path))[0] | ||
img.save('%s_output.jpg' % filename) | ||
print("output saved as %s_output.jpg" % filename) | ||
|
||
|
||
if __name__ == '__main__': | ||
main() | ||
original_image = cv2.imread(img_path) | ||
deep_fried_img_path = '%s_output.jpg' % filename | ||
deep_fried_img = cv2.imread(deep_fried_img_path) | ||
# OpenCV represents images in BGR order; however PIL represents | ||
# images in RGB order, so we need to swap the channels | ||
original_image = cv2.cvtColor(original_image, cv2.COLOR_BGR2RGB) | ||
deep_fried_img = cv2.cvtColor(deep_fried_img, cv2.COLOR_BGR2RGB) | ||
|
||
# convert the images to PIL format... | ||
original_image = Image.fromarray(original_image) | ||
deep_fried_img = Image.fromarray(deep_fried_img) | ||
|
||
# ...and then to ImageTk format | ||
original_image = ImageTk.PhotoImage(original_image) | ||
deep_fried_img = ImageTk.PhotoImage(deep_fried_img) | ||
|
||
# if the panels are None, initialize them | ||
if panelA is None or panelB is None: | ||
# the first panel will store our original image | ||
panelA = tk.Label(image=original_image) | ||
panelA.image = original_image | ||
panelA.pack(side="left", padx=10, pady=10) | ||
|
||
# while the second panel will store the edge map | ||
panelB = tk.Label(image=deep_fried_img) | ||
panelB.image = deep_fried_img | ||
panelB.pack(side="right", padx=10, pady=10) | ||
|
||
# otherwise, update the image panels | ||
else: | ||
# update the pannels | ||
panelA.configure(image=original_image) | ||
panelB.configure(image=deep_fried_img) | ||
panelA.image = original_image | ||
panelB.image = deep_fried_img | ||
|
||
|
||
# userInput() | ||
# initialize the window toolkit along with the two image panels | ||
root = tk.Tk() | ||
root.title("Welcome to PyFry") | ||
|
||
# root.geometry("600x100") | ||
panelA = None | ||
panelB = None | ||
|
||
# create a button, then when pressed, will trigger a file chooser | ||
# dialog and allow the user to select an input image; then add the | ||
# button the GUI | ||
btn = tk.Button(root, text="click here to select new image to deep fry!!!", command=pyfry) | ||
btn.pack(side="bottom", fill="both", expand="yes", padx="10", pady="10") | ||
|
||
# kick off the GUI | ||
root.mainloop() | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Don't make aesthetic changes to the working code. It creates more diffs and takes extra time to review.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
hi ionicc, Actually While adding my changes somewhere I got indentation error.
I tried to fix it but couldn't, then copy-pasted whole content in sublime-text and fixed indentation and put that back.
So,these kind of changes came in. 😃 😄
I didn't check that much while commiting.
Will take care of these changes and raise a new PR.