from functools import partial from threading import Thread from plugins.misc.main import AlgFrontend from rscder.gui.actions import ActionManager from rscder.plugins.basic import BasicPlugin from PyQt5.QtWidgets import QAction, QToolBar, QMenu, QDialog, QHBoxLayout, QVBoxLayout, QPushButton,QWidget,QLabel,QLineEdit,QPushButton,QComboBox,QDialogButtonBox from rscder.gui.layercombox import PairLayerCombox from rscder.utils.icons import IconInstance from filter_collection import FILTER from . import AI_METHOD from thres import THRES from misc import table_layer, AlgSelectWidget from follow import FOLLOW import os class AICDMethod(QDialog): def __init__(self,parent=None, alg:AlgFrontend=None): super(AICDMethod, self).__init__(parent) self.alg = alg self.setWindowTitle('AI变化检测:{}'.format(alg.get_name())) self.setWindowIcon(IconInstance().LOGO) self.initUI() self.setMinimumWidth(500) def initUI(self): #图层 self.layer_combox = PairLayerCombox(self) layerbox = QHBoxLayout() layerbox.addWidget(self.layer_combox) self.filter_select = AlgSelectWidget(self, FILTER) self.param_widget = self.alg.get_widget(self) self.unsupervised_menu = self.param_widget self.thres_select = AlgSelectWidget(self, THRES) self.ok_button = QPushButton('确定', self) self.ok_button.setIcon(IconInstance().OK) self.ok_button.clicked.connect(self.accept) self.ok_button.setDefault(True) self.cancel_button = QPushButton('取消', self) self.cancel_button.setIcon(IconInstance().CANCEL) self.cancel_button.clicked.connect(self.reject) self.cancel_button.setDefault(False) buttonbox=QDialogButtonBox(self) buttonbox.addButton(self.ok_button,QDialogButtonBox.NoRole) buttonbox.addButton(self.cancel_button,QDialogButtonBox.NoRole) buttonbox.setCenterButtons(True) totalvlayout=QVBoxLayout() totalvlayout.addLayout(layerbox) totalvlayout.addWidget(self.filter_select) if self.param_widget is not None: totalvlayout.addWidget(self.param_widget) totalvlayout.addWidget(self.thres_select) totalvlayout.addStretch(1) hbox = QHBoxLayout() hbox.addStretch(1) hbox.addWidget(buttonbox) totalvlayout.addLayout(hbox) # totalvlayout.addStretch() self.setLayout(totalvlayout) @FOLLOW.register class AICDFollow(AlgFrontend): @staticmethod def get_name(): return 'AI变化检测' @staticmethod def get_icon(): return IconInstance().UNSUPERVISED @staticmethod def get_widget(parent=None): widget = QWidget(parent) layer_combox = PairLayerCombox(widget) layer_combox.setObjectName('layer_combox') filter_select = AlgSelectWidget(widget, FILTER) filter_select.setObjectName('filter_select') ai_select = AlgSelectWidget(widget, AI_METHOD) ai_select.setObjectName('ai_select') thres_select = AlgSelectWidget(widget, THRES) thres_select.setObjectName('thres_select') totalvlayout=QVBoxLayout() totalvlayout.addWidget(layer_combox) totalvlayout.addWidget(filter_select) totalvlayout.addWidget(ai_select) totalvlayout.addWidget(thres_select) totalvlayout.addStretch() widget.setLayout(totalvlayout) return widget @staticmethod def get_params(widget:QWidget=None): if widget is None: return dict() layer_combox = widget.findChild(PairLayerCombox, 'layer_combox') filter_select = widget.findChild(AlgSelectWidget, 'filter_select') ai_select = widget.findChild(AlgSelectWidget, 'ai_select') thres_select = widget.findChild(AlgSelectWidget, 'thres_select') layer1=layer_combox.layer1 pth1 = layer_combox.layer1.path pth2 = layer_combox.layer2.path falg, fparams = filter_select.get_alg_and_params() cdalg, cdparams = ai_select.get_alg_and_params() thalg, thparams = thres_select.get_alg_and_params() if cdalg is None or thalg is None: return dict() return dict( layer1=layer1, pth1 = pth1, pth2 = pth2, falg = falg, fparams = fparams, cdalg = cdalg, cdparams = cdparams, thalg = thalg, thparams = thparams, ) @staticmethod def run_alg(layer1=None, pth1 = None, pth2 = None, falg = None, fparams = None, cdalg = None, cdparams = None, thalg = None, thparams = None, send_message = None): if cdalg is None or thalg is None: return name = layer1.name method_info = dict() if falg is not None: pth1 = falg.run_alg(pth1, name=name, send_message= send_message, **fparams) pth2 = falg.run_alg(pth2, name=name, send_message= send_message, **fparams) method_info['滤波算法'] = falg.get_name() else: method_info['滤波算法'] = '无' cdpth = cdalg.run_alg(pth1, pth2, layer1.layer_parent, send_message= send_message,**cdparams) if falg is not None: try: os.remove(pth1) os.remove(pth2) # send_message.emit('删除临时文件') except: # send_message.emit('删除临时文件失败!') pass thpth, th = thalg.run_alg(cdpth, name=name, send_message= send_message, **thparams) method_info['变化检测算法'] = cdalg.get_name() method_info['二值化算法'] = thalg.get_name() table_layer(thpth,layer1,name, cdpath=cdpth, th=th, method_info=method_info, send_message = send_message) class AIPlugin(BasicPlugin): @staticmethod def info(): return { 'name': 'AIPlugin', 'description': 'AIPlugin', 'author': 'RSCDER', 'version': '1.0.0', } def set_action(self): AI_menu = QMenu('&AI变化检测', self.mainwindow) AI_menu.setIcon(IconInstance().AI_DETECT) ActionManager().change_detection_menu.addMenu(AI_menu) toolbar = ActionManager().add_toolbar('AI method') for key in AI_METHOD.keys(): alg:AlgFrontend = AI_METHOD[key] if alg.get_name() is None: name = key else: name = alg.get_name() action = QAction(alg.get_icon(), name, AI_menu) func = partial(self.run_cd, alg) action.triggered.connect(func) toolbar.addAction(action) AI_menu.addAction(action) def run_cd(self, alg): # print(alg.get_name()) dialog = AICDMethod(self.mainwindow, alg) dialog.show() if dialog.exec_() == QDialog.Accepted: t = Thread(target=self.run_cd_alg, args=(dialog,)) t.start() def run_cd_alg(self, w:AICDMethod): layer1=w.layer_combox.layer1 pth1 = w.layer_combox.layer1.path pth2 = w.layer_combox.layer2.path name = layer1.layer_parent.name falg, fparams = w.filter_select.get_alg_and_params() cdalg = w.alg cdparams = w.alg.get_params(w.param_widget) thalg, thparams = w.thres_select.get_alg_and_params() if cdalg is None or thalg is None: return method_info = dict() if falg is not None: pth1 = falg.run_alg(pth1, name=name, send_message=self.send_message, **fparams) pth2 = falg.run_alg(pth2, name=name, send_message=self.send_message, **fparams) method_info['滤波算法'] = falg.get_name() cdpth = cdalg.run_alg(pth1, pth2, layer1.layer_parent, send_message=self.send_message,**cdparams) if falg is not None: try: os.remove(pth1) os.remove(pth2) # send_message.emit('删除临时文件') except: # send_message.emit('删除临时文件失败!') pass thpth, th = thalg.run_alg(cdpth, name=name, send_message=self.send_message, **thparams) method_info['变化检测算法'] = cdalg.get_name() method_info['二值化算法'] = thalg.get_name() table_layer(thpth,layer1,name, cdpath=cdpth, th=th, method_info=method_info, send_message = self.send_message) # table_layer(thpth,layer1,name,self.send_message)