import cv2
import numpy as np
import os
import tempfile
from PyQt5 import QtCore, QtGui, QtWidgets, uic
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import (QApplication, QComboBox, QDialog, QFileDialog,
QLabel, QPushButton, QStackedWidget, QVBoxLayout,
QWidget)
from PyQt5.uic import loadUi
from skimage.util import random_noise
[docs]class Ui_Dialog_7(object):
def __init__(self):
"""
Creation of a temporary image which helps in displaying the given image onto the GUI label.
"""
self.output_image = None
with tempfile.NamedTemporaryFile(suffix=".png") as f:
self.buffer_image_filename = f.name
def __del__(self):
"""
Deletion of the temporary image which helped in displaying the given image onto the GUI label.
"""
if self.output_image is not None:
os.remove(self.buffer_image_filename)
[docs] def setupUi(self, Dialog_7):
"""
setupUI defined for the screen auto-generated by the PyQt5 editor.
"""
self.counter = 0
Dialog_7.setObjectName("Dialog_7")
Dialog_7.resize(1366, 801)
self.Open_Image_Button = QtWidgets.QPushButton(Dialog_7)
self.Open_Image_Button.setGeometry(QtCore.QRect(90, 660, 401, 81))
self.Open_Image_Button.setObjectName("Open_Image_Button")
self.label_3 = QtWidgets.QLabel(Dialog_7)
self.label_3.setGeometry(QtCore.QRect(660, 300, 61, 31))
self.label_3.setStyleSheet("font: 22pt \"MS Shell Dlg 2\";")
self.label_3.setAlignment(QtCore.Qt.AlignCenter)
self.label_3.setObjectName("label_3")
self.label_5 = QtWidgets.QLabel(Dialog_7)
self.label_5.setGeometry(QtCore.QRect(400, 740, 581, 41))
self.label_5.setStyleSheet("color: rgb(255, 0, 0);")
self.label_5.setText("")
self.label_5.setAlignment(QtCore.Qt.AlignCenter)
self.label_5.setObjectName("label_5")
self.scrollArea = QtWidgets.QScrollArea(Dialog_7)
self.scrollArea.setGeometry(QtCore.QRect(80, 40, 571, 561))
self.scrollArea.setWidgetResizable(True)
self.scrollArea.setObjectName("scrollArea")
self.scrollAreaWidgetContents = QtWidgets.QWidget()
self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 569, 559))
self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
self.label = QtWidgets.QLabel(self.scrollAreaWidgetContents)
self.label.setGeometry(QtCore.QRect(10, 20, 571, 561))
self.label.setText("")
self.label.setObjectName("label")
self.scrollArea.setWidget(self.scrollAreaWidgetContents)
self.Save_As = QtWidgets.QPushButton(Dialog_7)
self.Save_As.setGeometry(QtCore.QRect(900, 660, 403, 81))
self.Save_As.setObjectName("Save_As")
self.scrollArea_2 = QtWidgets.QScrollArea(Dialog_7)
self.scrollArea_2.setGeometry(QtCore.QRect(730, 40, 571, 561))
self.scrollArea_2.setWidgetResizable(True)
self.scrollArea_2.setObjectName("scrollArea_2")
self.scrollAreaWidgetContents_2 = QtWidgets.QWidget()
self.scrollAreaWidgetContents_2.setGeometry(QtCore.QRect(0, 0, 569, 559))
self.scrollAreaWidgetContents_2.setObjectName("scrollAreaWidgetContents_2")
self.label_2 = QtWidgets.QLabel(self.scrollAreaWidgetContents_2)
self.label_2.setGeometry(QtCore.QRect(10, 20, 571, 561))
self.label_2.setText("")
self.label_2.setObjectName("label_2")
self.scrollArea_2.setWidget(self.scrollAreaWidgetContents_2)
self.retranslateUi(Dialog_7)
QtCore.QMetaObject.connectSlotsByName(Dialog_7)
[docs] def retranslateUi(self, Dialog_7):
"""
Setting the UI layouts and components - labels, textfields, pushbuttons, etc.
Also adding functionality for redirecting buttons to respective functions on being clicked.
"""
_translate = QtCore.QCoreApplication.translate
Dialog_7.setWindowTitle(_translate("Dialog_7", "Facial Features Detection"))
self.Open_Image_Button.setText(_translate("Dialog_7", "Open Image"))
self.label_3.setText(_translate("Dialog_7", "=>"))
self.Open_Image_Button.setText(_translate("Dialog_7", "Open Image"))
self.Save_As.setText(_translate("Dialog_7", "Save As"))
self.Open_Image_Button.clicked.connect(self.File_Select)
self.Save_As.clicked.connect(self.Save_Directory)
[docs] def File_Select(self):
"""
Main Logical function which does the following:
1. Helps user in choosing input for image file (supported file formats - .jpg, .jpeg, .gif, .png)
2. Error handling if user doesn't choose supported file.
3. Displays the image onto the GUI label layout (if size exceeds, then scroll bars appear in the Label).
4. The user can Save the generated image in the directory they want on the machine.
"""
# Load the classifier
face_cascade1 = cv2.CascadeClassifier("All_Project_Files\Face_Models\haarcascade_frontalface_default.xml")
face_cascade2 = cv2.CascadeClassifier( "All_Project_Files\Face_Models\haarcascade_frontalface_alt.xml")
face_cascade3 = cv2.CascadeClassifier("All_Project_Files\Face_Models\haarcascade_frontalface_alt2.xml")
eye_cascade = cv2.CascadeClassifier("All_Project_Files\Face_Models\haarcascade_eye.xml")
self.label_5.setText("")
# fname = QFileDialog.getOpenFileName(self, "Open File", "All_Project_Files\Final_Project_Files\Cam_Media", "Images (*.png *.xpm *.jpg)")
# # Opening the Image
# self.pixmap = QPixmap(fname[0]) # This returns a tuple and hence we mention [0].
# # Adding the picture to the Label.
# self.label.setPixmap(self.pixmap)
file_name, _ = QFileDialog.getOpenFileName(None, 'Open Image File', r"<Default dir>", "Image files (*.jpg *.jpeg *.gif *.png)")
if file_name:
self.label.setPixmap(QPixmap(file_name))
self.counter += 1
img = cv2.imread(file_name)
m, n, c = img.shape
print("The original size of the image is ", m, " x ", n)
self.output_image = img.copy()
# Convert the image to grayscale
gray = cv2.cvtColor(self.output_image, cv2.COLOR_BGR2GRAY)
# Detect faces; tweak these values as needed
faces1 = face_cascade1.detectMultiScale(gray, 1.1, 7)
faces2 = face_cascade2.detectMultiScale(gray, 1.1, 7)
faces3 = face_cascade3.detectMultiScale(gray, 1.1, 7)
# Decide which set of matches to use; change order as needed
if len(faces1) >= len(faces2): faces = faces1
if len(faces1) >= len(faces3): faces = faces1
if len(faces2) >= len(faces1): faces = faces2
if len(faces2) >= len(faces3): faces = faces2
if len(faces3) >= len(faces1): faces = faces3
if len(faces3) >= len(faces2): faces = faces3
print('Face count: ' + str(len(faces)))
# Iterate over each face
for (x, y, w, h) in faces:
# Draw a rectangle around the face
cv2.rectangle(self.output_image, (x, y), (x+w, y+h), (255, 0, 0), 2)
# Detect eyes
roi_gray = gray[y:y+h, x:x+w]
eyes = eye_cascade.detectMultiScale(roi_gray)
for (ex, ey, ew, eh) in eyes:
# Draw a rectangle around the eyes
cv2.rectangle(self.output_image, (x+ex, y+ey), (x+ex+ew, y+ey+eh), (0, 255, 0), 2)
m, n, c = self.output_image.shape
print("The new size of the image is ", m, " x ", n)
Face_Detected_Image_File_Name = self.buffer_image_filename
cv2.imwrite(Face_Detected_Image_File_Name, self.output_image)
# self.label_2.setPixmap(QPixmap(Face_Detected_Image_File_Name))
lay = QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents)
lay_2 = QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents_2)
lay.setContentsMargins(0, 0, 0, 0)
lay_2.setContentsMargins(0, 0, 0, 0)
lay.addWidget(self.label)
lay_2.addWidget(self.label_2)
self.label_5.setText("")
self.label.setPixmap(QPixmap(file_name))
self.label_2.setPixmap(QPixmap(Face_Detected_Image_File_Name))
# self.scrollArea.setWidgetResizable(True)
# self.scrollArea_2.setWidgetResizable(True)
self.label.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter)
self.label_2.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter)
self.Open_Image_Button.setEnabled(False)
# If you want these to display these in separate windows other than GUI.
# cv2.imshow("Negative Image", negative_img)
# cv2.imshow("Image", img)
# cv2.waitKey(0)
# # closing all open windows
# cv2.destroyAllWindows()
[docs] def Save_Directory(self):
"""
Helps in saving and writing the image in the directory the user wants to save in.
"""
option = QFileDialog.Options()
if self.counter > 0:
save_as_path = QFileDialog.getSaveFileName(None, 'Open Image File', r"Facial Features Detected Image", "Image files (*.jpg *.jpeg *.gif *.png)")
if save_as_path[0].__len__() > 0:
cv2.imwrite(save_as_path[0], self.output_image)
else:
self.label_5.setText("Please select a file first!")
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Dialog_7 = QtWidgets.QDialog()
ui = Ui_Dialog_7()
ui.setupUi(Dialog_7)
Dialog_7.show()
sys.exit(app.exec_())