def launchSearch(self, name, email): result = searchFullContact(email) photoUrls = [photo.get('url', '') for photo in getList(result, 'photos')] thumbnails, _, profile = searchPipl(email) if 'mainPicture' in profile: photoUrls.append(profile.get('mainPicture')) # self.webPicturesIterator = WebPicturesIterator(photoUrls) self.webPicturesIterator = WebPicturesIterator([]) # self.socialNetworkIterator = SocialNetworkIterator(getList(result, 'socialProfiles')) self.socialNetworkIterator = SocialNetworkIterator([]) self.rotateWebData() twitterThumbs = [t for t in thumbnails if t[2] is not None and 'twitter.com' in t[2]] others = [t for t in thumbnails if t[2] is not None and 'twitter.com' not in t[2]] self.thumbnailsCarrousel.start(twitterThumbs[:2] + others)
class FaceIDApp(): def __init__(self, rootWindow, args): self.rootWindow = rootWindow height = int(self.rootWindow.winfo_screenheight() * 0.9) width = int(self.rootWindow.winfo_screenwidth() * 0.85) self.top = 0 self.left = self.rootWindow.winfo_screenwidth() - width - 10 self.rootWindow.title('Face Identification App') self.rootWindow.geometry('{0}x{1}+{2}+{3}'.format(width, height, self.left, self.top)) self.rootWindow.protocol("WM_DELETE_WINDOW", self.on_closing) self.haarFolder = args.haarFolder self.outputWidth = args.outputWidth self.facesFolder = ['/home/juan/ciberpunks/faces/candidatos'] self.fontFamily = 'System' self.mainFrame = self.buildMainFrame() contentFrame = tk.Frame(self.mainFrame, bg='black', bd=0) self.leftFrame = self.buildLeftFrame(contentFrame) self.rightFrame = self.buildRightFrame(contentFrame) contentFrame.pack(side=tk.TOP) self.thumbnailsCarrousel = ThumbnailsCarrouselFrame(self.mainFrame, 8) self.thumbnailsCarrousel.pack(side=tk.BOTTOM, pady=100) self.alertPopup = None self.loadFaces() self.showCollectedFaces() logging.debug('Creating new subject handler...') self.newSubjectHandler = NewSubjectDetectedEventHandler(self.haarFolder, self.outputWidth) self.subjectsQueue = Queue.Queue() handler = FileCreatedEventHandler(self.subjectsQueue) logging.debug('Creating observer for watchdog...') self.observer = Observer() self.observer.schedule(handler, args.newSubjectsFolder) self.observer.start() self.checkPendingWork() def loadFaces(self): logging.debug('Loading faces from disk...') [self.faces, _, _] = readSubjectsImages(self.facesFolder) logging.debug('Faces loaded.') def buildMainFrame(self): f = tk.Frame(self.rootWindow) im = Image.open('resources/background00.jpg') self.bgImage = ImageTk.PhotoImage(im) bgImageLabel = tk.Label(f, image=self.bgImage, bd=0) bgImageLabel.place(x=0, y=0) f.pack(fill=tk.BOTH, expand=tk.YES) return f def buildLeftFrame(self, container): f = tk.Frame(container) f.configure(background="black", padx=5, pady=5) rowCount = 0 self.subjectPictureLabel = tk.Label(f, bd=0) self.subjectPictureLabel.grid(row=rowCount, column=0) rowCount += 1 labelFont = tkFont.Font(family=self.fontFamily, size=26) self.subjectNameLabel = tk.Label(f) self.subjectNameLabel.configure(font=labelFont, bg='black', fg='white') self.subjectNameLabel.grid(row=rowCount, column=0) rowCount += 1 self.buildSubjectDataFrame(f, rowCount) rowCount += 1 f.pack(side=tk.LEFT) return f def buildRightFrame(self, container): f = tk.Frame(container) f.configure(background="black", padx=5, pady=5) self.listFacesLabel = tk.Label(f) self.listFacesLabel.config(borderwidth=0) self.listFacesLabel.pack(side=tk.TOP) # self.webPictureLabel = tk.Label(f, height=200, width=200, bd=0, bg='black') # self.webPictureLabel.pack(side=tk.BOTTOM) f.pack(side=tk.RIGHT) return f def buildSubjectDataFrame(self, container, rowCount): self.subjectDataFrame = tk.Frame(container) self.snType = self.addSubjectField(self.subjectDataFrame, 'Social network:', '', 0) self.snUsername = self.addSubjectField(self.subjectDataFrame, 'Username:'******'', 1) self.snFollowers = self.addSubjectField(self.subjectDataFrame, 'Followers:', '', 2) self.snFollowing = self.addSubjectField(self.subjectDataFrame, 'Following:', '', 3) self.snURL = self.addSubjectField(self.subjectDataFrame, 'URL:', '', 4) self.snBio = self.addSubjectField(self.subjectDataFrame, 'Bio:', '', 5) self.subjectDataFrame.grid(row=rowCount, column=0) def addSubjectField(self, container, name, value, row): labelFont = tkFont.Font(family=self.fontFamily, size=12) descLabel = tk.Label(container, text=name, bg='black', fg='white', font=labelFont) descLabel.grid(row=row, column=0, sticky=tk.W + tk.E + tk.N + tk.S) label = tk.Label(container, text=value, relief=tk.RIDGE, width=30, bg='black', fg='white', bd=0, font=labelFont) label.grid(row=row, column=1, sticky=tk.W + tk.E + tk.N + tk.S) return label def checkPendingWork(self): if self.subjectsQueue.empty(): # Check every configured ms if there is something new in the queue. self.rootWindow.after(CHECK_PENDING_WORK_DELAY, self.checkPendingWork) else: self.thumbnailsCarrousel.stop() self.closeAlarmAlert() logging.info('New subject found!') name, email, img, rawImage = self.newSubjectHandler.newSubject(self.subjectsQueue.get()) self.showDetectedSubject(name, img, rawImage) self.launchSearch(name, email) self.rootWindow.after(DISPLAY_ALARM_DELAY, self.showAlarm) def closeAlarmAlert(self): if self.alertPopup is not None: self.alertPopup.destroy() self.alertPopup = None self.changeSubjectFramesColor('black') def showAlarm(self): self.alertPopup = AlertPopup(400, 200) self.toggleAlarmCount = 0 self.toggleAlarm() def toggleAlarm(self): if self.toggleAlarmCount == MAX_TOGGLE_ALAM_COUNT: self.rootWindow.after(CHECK_PENDING_WORK_DELAY, self.checkPendingWork) else: color = 'red' if self.toggleAlarmCount % 2 == 0 else 'black' self.changeSubjectFramesColor(color) self.toggleAlarmCount += 1 self.rootWindow.after(TOGGLE_ALARM_DELAY, self.toggleAlarm) def changeSubjectFramesColor(self, color): self.leftFrame.config(bg=color) self.leftFrame.pack() self.subjectDataFrame.config(bg=color) self.subjectDataFrame.grid() fgColor = 'black' if color == 'red' else 'white' self.subjectNameLabel.configure(bg=color, fg=fgColor) self.subjectNameLabel.grid() for w in self.subjectDataFrame.winfo_children(): w.configure(bg=color, fg=fgColor) w.grid() def showDetectedSubject(self, name, image, rawImage): logging.debug('Showing detected subject {0}'.format(name)) self.showDetectedSubjectName(name) self.showDetectedSubjectPicture(image) def showDetectedSubjectName(self, name): if name is not None: self.subjectNameLabel.configure(text=name.title()) self.subjectNameLabel.grid() def showDetectedSubjectPicture(self, image): if image is not None: self.subjectImage = convertImageCVToTk(image) self.subjectPictureLabel.configure(image=self.subjectImage) self.subjectPictureLabel.grid() def showCollectedFaces(self): if len(self.faces) <= 0: return pos = randint(0, len(self.faces) - 1) img = self.faces[pos] outputSize = calculateScaledSize(int(self.outputWidth / 2), image=img) outputImage = cv2.resize(img, outputSize) self.randomSubjectImage = convertImageCVToTk(outputImage) self.listFacesLabel.configure(image=self.randomSubjectImage) self.listFacesLabel.pack() self.rootWindow.after(125, self.showCollectedFaces) def launchSearch(self, name, email): result = searchFullContact(email) photoUrls = [photo.get('url', '') for photo in getList(result, 'photos')] thumbnails, _, profile = searchPipl(email) if 'mainPicture' in profile: photoUrls.append(profile.get('mainPicture')) # self.webPicturesIterator = WebPicturesIterator(photoUrls) self.webPicturesIterator = WebPicturesIterator([]) # self.socialNetworkIterator = SocialNetworkIterator(getList(result, 'socialProfiles')) self.socialNetworkIterator = SocialNetworkIterator([]) self.rotateWebData() twitterThumbs = [t for t in thumbnails if t[2] is not None and 'twitter.com' in t[2]] others = [t for t in thumbnails if t[2] is not None and 'twitter.com' not in t[2]] self.thumbnailsCarrousel.start(twitterThumbs[:2] + others) def rotateWebData(self): size = 200, 200 rotate = False logging.debug('Trying to iterate web image...') if self.webPicturesIterator.hasNext(): logging.debug('Next image found!') image = self.webPicturesIterator.next() if image is not None: # TODO: keep ratio when resizing image.- jarias image = image.resize(size) self.currentWebPicture = PhotoImage(image) self.webPictureLabel.configure(image=self.currentWebPicture) self.webPictureLabel.pack() rotate = True else: logging.debug('No images detected.') logging.debug('Trying to iterate social network...') if self.socialNetworkIterator.hasNext(): logging.debug('Next social network found!') profileType, username, followers, following, url, bio = self.socialNetworkIterator.next() self.snType.configure(text=profileType) self.snType.grid(row=0, column=1) self.snUsername.configure(text=username) self.snFollowers.configure(text=followers) self.snFollowing.configure(text=following) self.snURL.configure(text=url) self.snBio.configure(text=bio) rotate = True else: logging.debug('No social networks detected.') self.leftFrame.pack() if rotate: self.rootWindow.after(ROTATE_WEB_PICTURE_DELAY, self.rotateWebData) def on_closing(self): logging.debug('Trying to exit FaceIDApp...') self.closeAlarmAlert() self.thumbnailsCarrousel.stop() self.observer.stop() self.observer.join() self.rootWindow.destroy() logging.info('Exit FaceIDApp gracefully.')