class Example(QWidget): def __init__(self): super().__init__() i = 5 while (i < 100): self.initUI() ++i def initUI(self): self.resize(675, 300) self.setWindowTitle('在label中绘制矩形') self.lb = MyLabel(self) #重定义的label self.lb.setGeometry(QRect(30, 30, 511, 541)) img = cv2.imread('back2.jpg') height, width, bytesPerComponent = img.shape bytesPerLine = 3 * width cv2.cvtColor(img, cv2.COLOR_BGR2RGB, img) QImg = QImage(img.data, width, height, bytesPerLine, QImage.Format_RGB888) pixmap = QPixmap.fromImage(QImg) self.lb.setPixmap(pixmap) self.lb.setCursor(Qt.CrossCursor) self.show()
class MainCode(QMainWindow, main_ui.Ui_MainWindow): def __init__(self): QMainWindow.__init__(self) main_ui.Ui_MainWindow.__init__(self) self.setupUi(self) self.initUI() def initUI(self): self.setWindowTitle("标注工具") self.label_log.setText("") from mylabel import MyLabel, SemiLabel # 将响应函数绑定在按钮上 self.btn_open.clicked.connect(self.on_open_dir) self.btn_next.clicked.connect(self.on_next_image) self.btn_pre.clicked.connect(self.on_pre_image) self.btn_save.clicked.connect(self.on_save) # 目录树 self.model = QStandardItemModel(0, 1, self) self.model.setHeaderData(0, Qt.Horizontal, "文件路径") self.treeView.setModel(self.model) self.treeView.clicked.connect(self.tree_clicked) # 全手动 self.lb = MyLabel(self.tab_manu) self.lb.setGeometry(QRect(10, 10, 760, 540)) self.radio_poly.setChecked(True) self.button_group = QtWidgets.QButtonGroup(self) self.button_group.addButton(self.radio_rect) self.button_group.addButton(self.radio_poly) # 半自动 self.mylabel_rgb_semi = SemiLabel(self.tab_semi) self.mylabel_rgb_semi.setGeometry(QRect(30, 150, 320, 240)) self.label_rgb_semi.setText("") self.label_mask_semi.setText("") self.label_curmarker_semi.setText("current_marker: " + "1") # 全自动 self.label_rgbtfusion_auto.setText("") self.label_registered_auto.setText("") self.label_mask_auto.setText("") self.mylabel_registered_auto = SemiLabel(self.tab_auto) self.mylabel_registered_auto.setGeometry(QRect(40, 290, 320, 240)) self.label_curmarker_auto.setText("current_marker: " + "1") self.boundary_points = [] # self.radio_semi_auto.setChecked(True) # self.group_auto = QtWidgets.QButtonGroup(self) # self.group_auto.addButton(self.radio_semi_auto) # self.group_auto.addButton(self.radio_auto_auto) self.cur_img_ann = {} self.show() def on_open_dir(self): data_dir = QFileDialog.getExistingDirectory(self, "选取文件夹", "./") self.data_dir = data_dir test_data = os.listdir(data_dir) test_data.sort() self.test_data = test_data self.num_data = len(test_data) self.image_ids = list(range(self.num_data)) self.image_id = 0 self.label_img_info.setText("image_id: {}\nname: {}".format( self.image_id, self.test_data[self.image_id])) # 目录树显示 path_data_name = self.model.invisibleRootItem() for i in range(len(test_data)): gos_data = QStandardItem(test_data[i]) path_data_name.setChild(i, gos_data) def on_next_image(self): if self.image_id == self.num_data - 1: self.image_id = 0 else: self.image_id += 1 self.label_img_info.setText("image_id: {}\nname: {}".format( self.image_id, self.test_data[self.image_id])) def on_pre_image(self): if self.image_id == 0: self.image_id = self.num_data - 1 else: self.image_id -= 1 self.label_img_info.setText("image_id: {}\nname: {}".format( self.image_id, self.test_data[self.image_id])) def tree_clicked(self): index = self.treeView.currentIndex() self.image_id = index.row() self.label_img_info.setText("image_id: {}\nname: {}".format( self.image_id, self.test_data[self.image_id])) self.boundary_points = [] if self.tabWidget.currentIndex() == 0: # 全手动处理 self.show_image_manu() elif self.tabWidget.currentIndex() == 1: # 半自动处理 self.show_image_semi() elif self.tabWidget.currentIndex() == 2: # 全自动处理 self.show_image_auto() # 全手动标注的处理函数 def show_image_manu(self): self.lb.refresh() rgb_path = os.path.join(self.data_dir, self.test_data[self.image_id]) rgb_image = cv.imread(rgb_path) # height, width = img.shape[:2] # max_edge_scale = min(self.lb.width() / width, self.lb.height() / height) # height_scale, width_scale = height * max_edge_scale, width * max_edge_scale # img = cv.resize(img, (int(width_scale), int(height_scale))) # img = image_pad(img, 540, 760) # img = img[..., ::-1] # img = PI.fromarray(img) # img = img.toqpixmap() # # self.lb.setPixmap(img) # self.lb.set_parameters(img, self.radio_rect, self.radio_poly) # self.lb.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop) # self.lb.setCursor(Qt.CrossCursor) # 改变鼠标箭头形式 rgb_pix_map = display_image_on_label(rgb_image, self.lb) self.lb.set_parameters(rgb_pix_map, self.radio_rect, self.radio_poly, self.cur_img_ann, self.boundary_points) self.lb.setCursor(Qt.CrossCursor) # 改变鼠标箭头形式 # 半自动标注的处理函数 def show_image_semi(self): # 获取待显示结果的路径 rgb_path = os.path.join(self.data_dir, self.test_data[self.image_id]) rgb_image = cv.imread(rgb_path) rgb_pix_map = display_image_on_label(rgb_image, self.mylabel_rgb_semi) _ = display_image_on_label(rgb_image, self.label_mask_semi) self.mylabel_rgb_semi.set_parameters( rgb_image, rgb_pix_map, self.label_mask_semi, label_curmarker=self.label_curmarker_semi, mask=self.boundary_points) # 前景分割设置 # 全自动标注的处理函数 def show_image_auto(self): # 获取待显示结果的路径 data_dir = self.data_dir.split('/')[:-1] result_dir = '/'.join(data_dir) + "/registration_results/" rgb_t_fusion_path = result_dir + "rgb_t_fusion/" + self.test_data[ self.image_id] registered_path = result_dir + "registered/" + self.test_data[ self.image_id] # 显示rgb_t_fusion图像和配准后的红外图像 rgb_t_fusion_image = cv.imread(rgb_t_fusion_path) registered_image = cv.imread(registered_path) # if self.radio_semi_auto.isChecked(): # _ = display_image_on_label(rgb_t_fusion_image, self.label_rgbtfusion_auto) # registered_pix_map = display_image_on_label(registered_image, self.mylabel_registered_auto) # _ = display_image_on_label(registered_image, self.label_mask_auto) # self.mylabel_registered_auto.set_parameters(registered_image, registered_pix_map, # self.label_mask_auto, # label_curmarker=self.label_curmarker_auto, # mask = self.boundary_points) # 前景分割设置 # elif self.radio_auto_auto.isChecked(): _ = display_image_on_label(rgb_t_fusion_image, self.label_rgbtfusion_auto) registered_pix_map = display_image_on_label( registered_image, self.mylabel_registered_auto) mask, self.boundary_points = watershed.App( registered_image.copy()).start() _ = display_image_on_label(mask, self.label_mask_auto) self.mylabel_registered_auto.set_parameters( registered_image, registered_pix_map, self.label_mask_auto, label_curmarker=self.label_curmarker_auto, mask=self.boundary_points) # 前景分割设置 # 添加先验标记和分水岭 def pre_process(): gray = cv.cvtColor(registered_image, cv.COLOR_BGR2GRAY) def on_save(self): # 是否进行了标注 if self.boundary_points == []: print("请先进行标注") self.label_log.setText("Tip: " + "请先进行标注!") return # 转换标注的格式 regions = [] regions_item = {} name_shape_attributes = "polygon" regions_item["shape_attributes"] = {} regions_item["shape_attributes"]["name"] = name_shape_attributes regions_item["shape_attributes"][ "all_points_x"] = self.boundary_points[0] regions_item["shape_attributes"][ "all_points_y"] = self.boundary_points[1] category = self.test_data[self.image_id].split("_")[0] category_label = '0' if category == "box": category_label = '1' elif category == "cabinet": category_label = '2' elif category == "insulator": category_label = '3' elif category == "transformor": category_label = '4' region_attributes = {"label": category_label} regions_item["region_attributes"] = region_attributes regions.append(regions_item) img_name = self.test_data[self.image_id] self.cur_img_ann["filename"] = img_name self.cur_img_ann["size"] = random.randint(0, 1000) self.cur_img_ann["file_attributes"] = {} self.cur_img_ann["regions"] = regions # 保存标注结果 save_path = "./results/" j = json_lib.JSON() j.JSONWrite(save_path + img_name[:-4] + ".json", self.cur_img_ann) log = img_name + "的标注已保存到" + save_path + img_name[:-4] + ".json" self.label_log.setText("Tip: " + log) print(log) def water_shed(self, img): self.markers_vis = watershed.App(img).run() def keyPressEvent(self, event): ch = event.key() cur_marker = ch - ord('0') if 0 < cur_marker < 7: if self.tabWidget.currentIndex() == 1: self.label_curmarker_semi.setText("current_marker: " + str(cur_marker)) elif self.tabWidget.currentIndex() == 2: self.label_curmarker_auto.setText("current_marker: " + str(cur_marker))
class Ui_window(object): def setupUi(self, window, width=300, height=300): self.window = window window.setObjectName("window") window.resize(width, height) window.setWindowFlags(Qt.FramelessWindowHint | Qt.Tool) window.setAttribute(Qt.WA_TranslucentBackground) self.centralwidget = QtWidgets.QWidget(window) self.centralwidget.setStyleSheet("QWidget#centralwidget {\n" "background: #90202020;\n" "border-style: inset;\n" "border-width: 1px;\n" "border-color: #a0404050;\n" "border-radius: 10px;}") self.centralwidget.setObjectName("centralwidget") if window.__class__.__base__.__name__ == 'QMainWindow': window.setCentralWidget(self.centralwidget) else: self.windowLayout = QtWidgets.QVBoxLayout(self.window) self.windowLayout.setContentsMargins(0, 0, 0, 0) self.windowLayout.setSpacing(0) self.windowLayout.setObjectName("windowLayout") self.windowLayout.addWidget(self.centralwidget) self.mainlayout = QtWidgets.QVBoxLayout(self.centralwidget) self.mainlayout.setContentsMargins(0, 0, 0, 0) self.mainlayout.setSpacing(0) self.mainlayout.setObjectName("mainlayout") self.wcontent = QtWidgets.QWidget(self.centralwidget) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(1) sizePolicy.setVerticalStretch(1) sizePolicy.setHeightForWidth( self.wcontent.sizePolicy().hasHeightForWidth()) self.wcontent.setSizePolicy(sizePolicy) self.wcontent.setObjectName("wcontent") self.contentlayout = QtWidgets.QHBoxLayout(self.wcontent) self.contentlayout.setContentsMargins(0, 0, 0, 0) self.contentlayout.setSpacing(0) self.contentlayout.setObjectName("contentlayout") self.wcenter = QtWidgets.QWidget(self.wcontent) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.wcenter.sizePolicy().hasHeightForWidth()) self.wcenter.setSizePolicy(sizePolicy) self.wcenter.setMinimumSize(QtCore.QSize(1, 1)) self.wcenter.setObjectName("wcenter") self.centerLayout = QtWidgets.QVBoxLayout(self.wcenter) self.centerLayout.setContentsMargins(4, 0, 0, 0) self.centerLayout.setSpacing(0) self.centerLayout.setObjectName("centerLayout") self.ltitle = MyLabel(self.wcenter) self.ltitle.setAlignment(QtCore.Qt.AlignCenter) self.ltitle.setObjectName("ltitle") self.ltitle.onMouseMove.connect(self.ltitleMouseMove) self.ltitle.onMouseRelease.connect(self.ltitleMouseRelease) self.ltitle.onMousePress.connect(self.ltitleMousePress) self.ltitle.setStyleSheet('padding-top :6px') self.centerLayout.addWidget(self.ltitle) #self.graphicsView = QtWidgets.QGraphicsView(self.wcenter) #self.graphicsView.setObjectName("graphicsView") #self.centerLayout.addWidget(self.graphicsView) self.contentlayout.addWidget(self.wcenter) self.wrborder = MyWidget(self.wcontent) self.wrborder.onMouseMove.connect(self.wrborderMouseMove) self.wrborder.onMouseRelease.connect(self.wrborderMouseRelease) self.wrborder.onMousePress.connect(self.wrborderMousePress) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.wrborder.sizePolicy().hasHeightForWidth()) self.wrborder.setSizePolicy(sizePolicy) self.wrborder.setMinimumSize(QtCore.QSize(6, 0)) self.wrborder.setCursor(QtGui.QCursor(QtCore.Qt.SizeHorCursor)) self.wrborder.setStyleSheet("") self.wrborder.setObjectName("wrborder") self.contentlayout.addWidget(self.wrborder) self.mainlayout.addWidget(self.wcontent) self.wbottom = MyWidget(self.centralwidget) self.wbottom.setCursor(QtGui.QCursor(QtCore.Qt.SizeVerCursor)) self.wbottom.setMouseTracking(True) self.wbottom.setObjectName("wbottom") self.wbottom.onMouseMove.connect(self.wbottomMouseMove) self.wbottom.onMouseRelease.connect(self.wbottomMouseRelease) self.wbottom.onMousePress.connect(self.wbottomMousePress) self.bottomLayout = QtWidgets.QHBoxLayout(self.wbottom) self.bottomLayout.setContentsMargins(0, 0, 0, 0) self.bottomLayout.setSpacing(0) self.bottomLayout.setObjectName("bottomLayout") spacerItem = QtWidgets.QSpacerItem(471, 6, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.bottomLayout.addItem(spacerItem) self.lconner = MyLabel(self.wbottom) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.lconner.sizePolicy().hasHeightForWidth()) self.lconner.setSizePolicy(sizePolicy) self.lconner.setMinimumSize(QtCore.QSize(6, 6)) self.lconner.setMaximumSize(QtCore.QSize(6, 6)) self.lconner.setCursor(QtGui.QCursor(QtCore.Qt.SizeFDiagCursor)) self.lconner.setMouseTracking(True) self.lconner.setText("") self.lconner.setObjectName("lconner") self.lconner.onMouseMove.connect(self.lconnerMouseMove) self.lconner.onMouseRelease.connect(self.lconnerMouseRelease) self.lconner.onMousePress.connect(self.lconnerMousePress) self.bottomLayout.addWidget(self.lconner) self.mainlayout.addWidget(self.wbottom) self.retranslateUi(window) QtCore.QMetaObject.connectSlotsByName(window) self.window.move(QApplication.desktop().screen().rect().center() - self.window.rect().center()) def onpress(self, event): print('on press') def wrborderMousePress(self, event): self.w = self.window.width() def wrborderMouseMove(self, event): w = event.globalX() - self.wrborder.mx + self.w g = self.window.geometry() g.setWidth(w) self.window.setGeometry(g) def wrborderMouseRelease(self, event): self.window.onResizeSignal.emit() def wbottomMousePress(self, event): self.h = self.window.height() def wbottomMouseMove(self, event): h = event.globalY() - self.wbottom.my + self.h g = self.window.geometry() g.setHeight(h) self.window.setGeometry(g) def wbottomMouseRelease(self, event): self.window.onResizeSignal.emit() def lconnerMousePress(self, event): self.h = self.window.height() self.w = self.window.width() def lconnerMouseMove(self, event): h = event.globalY() - self.lconner.my + self.h w = event.globalX() - self.lconner.mx + self.w g = self.window.geometry() g.setHeight(h) g.setWidth(w) self.window.setGeometry(g) def lconnerMouseRelease(self, event): self.window.onResizeSignal.emit() def ltitleMousePress(self, event): self.l = self.window.pos().x() self.t = self.window.pos().y() def ltitleMouseMove(self, event): t = event.globalY() - self.ltitle.my + self.t l = event.globalX() - self.ltitle.mx + self.l self.window.move(l, t) def ltitleMouseRelease(self, event): pass #self.window.onMovedSignal.emit() def retranslateUi(self, window): _translate = QtCore.QCoreApplication.translate window.setWindowTitle(_translate("window", "Form")) self.ltitle.setText(_translate("window", "UnTitled"))