You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

810 lines
29 KiB

from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QPushButton, QGridLayout, QLineEdit, QSizePolicy, \
QHBoxLayout, QVBoxLayout, QLabel, QScrollArea, QSlider,QFileDialog,QFrame,QToolTip
from PyQt5.QtGui import QColor, QPixmap, QIcon, QPalette, QFont, QImage
from PyQt5.QtCore import QSize, QRect,QTimer,pyqtSlot
import numpy
import cv2
from PIL import Image, ImageDraw, ImageFont
from detect_ecnu import Detector
import operation,smooth,noise,sharp
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
#定义定时器
self.isCamUsed = False
self.timer=QTimer()
self.timer.timeout.connect(self.use_cam)
#定义一些变量
self.openPath=''
self.current=''
self.isDetecting=False
self.objects=[]
self.hasOrigin=False #是否有图片
#记录图片是否已经保存,用于自动保存
self.saved=True
self.initUI()
#初始化神经网络
self.detector=Detector()
self.imgLabel.setText("选择一张图片以开始")
self.move_img_label()
def initUI(self):
# filledPolicy=QSizePolicy(QSizePolicy.Ignored,QSizePolicy.Expanding)
self.titleFont = QFont('Microsoft YaHei', 10)
self.titleFont.setBold(True)
self.itemFont = QFont('Microsoft YaHei', 10)
# 主组件
self.centerWidget = QWidget()
self.mainVBox = QVBoxLayout()
self.funWidget = QWidget()
self.funWidget.setAutoFillBackground(True)
self.palette = QPalette()
self.palette.setColor(QPalette.Background, QColor(225, 225, 225))
self.funWidget.setPalette(self.palette)
self.imgWidget = QWidget()
self.imgWidget.setMinimumSize(150,150)
self.propsArea = QScrollArea()
self.propsArea.setFrameShape(QFrame.NoFrame)
# 工具栏按钮
self.btn_open = QPushButton()
self.btn_save = QPushButton()
self.btn_camera = QPushButton()
self.btn_shot = QPushButton()
self.btn_detect=QPushButton()
self.btn_flower = QPushButton()
self.btn_cache = QPushButton()
self.btn_open.setIcon(QIcon('imgs/open.png'))
self.btn_open.setIconSize(QSize(40, 40))
self.btn_open.setFixedSize(80, 50)
self.btn_open.setToolTip('打开图片')
self.btn_save.setIcon(QIcon('imgs/save.png'))
self.btn_save.setIconSize(QSize(30, 30))
self.btn_save.setFixedSize(80, 50)
self.btn_save.setToolTip('保存图片')
self.btn_camera.setIcon(QIcon('imgs/camera.png'))
self.btn_camera.setIconSize(QSize(30, 30))
self.btn_camera.setFixedSize(80, 50)
self.btn_camera.setToolTip('开启摄像头')
self.btn_shot.setIcon(QIcon('imgs/shot.png'))
self.btn_shot.setIconSize(QSize(30, 30))
self.btn_shot.setFixedSize(80, 50)
self.btn_shot.setToolTip('拍摄照片')
self.btn_shot.setEnabled(False)
self.btn_detect.setIcon(QIcon('imgs/detect.png'))
self.btn_detect.setIconSize(QSize(30,30))
self.btn_detect.setFixedSize(80,50)
self.btn_detect.setToolTip('开启口罩识别')
self.btn_detect.setEnabled(False)
self.btn_flower.setIcon(QIcon('imgs/flower.png'))
self.btn_flower.setIconSize(QSize(30, 30))
self.btn_flower.setFixedSize(80, 50)
self.btn_flower.setToolTip('口罩印花')
self.btn_cache.setIcon(QIcon('imgs/cache.png'))
self.btn_cache.setIconSize(QSize(30, 30))
self.btn_cache.setFixedSize(80, 50)
self.btn_cache.setToolTip('保留更改')
self.btn_cache.setEnabled(False)
self.fun_layout = QHBoxLayout()
self.fun_layout.addWidget(self.btn_open)
self.fun_layout.addWidget(self.btn_save)
self.fun_layout.addWidget(self.btn_camera)
self.fun_layout.addWidget(self.btn_shot)
self.fun_layout.addWidget(self.btn_detect)
self.fun_layout.addWidget(self.btn_flower)
self.fun_layout.addWidget(self.btn_cache)
self.fun_layout.addStretch(1)
self.funWidget.setLayout(self.fun_layout)
#工具栏按钮事件
self.btn_camera.clicked.connect(self.setTimer)
self.btn_open.clicked.connect(self.openFile)
self.btn_save.clicked.connect(self.save_Img)
self.btn_detect.clicked.connect(self.set_detecting)
self.btn_shot.clicked.connect(self.shot_Img)
self.btn_flower.clicked.connect(self.add_flower)
self.btn_cache.clicked.connect(self.cache)
# 属性栏
self.propsArea.setFixedWidth(260)
self.propsWidget = QWidget()
self.layout_props = QVBoxLayout()
self.lable_basic = QLabel("基本操作")
self.lable_transform = QLabel("图像变换")
self.lable_advanced = QLabel("进阶处理")
self.lable_basic.setFont(self.titleFont)
self.lable_transform.setFont(self.titleFont)
self.lable_advanced.setFont(self.titleFont)
# 属性栏操作
self.label_brightness = QLabel("亮度(0)")
self.label_brightness.setFont(self.itemFont)
self.slider_brightness = QSlider(1)
self.slider_brightness.setFixedWidth(200)
self.slider_brightness.setMinimum(-100)
self.slider_brightness.setMaximum(100)
self.slider_brightness.setSingleStep(1)
self.slider_brightness.setValue(0)
self.slider_brightness.valueChanged.connect(self.change_brightness)
self.label_move_horizon = QLabel("水平平移")
self.label_move_horizon.setFont(self.itemFont)
self.edit_move_horizon = QLineEdit()
self.edit_move_horizon.setText('0')
self.edit_move_horizon.setFixedWidth(200)
self.edit_move_horizon.returnPressed.connect(self.move_horizen)
self.label_move_vertical = QLabel("垂直平移")
self.label_move_vertical.setFont(self.itemFont)
self.edit_move_vertical = QLineEdit()
self.edit_move_vertical.setText('0')
self.edit_move_vertical.setFixedWidth(200)
self.edit_move_vertical.returnPressed.connect(self.move_vertical)
self.label_rotation = QLabel("顺时针旋转(0°)")
self.label_rotation.setFont(self.itemFont)
self.slider_rotation = QSlider(1)
self.slider_rotation.setFixedWidth(200)
self.slider_rotation.setMinimum(0)
self.slider_rotation.setMaximum(360)
self.slider_rotation.setSingleStep(2)
self.slider_rotation.setValue(0)
self.slider_rotation.valueChanged.connect(self.rotate)
self.label_flip = QLabel("翻转")
self.label_flip.setFont(self.itemFont)
self.btn_flip_horizon = QPushButton("水平翻转")
self.btn_flip_horizon.setFixedWidth(200)
self.btn_flip_horizon.setFont(self.itemFont)
self.btn_flip_horizon.clicked.connect(self.flipH)
self.btn_flip_vertical = QPushButton("垂直翻转")
self.btn_flip_vertical.setFixedWidth(200)
self.btn_flip_vertical.setFont(self.itemFont)
self.btn_flip_vertical.clicked.connect(self.flipV)
self.label_zoom = QLabel("缩放(1)")
self.label_zoom.setFont(self.itemFont)
self.slider_zoom = QSlider(1)
self.slider_zoom.setFixedWidth(200)
self.slider_zoom.setMinimum(2)
self.slider_zoom.setMaximum(50)
self.slider_zoom.setSingleStep(1)
self.slider_zoom.setValue(10)
self.slider_zoom.valueChanged.connect(self.scale)
self.label_histogram = QLabel("灰度直方图")
self.label_histogram.setFont(self.itemFont)
self.btn_histogram = QPushButton("显示直方图")
self.btn_histogram.setFixedWidth(200)
self.btn_histogram.setFont(self.itemFont)
self.btn_histogram.clicked.connect(self.hist)
self.label_contrast = QLabel("对比度(50)")
self.label_contrast.setFont(self.itemFont)
self.slider_contrast = QSlider(1)
self.slider_contrast.setFixedWidth(200)
self.slider_contrast.setMinimum(0)
self.slider_contrast.setMaximum(100)
self.slider_contrast.setSingleStep(1)
self.slider_contrast.setValue(50)
self.slider_contrast.valueChanged.connect(self.contrast)
self.label_smoothing = QLabel("图像平滑")
self.label_smoothing.setFont(self.itemFont)
self.btn_average_filter = QPushButton("均值滤波")
self.btn_average_filter.setFixedWidth(200)
self.btn_average_filter.setFont(self.itemFont)
self.btn_average_filter.clicked.connect(self.average)
self.btn_Gaussian_filter = QPushButton("高斯滤波")
self.btn_Gaussian_filter.setFixedWidth(200)
self.btn_Gaussian_filter.setFont(self.itemFont)
self.btn_Gaussian_filter.clicked.connect(self.Gaussian)
self.btn_median_filter = QPushButton("中值滤波")
self.btn_median_filter.setFixedWidth(200)
self.btn_median_filter.setFont(self.itemFont)
self.btn_median_filter.clicked.connect(self.median)
self.btn_bilater_filter = QPushButton("双边滤波")
self.btn_bilater_filter.setFixedWidth(200)
self.btn_bilater_filter.setFont(self.itemFont)
self.btn_bilater_filter.clicked.connect(self.bilater)
self.label_sharpening = QLabel("边缘检测")
self.label_sharpening.setFont(self.itemFont)
self.btn_Prewitt = QPushButton("Prewitt算子")
self.btn_Prewitt.setFixedWidth(200)
self.btn_Prewitt.setFont(self.itemFont)
self.btn_Prewitt.clicked.connect(self.prewitt)
self.btn_Sobel = QPushButton("Sobel算子")
self.btn_Sobel.setFixedWidth(200)
self.btn_Sobel.setFont(self.itemFont)
self.btn_Sobel.clicked.connect(self.sobel)
self.btn_Laplacian = QPushButton("Laplacian算子")
self.btn_Laplacian.setFixedWidth(200)
self.btn_Laplacian.setFont(self.itemFont)
self.btn_Laplacian.clicked.connect(self.laplacian)
self.btn_LoG = QPushButton("LoG算法")
self.btn_LoG.setFixedWidth(200)
self.btn_LoG.setFont(self.itemFont)
self.btn_LoG.clicked.connect(self.log)
self.btn_canny = QPushButton("Canny算子")
self.btn_canny.setFixedWidth(200)
self.btn_canny.setFont(self.itemFont)
self.btn_canny.clicked.connect(self.canny)
self.btn_reset = QPushButton("重置图像")
self.btn_reset.setFixedWidth(200)
self.btn_reset.setFont(self.titleFont)
self.btn_reset.clicked.connect(self.return_to_default)
self.label_noiseing = QLabel("图像噪声")
self.label_noiseing.setFont(self.itemFont)
self.btn_noiseing = QPushButton("椒盐噪声")
self.btn_noiseing.setFixedWidth(200)
self.btn_noiseing.setFont(self.itemFont)
self.btn_noiseing.clicked.connect(self.noise)
self.layout_props.addWidget(self.btn_reset)
self.layout_props.addWidget(self.lable_basic)
self.layout_props.addWidget(self.label_brightness)
self.layout_props.addWidget(self.slider_brightness)
self.layout_props.addWidget(self.lable_transform)
self.layout_props.addWidget(self.label_move_horizon)
self.layout_props.addWidget(self.edit_move_horizon)
self.layout_props.addWidget(self.label_move_vertical)
self.layout_props.addWidget(self.edit_move_vertical)
self.layout_props.addWidget(self.label_rotation)
self.layout_props.addWidget(self.slider_rotation)
self.layout_props.addWidget(self.label_flip)
self.layout_props.addWidget(self.btn_flip_horizon)
self.layout_props.addWidget(self.btn_flip_vertical)
self.layout_props.addWidget(self.label_zoom)
self.layout_props.addWidget(self.slider_zoom)
self.layout_props.addWidget(self.lable_advanced)
self.layout_props.addWidget(self.label_histogram)
self.layout_props.addWidget(self.btn_histogram)
self.layout_props.addWidget(self.label_contrast)
self.layout_props.addWidget(self.slider_contrast)
self.layout_props.addWidget(self.label_smoothing)
self.layout_props.addWidget(self.btn_average_filter)
self.layout_props.addWidget(self.btn_Gaussian_filter)
self.layout_props.addWidget(self.btn_median_filter)
self.layout_props.addWidget(self.btn_bilater_filter)
self.layout_props.addWidget(self.label_sharpening)
self.layout_props.addWidget(self.btn_Prewitt)
self.layout_props.addWidget(self.btn_Sobel)
self.layout_props.addWidget(self.btn_Laplacian)
self.layout_props.addWidget(self.btn_LoG)
self.layout_props.addWidget(self.btn_canny)
self.layout_props.addWidget(self.label_noiseing)
self.layout_props.addWidget(self.btn_noiseing)
self.propsWidget.setLayout(self.layout_props)
self.propsArea.setWidget(self.propsWidget)
# ===END属性栏
# 主屏幕
self.imgLabel = QLabel('正在加载神经网络...', self.imgWidget)
# 添加子组件
# mainVBox.addWidget(funWidget,0,0,1,2)
# mainVBox.addWidget(imgWidget,1,0)
# mainVBox.addWidget(propsArea,1,1)
self.bottomGrid = QGridLayout()
self.bottomGrid.addWidget(self.imgWidget, 0, 0)
self.bottomGrid.addWidget(self.propsArea, 0, 1)
self.bottomGrid.setColumnStretch(0, 5)
self.bottomGrid.setColumnStretch(1, 1)
self.bottomWidget = QWidget()
self.bottomWidget.setLayout(self.bottomGrid)
self.mainVBox.addWidget(self.funWidget)
self.mainVBox.addWidget(self.bottomWidget)
# mainVBox.setColumnStretch(0,5)
# mainVBox.setColumnStretch(1,1)
# mainVBox.setRowStretch(0,1)
# mainVBox.setRowStretch(1,8)
self.centerWidget.setLayout(self.mainVBox)
self.setGeometry(200, 200, 1200, 800)
self.setWindowTitle("图鸽1.0 --口罩识别 图像处理")
self.setWindowIcon(QIcon('imgs/logo.png'))
self.setCentralWidget(self.centerWidget)
self.show()
self.move_img_label()
def move_img_label(self):
widget_rect = self.imgWidget.rect()
label_rect = self.imgLabel.rect()
new_x = (widget_rect.width() - label_rect.width()) / 2 if (widget_rect.width() - label_rect.width())>=0 else 0
new_y = (widget_rect.height() - label_rect.height()) / 2 if (widget_rect.height() - label_rect.height())>=0 else 0
self.imgLabel.move(new_x,new_y)
def use_cam(self):
if self.isCamUsed:
ret, self.origin = self.cap.read()
if self.isDetecting:
cv2.imwrite('buffer.jpg',self.origin)
self.objects=self.detector.detect(source='buffer.jpg')
#图像处理
self.current=self.origin.copy()
for item in self.objects:
if (item[0] == 'mask'):
color = (0, 255, 255)
rbg = (255, 255, 0)
text = '医用外科口罩'
else:
color = (0, 255, 0)
rbg = (0, 255, 0)
text = 'N95口罩'
cv2.rectangle(self.current, (int(item[1][0]), int(item[1][1])), (int(item[1][2]), int(item[1][3])), color,
3)
# 添加文字
img = Image.fromarray(cv2.cvtColor(self.current, cv2.COLOR_BGR2RGB))
draw = ImageDraw.Draw(img)
font = ImageFont.truetype('simhei.ttf', 25, encoding="utf-8")
draw.text((int(item[1][0]), int(item[1][1]) - 30), text, rbg, font=font)
self.current = cv2.cvtColor(numpy.asarray(img), cv2.COLOR_RGB2BGR)
self.show_Img()
else:
self.current=self.origin.copy()
self.show_Img()
def setTimer(self):
if self.isCamUsed:
#关闭摄像头
self.timer.stop()
self.cap.release()
self.btn_camera.setIcon(QIcon('imgs/camera.png'))
self.btn_shot.setEnabled(False)
self.isCamUsed=False
self.btn_detect.setEnabled(False)
self.btn_camera.setToolTip('开启摄像头')
#无论是否开启都关闭
self.isDetecting=False
self.btn_detect.setIcon(QIcon('imgs/detect.png'))
self.btn_detect.setToolTip('开启口罩识别')
#修改Label
self.imgLabel.setText("选择一张图片以开始")
self.hasOrigin=False
self.move_img_label()
else:
#开启摄像头
#先保存未保存的图片
self.auto_save()
#删除图片
self.current=''
#删除objects
self.objects=[]
self.cap = cv2.VideoCapture(0)
self.timer.start(100)
self.btn_camera.setIcon(QIcon('imgs/camera-close.png'))
self.btn_camera.setToolTip('关闭摄像头')
self.btn_shot.setEnabled(True)
self.isCamUsed=True
self.btn_detect.setEnabled(True)
def openFile(self):
#关闭摄像头
if self.isCamUsed:
self.setTimer()
file_path, file_type = QFileDialog.getOpenFileName(self,
"打开图片文件",
"./",
'图片文件 (*.jpg;*.png;*.bmp;*.jpeg)')
if file_path=='':
return
else:
#清空objects
self.objects=[]
self.origin = cv2.imread(file_path)
self.hasOrigin=True
self.return_to_default()
self.current = self.origin.copy()
self.show_Img()
#打开图片而未编辑不需要自动保存
#将处理完的图像缩放后居中显示
def show_Img(self):
widget_rect = self.imgWidget.rect()
img_w=self.current.shape[1]
img_h=self.current.shape[0]
max_w= widget_rect.width()-100
max_h=widget_rect.height()-100
if img_w <= max_w and img_h <=max_h:
#图片比边框小
dst_w=img_w
dst_h=img_h
else:
if img_w/max_w > img_h/max_h:
#宽度超出比较大
dst_w=max_w
dst_h=int(img_h*max_w/img_w)
else:
#高度超出比较大
dst_w = int(img_w * max_h / img_h)
dst_h = max_h
#重构图像
if len(self.current.shape)==2:
self.current=cv2.cvtColor(self.current,cv2.COLOR_GRAY2BGR)
self.display = cv2.cvtColor(cv2.resize(self.current, (dst_w, dst_h), cv2.INTER_LINEAR), cv2.COLOR_BGR2RGB)
height, width, channel = self.display.shape
step = channel * width
qImg = QImage(self.display.data, width, height, step, QImage.Format_RGB888)
# 操作label
self.imgLabel.resize(width, height)
self.move_img_label()
self.imgLabel.setPixmap(QPixmap.fromImage(qImg))
else:
self.display = cv2.cvtColor(cv2.resize(self.current, (dst_w, dst_h), cv2.INTER_LINEAR), cv2.COLOR_BGR2RGB)
height, width, channel = self.display.shape
step = channel * width
qImg = QImage(self.display.data, width, height, step, QImage.Format_RGB888)
# 操作label
self.imgLabel.resize(width, height)
self.move_img_label()
self.imgLabel.setPixmap(QPixmap.fromImage(qImg))
#保存图像
def save_Img(self):
if self.current!='':
save_path,save_type = QFileDialog.getSaveFileName(self,
"保存图片文件",
"./",
'JPG文件 (*.jpg)')
if save_path=='':
pass
else:
cv2.imwrite(save_path, self.current)
self.saved=True
#自动保存
def auto_save(self):
if not self.saved:
cv2.imwrite('autosave.jpg', self.current)
self.saved = True
#是否开启识别
def set_detecting(self):
if self.isDetecting:
#关闭
self.isDetecting=False
self.btn_detect.setIcon(QIcon('imgs/detect.png'))
self.btn_detect.setToolTip('开启口罩识别')
self.objects=[]
else:
#开启
self.isDetecting=True
self.btn_detect.setIcon(QIcon('imgs/detect-close.png'))
self.btn_detect.setToolTip('关闭口罩识别')
#保存摄像头图像
def shot_Img(self):
self.setTimer()
self.current=self.origin
self.hasOrigin=True
self.return_to_default()
self.saved=False
self.show_Img()
#图像操作
def change_brightness(self):
brightness=self.slider_brightness.value()
self.label_brightness.setText(f'亮度({brightness})')
if self.hasOrigin:
self.current = operation.brightness_change(self.origin, brightness)
self.show_Img()
self.saved=False
self.btn_cache.setEnabled(True)
self.objects=[]
def move_horizen(self):
value=self.edit_move_horizon.text()
if value.isdigit() or (value.startswith('-') and value[1:-1].isdigit()):
value=int(value)
else:
#不是文字就改为0
self.edit_move_horizon.setText('0')
return
if self.hasOrigin:
self.current = operation.translation(self.origin, value, 0)
self.show_Img()
self.saved=False
self.btn_cache.setEnabled(True)
self.objects=[]
def move_vertical(self):
value=self.edit_move_vertical.text()
if value.isdigit() or (value.startswith('-') and value[1:-1].isdigit()):
value=int(value)
else:
#不是文字就改为0
self.edit_move_vertical.setText('0')
return
if self.hasOrigin:
self.current = operation.translation(self.origin, 0, value)
self.show_Img()
self.saved=False
self.btn_cache.setEnabled(True)
self.objects=[]
def rotate(self):
angle = self.slider_rotation.value()
self.label_rotation.setText(f'逆时针旋转({angle}°)')
if self.hasOrigin:
self.current = operation.rotation(self.origin, 1, angle)
self.show_Img()
self.saved=False
self.btn_cache.setEnabled(True)
self.objects=[]
def flipH(self):
if self.hasOrigin:
self.current=operation.flip(self.current,0)
self.show_Img()
self.saved=False
self.btn_cache.setEnabled(True)
self.objects=[]
def flipV(self):
if self.hasOrigin:
self.current=operation.flip(self.current,1)
self.show_Img()
self.saved=False
self.btn_cache.setEnabled(True)
self.objects=[]
def scale(self):
if self.hasOrigin:
value=self.slider_zoom.value()/10
self.current=operation.scale(self.origin,value)
self.label_zoom.setText(f'缩放({value})')
self.show_Img()
self.saved = False
self.btn_cache.setEnabled(True)
self.objects = []
def hist(self):
if self.hasOrigin:
cv2.imshow('Histogram',operation.histogram(self.current))
def contrast(self):
if self.hasOrigin:
value=self.slider_contrast.value()
self.current=operation.contrast_change(self.origin,value)
self.label_contrast.setText(f'对比度({value})')
self.show_Img()
self.saved = False
self.btn_cache.setEnabled(True)
self.objects = []
def average(self):
if self.hasOrigin:
self.current=smooth.average_filter(self.origin)
self.show_Img()
self.saved = False
self.btn_cache.setEnabled(True)
self.objects = []
def Gaussian(self):
if self.hasOrigin:
self.current=smooth.gaussian_filter(self.origin)
self.show_Img()
self.saved = False
self.btn_cache.setEnabled(True)
self.objects = []
def median(self):
if self.hasOrigin:
self.current=smooth.median_filter(self.origin)
self.show_Img()
self.saved = False
self.btn_cache.setEnabled(True)
self.objects = []
def bilater(self):
if self.hasOrigin:
self.current=smooth.bilater_filter(self.origin)
self.show_Img()
self.saved = False
self.btn_cache.setEnabled(True)
self.objects = []
def prewitt(self):
if self.hasOrigin:
self.current=sharp.prewitt(self.origin)
self.show_Img()
self.saved = False
self.btn_cache.setEnabled(True)
self.objects = []
def sobel(self):
if self.hasOrigin:
self.current=sharp.sobel(self.origin)
self.current=cv2.normalize(self.current,dst=None, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)
# self.current=self.current.astype('float32')
self.show_Img()
self.saved = False
self.btn_cache.setEnabled(True)
self.objects = []
def laplacian(self):
if self.hasOrigin:
self.current=sharp.laplacian(self.origin)
self.current = cv2.normalize(self.current, dst=None, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX,
dtype=cv2.CV_8U)
self.show_Img()
self.saved = False
self.btn_cache.setEnabled(True)
self.objects = []
def log(self):
if self.hasOrigin:
self.current=sharp.log(self.origin)
self.current = cv2.normalize(self.current, dst=None, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX,
dtype=cv2.CV_8U)
self.show_Img()
self.saved = False
self.btn_cache.setEnabled(True)
self.objects = []
def canny(self):
if self.hasOrigin:
self.current=sharp.canny(self.origin)
self.current = cv2.normalize(self.current, dst=None, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX,
dtype=cv2.CV_8U)
self.show_Img()
self.saved = False
self.btn_cache.setEnabled(True)
self.objects = []
def noise(self):
if self.hasOrigin:
self.current=noise.noise(self.origin)
self.show_Img()
self.saved = False
self.btn_cache.setEnabled(True)
self.objects = []
def add_flower(self):
if self.hasOrigin and (not self.isCamUsed) and len(self.objects)>0:
flower=cv2.imread('flower.png')
for item in self.objects:
size=int((int(item[1][3])-int(item[1][1]))/5) #口罩高度的1/4
x= int(int(item[1][0])+ (int(item[1][2])-int(item[1][0]))*1.2/2)
y = int(int(item[1][1]) + (int(item[1][3]) - int(item[1][1])) * 1.1 / 2)
flower_dst=cv2.resize(flower,(size,size),cv2.INTER_LINEAR)
#取出需要添加的部分
seg=self.current[y:y+size,x:x+size]
seg=cv2.addWeighted(seg,1,flower_dst,1,0)
self.current[y:y + size, x:x + size]=seg
self.saved = False
self.btn_cache.setEnabled(True)
self.objects=[]
self.show_Img()
# 恢复默认
def return_to_default(self):
# 把所有参数恢复
self.label_brightness.setText('亮度(0)')
self.slider_brightness.setValue(0)
self.edit_move_horizon.setText('0')
self.edit_move_vertical.setText('0')
self.label_rotation.setText('逆时针旋转(0°)')
self.slider_rotation.setValue(0)
self.label_zoom.setText('缩放(1)')
self.slider_zoom.setValue(10)
self.label_contrast.setText('对比度(50)')
self.slider_contrast.setValue(50)
# 如果有原图恢复原图
if self.hasOrigin:
self.current = self.origin.copy()
self.btn_cache.setEnabled(False)
self.show_Img()
#缓存
def cache(self):
if self.hasOrigin:
self.origin=self.current
self.btn_cache.setEnabled(False)
def resizeEvent(self, e):
self.move_img_label()
if self.current!='':
self.show_Img()