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
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()
|
|
|