コード例 #1
0
ファイル: te.py プロジェクト: fanshixiong/Track-
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()
コード例 #2
0
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))
コード例 #3
0
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"))