import sys from PyQt5.QtWidgets import QFileDialog,QMainWindow,QApplication,QMessageBox, QAction from PyQt5 import uic,QtWidgets import utils import configs import glob from processor_video import FaceProcessor import os import shutil form_class = uic.loadUiType("resources\WinMain.ui")[0] class WindowMain(QMainWindow, form_class) : def __init__(self) : super().__init__() self.setupUi(self) self.setWindowTitle(configs.title) configs.WindowMain = self self.pbrs=[self.progressBar_1,self.progressBar_2,self.progressBar_3,self.progressBar_4,self.progressBar_5] self.fp =FaceProcessor() configs.fp = self.fp self.setUI() def setUI(self): utils.main_window=self self.pushButton_WorkingFolder.clicked.connect(self.OnWorkingFolder) self.pushButton_FaceFolder.clicked.connect(self.OnFaceFolder) self.pushButton_name.clicked.connect(self.OnNameFolder) self.pushButton_VideoPath.clicked.connect(self.OnVideoPath) self.pushButton_play.clicked.connect(self.OnVideoPlay) self.pushButton_DetectFace_fnbs.clicked.connect(self.OnDetectFace) self.pushButton_GenVideoClip.clicked.connect(self.OnGenVideo) self.listWidget_FaceImages.itemClicked.connect(self.OnFaceImages) self.listWidget_videoclip.itemClicked.connect(self.OnVideoClip) self.pushButton_refresh.clicked.connect(self.load_imageFaces) for pbr in self.fp.pbrs: pbr.reset() self.menuFile.triggered[QAction].connect(self.MenuTrig) self.menuSettings.triggered[QAction].connect(self.MenuTrig) self.menuHelp.triggered[QAction].connect(self.MenuTrig) self.pushButton_WorkingFolder.setFocus() def MenuTrig(self, p): m=p.text() if m=='Reset Process' : self.fp.frame_pairs_path if os.path.exists(self.fp.out_folder) : msg=f"""Reset 처리가 실행되면 처리중인 정보가 모두 삭제됩니다. 삭제되면 다시 복원이 불가능 합니다. \n\n그래도 초기화 하시겠습니까?\n\n""" yes=QMessageBox.question(self,configs.title, msg) if yes==QMessageBox.Yes : shutil.rmtree(self.fp.out_folder) wf=self.lineEdit_workingfolder.text() self.reset_gui() self.lineEdit_workingfolder.setText(wf) elif m=='Exit' : sys.exit() elif m=='Working Folder': self.OnWorkingFolder() elif m=='Name' : self.OnNameFolder() elif m=='Face Image Folder' : self.OnFaceFolder() elif m=='Video Path' : self.OnVideoPath() elif m=='VSS개요' :utils.Show_html_page_b('10254') elif m=='얼굴영역검출및인식': utils.Show_html_page_b('10258') elif m=='비디오클립생성' : utils.Show_html_page_b('10255') elif m=='About' : yes=QMessageBox.information(self,configs.title,""" 비디오검색시스템 VSS (Video Search Suystem) Version 1.0 Date : 2021.10.30 Yoon Joong Kim yjkim@hanbat.ac.kr, yjkim@netvisiontel.com ArtAi Labratory Netvision Telecom, Inc. http://www.netvisio.co.kr """) def OnWorkingFolder(self): folderpath = QFileDialog.getExistingDirectory(self, 'Select Working Folder') self.reset_gui() self.lineEdit_workingfolder.setText(folderpath) def reset_gui(self): self.lineEdit_workingfolder.setText('') self.lineEdit_name.setText('') self.lineEdit_facefolder.setText('') self.lineEdit_videopath.setText('') self.listWidget_FaceImages.clear() self.listWidget_videoclip.clear() def OnNameFolder(self): wf =self.lineEdit_workingfolder.text() nameFolder = QFileDialog.getExistingDirectory(self, 'Select Name Folder',directory=wf) self.lineEdit_name.setText(nameFolder.replace(wf,'')) def OnFaceFolder(self): wf=self.lineEdit_workingfolder.text() name=self.lineEdit_name.text() faceFolder = QFileDialog.getExistingDirectory(self, 'Select Face Folder',directory=f'{wf}{name}') self.lineEdit_facefolder.setText(faceFolder.replace(wf,'')) self.load_imageFaces(faceFolder) def load_imageFaces(self,faceFolder=None): wf=self.lineEdit_workingfolder.text() if faceFolder is None or faceFolder==False: ff=self.lineEdit_facefolder.text() faceFolder=wf+ff fns=glob.glob(f'{faceFolder}/*.jpg') if len(fns)==0: res=QMessageBox.warning(self,configs.title,'안면이미지폴더에 적어도 한개 이상의 이미지가 필요합니다.\n\n' ) return self.listWidget_FaceImages.clear() for fn in fns : self.listWidget_FaceImages.addItem(fn.replace(wf,'')) def OnVideoPath(self): wf=self.lineEdit_workingfolder.text() name=self.lineEdit_name.text() filepath = QFileDialog.getOpenFileName(self, 'Select Video Path',directory=f'{wf}{name}', filter="Video Files (*.mp4);;All Files (*)")[0] self.lineEdit_videopath.setText(filepath.replace(wf,'')) def OnVideoPlay(self): wf=self.lineEdit_workingfolder.text() vp=self.lineEdit_videopath.text() if vp !='': os.startfile(wf+vp) def OnDetectFace(self): wf=self.lineEdit_workingfolder.text() nf=self.lineEdit_name.text() ff=self.lineEdit_facefolder.text() vp=self.lineEdit_videopath.text() if ff=='' or vp == '': res=QMessageBox.warning(self,configs.title,'[안면이미지폴더] 또는 [비디오폴더]를 설정하고 다시시도하세요.\n\n' ) return try : self.fp.detect_save_face_fnameboxs( work_folder=wf, name_folder=wf+nf, face_folder=wf+ff, video_path =wf+vp ) res=QMessageBox.information(self,configs.title,'[얼굴영역검출 및 인식] 처리가 정상적으로 완료되었습니다.\n\n' ) except Exception as e: QMessageBox.warning(self,configs.title,f'{e}') def OnGenVideo(self): wf=self.lineEdit_workingfolder.text() nf=self.lineEdit_name.text() ff=self.lineEdit_facefolder.text() vp=self.lineEdit_videopath.text() if ff=='' or vp == '': res=QMessageBox.warning(self,configs.title,'[안면이미지폴더] 또는 [비디오폴더]를 설정하고 다시시도하세요.\n\n' ) return self.fp.detect_save_face_fnameboxs_pure( work_folder=wf, name_folder=wf+nf, face_folder=wf+ff, video_path =wf+vp ) try: self.fp.create_subclips(nf.strip('/')) res=QMessageBox.information(self,configs.title,'[비디오클립 생성] 처리가 정상적으로 완료되었습니다.\n\n' ) for pbr in self.pbrs:pbr.reset() except Exception as e: QMessageBox.warning(self,configs.title,f'{e}') for pbr in self.pbrs:pbr.reset() def OnFaceImages(self): wf=self.lineEdit_workingfolder.text() imf=self.lineEdit_facefolder.text() os.startfile(wf+imf) def OnVideoClip(self): wf=self.lineEdit_workingfolder.text() vp=self.listWidget_videoclip.currentItem().text() dir=os.path.dirname(wf+vp) os.startfile(dir) if __name__ == "__main__" : app = QApplication(sys.argv) myWindow = WindowMain() myWindow.show() app.exec_()