2023-07-29 17:39:51 +08:00

254 lines
8.9 KiB
Python

from functools import partial
from threading import Thread
from rscder.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)