def __init__(self, *args, **kwargs): super(MainWindow, self).__init__(*args, **kwargs) # INIT STUFF app.aboutToQuit.connect(self.quit_app) try: with open("zone_info.csv") as f: zone_csv = csv.reader(f) next(zone_csv) # Skip first line self.zones = [Zone(zone_info) for zone_info in zone_csv] except FileNotFoundError: print("zone_info.csv not found, quitting!") sys.exit(1) self.title = "Dude, Where's My Guild???" self.setWindowTitle(self.title) self.setWindowIcon(QIcon(os.path.join("icons", "DWMG.png"))) outer_layout = QVBoxLayout() tool_layout = QHBoxLayout() map_layout = QVBoxLayout() data_layout = QVBoxLayout() button_layout = QVBoxLayout() # WINDOW VARIABLES, could be used for persistance between sessions self.on_top = False self.opacity = 1 # TOOL BAR self.button_log_folder = QPushButton() self.button_log_folder.setIcon(QApplication.style().standardIcon( QStyle.SP_DialogOpenButton)) self.button_log_folder.setToolTip("Select EQ or log folder") self.button_log_folder.pressed.connect(self.select_eqlog_dir) self.button_on_top = QPushButton() self.button_on_top.setIcon( QIcon(os.path.join("icons", "NotAlwaysOnTop.png"))) self.button_on_top.setToolTip("Always on top") self.button_on_top.pressed.connect(self.always_on_top) # SET WINDOW OPACITY AND SETUP SLIDER self.setWindowOpacity(self.opacity) self.opacity_slider = QSlider(Qt.Horizontal) self.opacity_slider.setMinimum(20) self.opacity_slider.setMaximum(100) self.opacity_slider.setTickInterval(1) self.opacity_slider.setValue(self.opacity * 100) self.opacity_slider.setToolTip("Window transparency") self.opacity_slider.valueChanged.connect(self.opacity_changed) # MAP LABEL INITIAL_MAP = "Map_eastcommons.jpg" self.label_map = QLabel() pixmap = QPixmap(os.path.join(os.getcwd(), "maps", INITIAL_MAP)) self.label_map.setPixmap(pixmap) self.label_map.resize(pixmap.width(), pixmap.height()) self.resize(pixmap.width(), pixmap.height()) # BOTTOM TESTING LABELS label_zone = QLabel("Zone:") self.label_currentzone = QLabel("") label_loc = QLabel("Location:") self.label_currentloc = QLabel("") label_prevloc = QLabel("Previous Location:") self.label_prevloc = QLabel("") button_quit = QPushButton("Quit") button_quit.pressed.connect(self.quit_app) # LAYOUT SETUP tool_layout.addWidget(self.button_log_folder, 0, Qt.AlignLeft) tool_layout.addWidget(self.button_on_top, 1, Qt.AlignLeft) tool_layout.addWidget(self.opacity_slider, 16, Qt.AlignLeft) map_layout.addWidget(self.label_map) data_layout.addStretch() data_layout.addWidget(label_zone) data_layout.addWidget(self.label_currentzone) data_layout.addWidget(label_loc) data_layout.addWidget(self.label_currentloc) data_layout.addWidget(label_prevloc) data_layout.addWidget(self.label_prevloc) button_layout.addWidget(button_quit) outer_layout.addLayout(tool_layout) outer_layout.addLayout(map_layout) outer_layout.addLayout(data_layout) outer_layout.addLayout(button_layout) w = QWidget() w.setLayout(outer_layout) self.setCentralWidget(w) self.setMaximumSize(outer_layout.geometry().width(), outer_layout.geometry().height()) self.show() self.threadpool = QThreadPool() print("Multithreading with maximum %d threads" % self.threadpool.maxThreadCount()) self.get_eqlog_dir() try: self.start_logscanner(self.eqlog_dir) except AttributeError: print( "Error: No eq log dir defined, unable to start log scanner thread" )
class ImageViewer(QWidget): def __init__(self): super().__init__() self.scale = 1.0 self.image = None self.bMousePress = False self.bMouseDouble = False self.bDrawRect = False self.pressPos = None self.releasePos = None self.rectList = [] self.imageCount = [0]*100 self.imageVec = [] self.imageVecIter = 0 self.bCtrlPress = False self.x1 = self.y1 = self.x2 = self.y2 = 0 self.initUI() def initUI(self): self.readImgBtn = QPushButton('SelectImage') self.readImgBtn.setMaximumSize(500,30) self.imgPath = QLineEdit() self.savePathBtn = QPushButton(('SelectPath')) self.savePath = QLineEdit() self.TopLayout = QHBoxLayout() self.TopLayout.addWidget(self.readImgBtn) self.TopLayout.addWidget(self.imgPath) self.TopLayout.addWidget(self.savePathBtn) self.TopLayout.addWidget(self.savePath) self.showImgLabel = QLabel('image') self.scrollArea = QScrollArea() self.scrollArea.setWidget(self.showImgLabel) self.scrollArea.setAlignment(Qt.AlignCenter) self.scrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.scrollArea.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.MidLayout = QVBoxLayout() self.MidLayout.addWidget(self.scrollArea) self.MidLayout.setSizeConstraint(QLayout.SetFixedSize) self.nextBtn = QPushButton('Next') self.lastBtn = QPushButton('Last') self.combox_label = QComboBox() self.combox_label.addItem('0') self.combox_label.addItem('1') #self.combox_label.addItem('2') self.saveImgBtn = QPushButton(('SaveImage')) self.BottomLayout = QHBoxLayout() self.BottomLayout.addWidget(self.lastBtn) self.BottomLayout.addWidget(self.nextBtn) self.BottomLayout.addWidget(self.combox_label) self.BottomLayout.addWidget(self.saveImgBtn) self.mainLayout = QGridLayout(self) self.mainLayout.addLayout(self.TopLayout,0,0) self.mainLayout.addLayout(self.MidLayout,1,0) self.mainLayout.addLayout(self.BottomLayout,2,0) self.mainLayout.setSpacing(6) self.resize(640,480) self.readImgBtn.clicked.connect(self.openAnImage) self.saveImgBtn.clicked.connect(self.saveRoiImage) self.nextBtn.clicked.connect(self.nextImage) self.lastBtn.clicked.connect(self.LastImage) self.savePathBtn.clicked.connect(self.openAFolder) def keyPressEvent(self,event): if event.key() == Qt.Key_Control: self.bCtrlPress = True def keyReleaseEvent(self,event): self.bCtrlPress = False def wheelEvent(self,event): if not self.bCtrlPress: return self.rectList.clear() x = self.showImgLabel.geometry().x() + self.MidLayout.geometry().x() y = self.showImgLabel.geometry().y() + self.MidLayout.geometry().y() w,h = self.showImgLabel.geometry().width(),self.showImgLabel.geometry().height() qrect = QRect(QPoint(x,y),QSize(w,h)) if qrect.contains(event.pos()): delta = event.angleDelta() numDegress = delta.y()/8 if numDegress > 0: self.scale *= 1.2 else: self.scale /= 1.2 self.showImage() def mouseMoveEvent(self,event): if self.bDrawRect: self.releasePos = event.pos() self.showImage() if not self.bMousePress: return curPt = event.pos() disX = self.pressPos.x() - curPt.x() disY = self.pressPos.y() - curPt.y() self.scrollArea.verticalScrollBar().setValue(self.scrollArea.verticalScrollBar().value() + disY) self.scrollArea.horizontalScrollBar().setValue(self.scrollArea.horizontalScrollBar().value() + disX) self.pressPos = curPt def mousePressEvent(self,event): x = self.showImgLabel.geometry().x() + self.MidLayout.geometry().x() y = self.showImgLabel.geometry().y() + self.MidLayout.geometry().y() w,h = self.showImgLabel.geometry().width(),self.showImgLabel.geometry().height() qrect = QRect(QPoint(x,y),QSize(w,h)) if qrect.contains(event.pos()) and Qt.RightButton == event.buttons(): self.bMousePress = True self.bDrawRect = False self.pressPos = event.pos() elif qrect.contains(event.pos()) and Qt.LeftButton == event.button(): self.bDrawRect = True self.bMousePress = False self.pressPos = event.pos() else: self.bMousePress = False self.bDrawRect = False def mouseDoubleClickEvent(self,event): x3 = event.x() - self.MidLayout.geometry().x() - self.showImgLabel.pos().x() y3 = event.y() - self.MidLayout.geometry().y() - self.showImgLabel.pos().y() for i in range(len(self.rectList)): label,x1,y1,x2,y2 = self.rectList[i] if x1<x3<x2 and y1<y3<y2: del self.rectList[i] break h,w,c = self.image.shape scaleMat = cv2.resize(self.image,(int(self.scale*w),int(self.scale*h)),interpolation = cv2.INTER_AREA) for i in range(len(self.rectList)): label,x1,y1,x2,y2 = self.rectList[i] cv2.rectangle(scaleMat,(x1,y1),(x2,y2),(0,255,0),2) cv2.putText(scaleMat,label,(x1,y1),cv2.FONT_HERSHEY_SIMPLEX,1,(255,0,0),1) h,w,c = scaleMat.shape bytesPerLine = c * w self.qimage=QImage(scaleMat.data,w,h,bytesPerLine,QImage.Format_RGB888) self.showImgLabel.resize(self.qimage.size()) self.showImgLabel.setPixmap(QPixmap.fromImage(self.qimage)) def mouseReleaseEvent(self,event): if self.bDrawRect: self.pressPos = QPoint(0,0) self.bMousePress = False self.bDrawRect = False label = self.combox_label.currentText() if self.x1 < self.x2 - 5 and self.y1 < self.y2 - 5: self.rectList.append([label,self.x1,self.y1,self.x2,self.y2]) #print(self.x1,self.y1,self.x2,self.y2) def showImage(self): name = self.imageVec[self.imageVecIter] n = name.rfind('/') name = name[n+1:] h,w,c = self.image.shape cv2.putText(self.image,name,(10,25),cv2.FONT_HERSHEY_SIMPLEX,1,(255,0,0),1) self.scaleMat = cv2.resize(self.image,(int(self.scale*w),int(self.scale*h)),interpolation = cv2.INTER_AREA) for i in range(len(self.rectList)): label,x1,y1,x2,y2 = self.rectList[i] cv2.rectangle(self.scaleMat,(x1,y1),(x2,y2),(0,255,0),2) cv2.putText(self.scaleMat,label,(x1,y1),cv2.FONT_HERSHEY_SIMPLEX,1,(255,0,0),1) if self.bDrawRect: self.x1 = self.pressPos.x() - self.MidLayout.geometry().x() - self.showImgLabel.pos().x() self.y1 = self.pressPos.y() - self.MidLayout.geometry().y() - self.showImgLabel.pos().y() self.x2 = self.releasePos.x() - self.MidLayout.geometry().x() - self.showImgLabel.pos().x() self.y2 = self.releasePos.y() - self.MidLayout.geometry().y() - self.showImgLabel.pos().y() #print(self.x1,self.y1,self.x2,self.y2) if self.x1 < self.x2 and self.y1 < self.y2: cv2.rectangle(self.scaleMat,(self.x1,self.y1),(self.x2,self.y2),(0,255,0),2) label = self.combox_label.currentText() cv2.putText(self.scaleMat,label,(self.x1,self.y1),cv2.FONT_HERSHEY_SIMPLEX,1,(255,0,0),1) h,w,c = self.scaleMat.shape bytesPerLine = c * w self.qimage=QImage(self.scaleMat.data,w,h,bytesPerLine,QImage.Format_RGB888) self.showImgLabel.resize(self.qimage.size()) self.showImgLabel.setPixmap(QPixmap.fromImage(self.qimage)) def readImage(self,path=''): #self.image=cv2.imread(path) self.image = cv2.imdecode(np.fromfile(path,dtype=np.uint8),-1) if self.image.all(): return cv2.cvtColor(self.image,cv2.COLOR_BGR2RGB,self.image) self.showImage() def saveRoiImage(self): if len(self.imageVec)==0: return h,w,c = self.image.shape #去除框边缘 scaleMat = cv2.resize(self.image,(int(self.scale*w),int(self.scale*h)),interpolation = cv2.INTER_AREA) cv2.cvtColor(scaleMat,cv2.COLOR_RGB2BGR,scaleMat) for i in range(len(self.rectList)): label,x1,y1,x2,y2 = self.rectList[i] roi = scaleMat[x1:x2,y1:y2] name = self.savePath.text() + label + '/' + '%.2d_%.4d.jpg'%(int(label),self.imageCount[int(label)]) print(label,name) cv2.imencode('.jpg',roi)[1].tofile(name) self.imageCount[int(label)] += 1 #bbox = self.imageVec[self.imageVecIter] + ' ' + label + ' ' + str(x1) + ' ' + str(x2) + ' ' + str(y1) + ' ' + str(y2) + '\n' #f = open('train.txt','a') #f.write(bbox) #f.close() def openAFolder(self): path = QFileDialog.getExistingDirectory(self,'Select A Folder','D:/src') if path == '': return path += '/' self.savePath.setText(path) filelist = os.listdir(path) count = [0] * 100 self.imageCount = [0] * 100 for i in range(len(filelist)): if '.' in filelist[i]: print(filelist[i]) continue else: filelist1 = os.listdir(path+'filelist[i]') for j in range(len(filelist1)): if filelist[1][-4:] != 'jpg': continue label = int(filelist[i][0:2]) count[label] = int(filelist[i][3:7]) if self.imageCount[label] <= count[label]: self.imageCount[label] = count[label] + 1 def openAnImage(self): self.imageVecIter = 0 self.imageVec.clear() self.rectList.clear() file = QFileDialog.getOpenFileName(self,'Select An Image','D:/src','bmp files(*.bmp);;png files(*.png);;jpg files(*.jpg *jpeg)') if file == '': return n = file[0].rfind('/') path = file[0][:n] path += '/' self.imgPath.setText(path) n = file[0].rfind('.') imgtype = file[0][n+1:] filelist = os.listdir(path) k = 0 for i in range(len(filelist)): if filelist[i][-3:] != imgtype: continue else: self.imageVec.append(path + filelist[i]) k += 1 if path + filelist[i] == file[0]: self.imageVecIter = k - 1 if len(self.imageVec) > 0: self.readImage(self.imageVec[self.imageVecIter]) def nextImage(self): if len(self.imageVec)==0: return if self.imageVecIter == len(self.imageVec)-1: return else: self.imageVecIter += 1 self.rectList.clear() self.readImage(self.imageVec[self.imageVecIter]) def LastImage(self): if len(self.imageVec)==0: return if self.imageVecIter == 0: return else: self.imageVecIter -= 1 self.rectList.clear() self.readImage(self.imageVec[self.imageVecIter]) """