def __init__(self): # Dictionary that will contain locations and PNMImage # objects. Used to cache images in memeory and for # providing fast retreival. self.hash = {} self.mid_size_data = {} self.small_size_data = {} self.max_size_small = 1 self.max_size_mid = 400 self.max_size_large = 10 # Create instance of the ImageContainer self.imageContainer = ImageContainer() # Start the ImageContainer thread. self.imageContainer.setDaemon(True) self.imageContainer.start()
def __init__(self): super(MainWindow, self).__init__() self.setWindowTitle("Athena 0.8") self.resize(1280, 800) self.settings = QtCore.QSettings('setting.ini', QtCore.QSettings.IniFormat) # 读入路径 self.imageFolder = self.showFileDialog() # print(self.imageFolder,"............") # self.imageFolder = '/Users/philokey/Comic' #调试方便 # 屏幕居中 self.screen = QtWidgets.QDesktopWidget().screenGeometry() self.size = self.geometry() self.move((self.screen.width()-self.size.width())/2, (self.screen.height()-self.size.height())/2) # exit = QtWidgets.QAction(QtGui.QIcon('icons/exit.png'), 'Exit', self) # exit.setShortcut('Ctrl+Q') # exit.setStatusTip('Exit application') # exit.triggered.connect(self.close) # menubar = self.menuBar() # file = menubar.addMenu('&File') # file.addAction(exit) # 文件, 图片, 按钮 三部分 # self.mainLayout = QtWidgets.QGridLayout() self.mainLayout = QtWidgets.QHBoxLayout() # 文件夹列表model self.dirModel = QtWidgets.QDirModel(self) # 只显示文件夹 # self.dirModel.setFilter(QtCore.QDir.Dirs|QtCore.QDir.NoDotAndDotDot) # self.fileSystemModel.setFilter(QtCore.QDir.Dirs|QtCore.QDir.NoDotAndDotDot) self.dirModel.setSorting(QtCore.QDir.Name) # 文件列表view self.dirTreeView = QtWidgets.QTreeView() # 绑定model self.dirTreeView.setModel(self.dirModel) # self.dirTreeView.setModel(self.fileSystemModel) self.dirTreeView.setRootIndex(self.dirModel.index(self.imageFolder)) self.dirTreeView.hideColumn(1) self.dirTreeView.hideColumn(2) self.dirTreeView.hideColumn(3) # DirTree事件响应 self.dirTreeView.selectionModel().selectionChanged.connect(self.dirTreeClicked) # self.mainLayout.addWidget(self.dirTreeView, 0, 0) self.mainLayout.addWidget(self.dirTreeView) # self.mainLayout.setColumnMinimumWidth(1, 800) self.imageContainer = ImageContainer() # self.mainLayout.addWidget(self.imageContainer, 0, 1) # print(self.geometry().width()) self.imageContainer.setMinimumWidth(self.geometry().width()*0.6) print(self.geometry().width()*0.6) self.mainLayout.addWidget(self.imageContainer) self.initButton() self.widget = QtWidgets.QWidget() self.widget.setLayout(self.mainLayout) self.setCentralWidget(self.widget) # self.setLayout(self.mainLayout) self.show() self.restoreState()
class PNMIImageService: """ Service for fetching images to disk, aswell caching them in memory so they can speed things up. """ def __init__(self): # Dictionary that will contain locations and PNMImage # objects. Used to cache images in memeory and for # providing fast retreival. self.hash = {} self.mid_size_data = {} self.small_size_data = {} self.max_size_small = 1 self.max_size_mid = 400 self.max_size_large = 10 # Create instance of the ImageContainer self.imageContainer = ImageContainer() # Start the ImageContainer thread. self.imageContainer.setDaemon(True) self.imageContainer.start() # dead never used. #self.imageContainer.pause = False #self.imageContainer.join() def notifyImageLoad(self, objects): """ print 'XX NOTIFYING IMAGES' for object in objects: active_queues[0].put(object.name) """ pass def contains(self, location): return location in self.mid_size_data def get_pnmimage(self, folder, fileName, size): """ Get PNM image. """ #print 'requesting image', fileName, 'with size', size if size == 0: location = os.path.join(folder, 'T_' + fileName) if location in self.small_size_data: return self.small_size_data[location] else: small_size = PNMImage() small_size.read(Filename(location)) self.small_size_data[location] = small_size return small_size else: location = os.path.join(folder, fileName) if location in self.mid_size_data: return self.mid_size_data[location] else: mid_size = PNMImage() mid_size.read(Filename(location)) self.mid_size_data[location] = mid_size return mid_size
class MainWindow(QtWidgets.QMainWindow): # _signal = QtCore.pyqtSignal() def __init__(self): super(MainWindow, self).__init__() self.setWindowTitle("Athena 0.8") self.resize(1280, 800) self.settings = QtCore.QSettings('setting.ini', QtCore.QSettings.IniFormat) # 读入路径 self.imageFolder = self.showFileDialog() # print(self.imageFolder,"............") # self.imageFolder = '/Users/philokey/Comic' #调试方便 # 屏幕居中 self.screen = QtWidgets.QDesktopWidget().screenGeometry() self.size = self.geometry() self.move((self.screen.width()-self.size.width())/2, (self.screen.height()-self.size.height())/2) # exit = QtWidgets.QAction(QtGui.QIcon('icons/exit.png'), 'Exit', self) # exit.setShortcut('Ctrl+Q') # exit.setStatusTip('Exit application') # exit.triggered.connect(self.close) # menubar = self.menuBar() # file = menubar.addMenu('&File') # file.addAction(exit) # 文件, 图片, 按钮 三部分 # self.mainLayout = QtWidgets.QGridLayout() self.mainLayout = QtWidgets.QHBoxLayout() # 文件夹列表model self.dirModel = QtWidgets.QDirModel(self) # 只显示文件夹 # self.dirModel.setFilter(QtCore.QDir.Dirs|QtCore.QDir.NoDotAndDotDot) # self.fileSystemModel.setFilter(QtCore.QDir.Dirs|QtCore.QDir.NoDotAndDotDot) self.dirModel.setSorting(QtCore.QDir.Name) # 文件列表view self.dirTreeView = QtWidgets.QTreeView() # 绑定model self.dirTreeView.setModel(self.dirModel) # self.dirTreeView.setModel(self.fileSystemModel) self.dirTreeView.setRootIndex(self.dirModel.index(self.imageFolder)) self.dirTreeView.hideColumn(1) self.dirTreeView.hideColumn(2) self.dirTreeView.hideColumn(3) # DirTree事件响应 self.dirTreeView.selectionModel().selectionChanged.connect(self.dirTreeClicked) # self.mainLayout.addWidget(self.dirTreeView, 0, 0) self.mainLayout.addWidget(self.dirTreeView) # self.mainLayout.setColumnMinimumWidth(1, 800) self.imageContainer = ImageContainer() # self.mainLayout.addWidget(self.imageContainer, 0, 1) # print(self.geometry().width()) self.imageContainer.setMinimumWidth(self.geometry().width()*0.6) print(self.geometry().width()*0.6) self.mainLayout.addWidget(self.imageContainer) self.initButton() self.widget = QtWidgets.QWidget() self.widget.setLayout(self.mainLayout) self.setCentralWidget(self.widget) # self.setLayout(self.mainLayout) self.show() self.restoreState() def initButton(self): buttonLayout = QtWidgets.QVBoxLayout() # box shape slGroup = QtWidgets.QButtonGroup(self) slButtonLayout = QtWidgets.QHBoxLayout() self.smlRad = QtWidgets.QRadioButton("Small") self.smlRad.clicked.connect(self.clickSmlRad) self.smlRad.setChecked(True) self.larRad = QtWidgets.QRadioButton("Large") self.larRad.clicked.connect(self.clickLarRad) slButtonLayout.addWidget(self.smlRad) slButtonLayout.addWidget(self.larRad) slGroup.addButton(self.smlRad) slGroup.addButton(self.larRad) buttonLayout.addLayout(slButtonLayout) # radio group fbGroup = QtWidgets.QButtonGroup(self) fbradButtonLayout = QtWidgets.QHBoxLayout() self.frameRad = QtWidgets.QRadioButton("Frame") self.frameRad.clicked.connect(self.clickFrameRad) self.ballRad = QtWidgets.QRadioButton("Balloon") self.ballRad.clicked.connect(self.clickBallRad) self.frameRad.setChecked(True) fbradButtonLayout.addWidget(self.frameRad) fbradButtonLayout.addWidget(self.ballRad) fbGroup.addButton(self.frameRad) fbGroup.addButton(self.ballRad) buttonLayout.addLayout(fbradButtonLayout) # box shape rpGroup = QtWidgets.QButtonGroup(self) rpradButtonLayout = QtWidgets.QHBoxLayout() self.recRad = QtWidgets.QRadioButton("Rectangle") self.recRad.clicked.connect(self.clickRecRad) self.recRad.setChecked(True) self.polyRad = QtWidgets.QRadioButton("Polygon") self.polyRad.clicked.connect(self.clickPolyRad) rpradButtonLayout.addWidget(self.recRad) rpradButtonLayout.addWidget(self.polyRad) rpGroup.addButton(self.recRad) rpGroup.addButton(self.polyRad) buttonLayout.addLayout(rpradButtonLayout) # checkBox self.confusedCheckBox = QtWidgets.QCheckBox("Confused") self.confusedCheckBox.clicked.connect(self.clickConfusedCheckBox) buttonLayout.addWidget(self.confusedCheckBox) # detect self.detectOfflineBox = QtWidgets.QCheckBox("Detect Offline") # self.detectModeBox.clicked.connect(self.clickDetectModeBox) buttonLayout.addWidget(self.detectOfflineBox) decLayout = QtWidgets.QVBoxLayout() self.detectBtn = QtWidgets.QPushButton('Auto Detect') self.detectBtn.clicked.connect(self.clickDetectBtn) decLayout.addWidget(self.detectBtn) self.dectState = QtWidgets.QLabel('') self.dectState.setMaximumHeight(10) decLayout.addWidget(self.dectState) buttonLayout.addLayout(decLayout) self.deleteBtn = QtWidgets.QPushButton('Delete') self.deleteBtn.clicked.connect(self.clickDeleteBtnBtn) self.deleteBtn.setShortcut('SPACE') buttonLayout.addWidget(self.deleteBtn) crButtonLayout = QtWidgets.QHBoxLayout() self.clearBtn = QtWidgets.QPushButton('Clear!') self.clearBtn.clicked.connect(self.clickClearBtn) crButtonLayout.addWidget(self.clearBtn) self.reloadBtn = QtWidgets.QPushButton('Reload') self.reloadBtn.clicked.connect(self.clickReloadBtn) crButtonLayout.addWidget(self.reloadBtn) buttonLayout.addLayout(crButtonLayout) pnButtonLayout = QtWidgets.QHBoxLayout() self.preBtn = QtWidgets.QPushButton('Previous') self.preBtn.clicked.connect(self.clickPreBtn) self.preBtn.setShortcut('A') pnButtonLayout.addWidget(self.preBtn) self.nextBtn = QtWidgets.QPushButton(' Next ') self.nextBtn.clicked.connect(self.clickNextBtn) self.nextBtn.setShortcut('D') pnButtonLayout.addWidget(self.nextBtn) buttonLayout.addLayout(pnButtonLayout) self.quitBtn = QtWidgets.QPushButton('Quit') self.quitBtn.clicked.connect(self.close) buttonLayout.addWidget(self.quitBtn) # self.mainLayout.addLayout(buttonLayout, 0, 2) self.mainLayout.addLayout(buttonLayout) def clickSmlRad(self): self.imageContainer.isLarge = False self.imageContainer.loadImage(self.imageContainer.imagePath) def clickLarRad(self): self.imageContainer.isLarge = True self.imageContainer.loadImage(self.imageContainer.imagePath) def clickFrameRad(self): self.imageContainer.type = 0 def clickBallRad(self): self.imageContainer.type = 1 def clickRecRad(self): self.imageContainer.boxShape = 0 def clickPolyRad(self): self.imageContainer.boxShape = 1 def clickConfusedCheckBox(self): if self.confusedCheckBox.isChecked(): self.imageContainer.isConfused = True else: self.imageContainer.isConfused = False def clickClearBtn(self): self.imageContainer.clearImage() def clickReloadBtn(self): self.imageContainer.loadImage(self.imageContainer.imagePath) def clickDetectBtn(self): if self.imageContainer.imagePath == '': print("Where is image?") return exeDir = osp.join(os.getcwd(), 'Storyboard') if self.detectOfflineBox.isChecked(): if osp.isfile(exeDir): print("local") self.dectState.setText("detecting...") self.repaint() resultDir, resultName = self.imageContainer.getOutputFileName(0) # 0 is frame fullPath = os.path.join(resultDir, resultName) # print(exeDir+' ' + self.imageContainer.imagePath + ' ' + fullPath) subprocess.run([exeDir, self.imageContainer.imagePath, fullPath]) # os.system(exeDir+' ' + self.imageContainer.imagePath + ' ' + fullPath) text = open(fullPath).read() self.dectState.setText("") else: QtWidgets.QMessageBox.critical(self, "Error", "Local detecting program is NOT FOUND!") return else: url = 'http://10.1.89.8:8080/' img = {'file':open(self.imageContainer.imagePath, 'rb')} self.dectState.setText("detecting...") self.repaint() try: # print(url) r = requests.post(url, files=img) except: QtWidgets.QMessageBox.critical(self, "Error", "Failed to establish connection.") return text = r.text self.repaint() self.imageContainer.parseDetectedResult(text, 0) self.imageContainer.paintTotalResult() self.imageContainer.isModified = True def clickDeleteBtnBtn(self): tp = self.imageContainer.type checkedList, isok = DeleteDialog.getInfo(len(self.imageContainer.result[tp]), tp) if isok: self.imageContainer.deleteBoxes(checkedList) def clickNextBtn(self): index = self.dirTreeView.currentIndex() parent = index.parent() rowCnt = self.dirModel.rowCount(parent) self.imageContainer.saveResult() if index.row() + 1 < rowCnt: nextIndex = self.dirModel.index(index.row() + 1, 0, index.parent()) self.dirTreeView.setCurrentIndex(nextIndex) def clickPreBtn(self): index = self.dirTreeView.currentIndex() parent = index.parent() self.imageContainer.saveResult() if index.row() - 1 >= 0: nextIndex = self.dirModel.index(index.row() - 1, 0, index.parent()) self.dirTreeView.setCurrentIndex(nextIndex) def dirTreeClicked(self): #获取选择的路径 pathSelected = self.dirModel.filePath(self.dirTreeView.selectedIndexes()[0]) if os.path.isfile(pathSelected) and pathSelected.split('.')[-1].lower() in FILE_TYPE: self.confusedCheckBox.setChecked(False) self.imageContainer.loadImage(pathSelected) resultDir, r0 = self.imageContainer.getOutputFileName(0) resultDir, r1 = self.imageContainer.getOutputFileName(1) if not os.path.isfile(os.path.join(resultDir, r0)) and not os.path.isfile(os.path.join(resultDir, r1)): self.dectState.setText("Not Detected") else: self.dectState.setText("") if self.frameRad.isChecked(): self.imageContainer.type = 0 else: self.imageContainer.type = 1 def showFileDialog(self): # 获取标注图片的文件夹 # fname = QtWidgets.QFileDialog.getOpenFileName(self, 'Open file', '/home') return QtWidgets.QFileDialog.getExistingDirectory(self, 'Open file', self.settings.value("imageFolder")) def restoreState(self): imageFolder = self.settings.value('imageFolder') if imageFolder == self.imageFolder: selectedFile = self.settings.value('selected') # print(imageFolder, selectedFile) index = self.dirModel.index(selectedFile) if index.isValid(): # self.dirTreeView.expand(index) self.dirTreeView.setCurrentIndex(index) def saveState(self): states = [] for index in self.dirModel.persistentIndexList(): if self.dirTreeView.isExpanded(index): # print(index.data()) states.append(index.data()) self.settings.setValue("selected", self.dirModel.filePath(self.dirTreeView.selectedIndexes()[0])) self.settings.setValue("imageFolder", self.imageFolder) # print(self.dirTreeView.selectedIndexes()[0].row()) # self.settings.setValue("Path", self.dirTreeView.selectedIndexes()[0]) def closeEvent(self, event): #关闭窗口触发以下事件 print("exit") self.saveState()