文章目录

  • 前言
  • 视频演示
  • 一、ui配置
    • 1.left_button.py源码
    • 2.switch_btn.py源码
    • 3.主页面重要代码
  • 二、界面功能
    • 1.初始化模型
    • 2.初始化模型
    • 3.相机采图
    • 4.获取坐标点
  • 总结

前言

本文主要实现图像转素描,支持相机取图或者载入图像取图
环境配置:
python3.6 64位
paddlepaddle2.3.1
chainer
7.8.1
cupy-cuda==7.8
halcon12.0
visualstudio code


视频演示

基于pyqt+深度学习,实现图像转素描并得到一系列坐标点


一、ui配置

本文的UI配置因为比较简单,因此基本是纯代码写界面
本工程ui配置的文件如下:


1.left_button.py源码

首先左边侧边栏按钮代码:

import os
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *class PyPushButton(QPushButton):def __init__(self, text = "", height = 40, minimum_width = 50, text_padding = 55,icon_path = "",is_active = False,text_color = "#c3ccdf", icon_color = "#c3ccdf", btn_color = "#44475a", btn_hover = "#4f5368", btn_pressed = "#282a36"):super().__init__()self.setText(text)self.setMaximumHeight(height)self.setMinimumHeight(height)self.setCursor(Qt.PointingHandCursor)self.minimum_width = minimum_widthself.text_padding = text_paddingself.text_color = text_colorself.icon_path = icon_pathself.icon_color = icon_colorself.btn_color = btn_colorself.btn_hover = btn_hoverself.btn_pressed = btn_pressedself.is_active = is_activeself.set_style(text_padding = self.text_padding,text_color = self.text_color,btn_color = self.btn_color,btn_hover = self.btn_hover,btn_pressed = self.btn_pressed,is_active = self.is_active)def set_style(self,text_padding = 55,text_color = "#c3ccdf",btn_color = "#44475a",btn_hover = "#4f5368",btn_pressed = "#282a36",is_active = False):style = f"""QPushButton {{color:{text_color};background-color:{btn_color};padding-left:{text_padding}px;text-align: left;border: none;}}QPushButton:hover {{background-color:{btn_hover};}}QPushButton:pressed {{background-color:{btn_pressed};}}"""active_style = f"""QPushButton {{background-color:{btn_hover};border-right: 5px solid #282a36;}}"""if not is_active:self.setStyleSheet(style)else:self.setStyleSheet(style + active_style)def set_active(self, is_active_menu):self.set_style(text_padding = self.text_padding,text_color = self.text_color,btn_color = self.btn_color,btn_hover = self.btn_hover,btn_pressed = self.btn_pressed,is_active = is_active_menu)def paintEvent(self, event):QPushButton.paintEvent(self, event)qp = QPainter()qp.begin(self)qp.setRenderHint(QPainter.Antialiasing)qp.setPen(Qt.NoPen)rect = QRect(0,0, self.minimum_width, self.height())self.draw_icon(qp, self.icon_path, rect, self.icon_color)qp.end()def draw_icon(self, qp, image, rect, color):app_path = os.path.abspath(os.getcwd())icon_path = os.path.normpath(image)icon = QPixmap(icon_path)painter = QPainter(icon)painter.setCompositionMode(QPainter.CompositionMode_SourceIn)painter.fillRect(icon.rect(), color)qp.drawPixmap((rect.width() - icon.width()) / 2,(rect.height() - icon.height()) / 2,icon)painter.end()

2.switch_btn.py源码


from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *class SwitchButton(QWidget):#信号checkedChanged = Signal (bool)def __init__(self,parent=None,width=60,height=20):super(SwitchButton, self).__init__(parent)self.checked = Falseself.bgColorOff = QColor(255, 255, 255)self.bgColorOn = QColor(0, 0, 0)self.sliderColorOff = QColor(100, 100, 100)self.sliderColorOn = QColor(100, 184, 255)self.textColorOff = QColor(143, 143, 143)self.textColorOn = QColor(255, 255, 255)self.textOff = "OFF"self.textOn = "ON"self.space = 2self.rectRadius = 5self.step = self.width() / 50self.startX = 0self.endX = 0self.timer = QTimer(self)  # 初始化一个定时器self.timer.timeout.connect(self.updateValue)  # 计时结束调用operate()方法#self.timer.start(5)  # 设置计时间隔并启动self.setFont(QFont("Microsoft Yahei", 10))#self.resize(55,22)self.setMinimumWidth(width)self.setMaximumWidth(width)self.setMinimumHeight(height)self.setMaximumHeight(height)def updateValue(self):if self.checked:if self.startX < self.endX:self.startX = self.startX + self.stepelse:self.startX = self.endXself.timer.stop()else:if self.startX  > self.endX:self.startX = self.startX - self.stepelse:self.startX = self.endXself.timer.stop()self.update()def mousePressEvent(self,event):self.checked = not self.checked#发射信号self.checkedChanged.emit(self.checked)# 每次移动的步长为宽度的50分之一self.step = self.width() / 50#状态切换改变后自动计算终点坐标if self.checked:self.endX = self.width() - self.height()else:self.endX = 0self.timer.start(5)def paintEvent(self, evt):#绘制准备工作, 启用反锯齿painter = QPainter()painter.begin(self)painter.setRenderHint(QPainter.Antialiasing)#绘制背景self.drawBg(evt, painter)#绘制滑块self.drawSlider(evt, painter)#绘制文字self.drawText(evt, painter)painter.end()def drawText(self, event, painter):painter.save()if self.checked:painter.setPen(self.textColorOn)painter.drawText(0, 0, self.width() / 2 + self.space * 2, self.height(), Qt.AlignCenter, self.textOn)else:painter.setPen(self.textColorOff)painter.drawText(self.width() / 2, 0,self.width() / 2 - self.space, self.height(), Qt.AlignCenter, self.textOff)painter.restore()def drawBg(self, event, painter):painter.save()painter.setPen(Qt.NoPen)if self.checked:painter.setBrush(self.bgColorOn)else:painter.setBrush(self.bgColorOff)rect = QRect(0, 0, self.width(), self.height())#半径为高度的一半radius = rect.height() / 2#圆的宽度为高度circleWidth = rect.height()path = QPainterPath()path.moveTo(radius, rect.left())path.arcTo(QRectF(rect.left(), rect.top(), circleWidth, circleWidth), 90, 180)path.lineTo(rect.width() - radius, rect.height())path.arcTo(QRectF(rect.width() - rect.height(), rect.top(), circleWidth, circleWidth), 270, 180)path.lineTo(radius, rect.top())painter.drawPath(path)painter.restore()def drawSlider(self, event, painter):painter.save()if self.checked:painter.setBrush(self.sliderColorOn)else:painter.setBrush(self.sliderColorOff)rect = QRect(0, 0, self.width(), self.height())sliderWidth = rect.height() - self.space * 2sliderRect = QRect(self.startX + self.space, self.space, sliderWidth, sliderWidth)painter.drawEllipse(sliderRect)painter.restore()

3.主页面重要代码

if not parent.objectName():parent.setObjectName("MainWindow")self.img_path = img_pathparent.resize(1280, 680)parent.setMinimumSize(1280, 680)#主页frame - 主self.central_frame = QFrame()self.main_layout = QHBoxLayout(self.central_frame)self.main_layout.setContentsMargins(0,0,0,0)self.main_layout.setSpacing(0)#主页frame - 中间页面self.content = QFrame()self.content.setStyleSheet("background-color: #282a36")self.content_layout = QVBoxLayout(self.content)self.content_layout.setContentsMargins(0, 0, 0, 0)self.content_layout.setSpacing(0)# 主页frame - 上方标题栏self.top_bar = QFrame()self.top_bar.setMinimumHeight(30)self.top_bar.setMaximumHeight(30)self.top_bar.setStyleSheet("background-color: #21232d; color: #6272a4")self.top_bar_layout = QHBoxLayout(self.top_bar)self.top_bar_layout.setContentsMargins(10, 0, 10, 0)# 主页frame - 下方状态栏self.bottom_bar = QFrame()self.bottom_bar.setMinimumHeight(30)self.bottom_bar.setMaximumHeight(30)self.bottom_bar.setStyleSheet("background-color: #21232d; color: #6272a4")self.bottom_bar_layout = QHBoxLayout(self.bottom_bar)self.bottom_bar_layout.setContentsMargins(10, 0, 10, 0)# 侧边栏-主self.left_menu = QFrame()self.left_menu.setStyleSheet("background-color: #44475a")self.left_menu.setMaximumWidth(50)self.left_menu.setMinimumWidth(50)self.left_menu_layout = QVBoxLayout(self.left_menu)self.left_menu_layout.setContentsMargins(0,0,0,0)self.left_menu_layout.setSpacing(0)# 侧边栏- 按钮self.left_menu_top_frame = QFrame()self.left_menu_top_frame.setMinimumHeight(40)self.left_menu_top_frame.setObjectName("left_menu_top_frame")self.left_menu_top_layout = QVBoxLayout(self.left_menu_top_frame)self.left_menu_top_layout.setContentsMargins(0,0,0,0)self.left_menu_top_layout.setSpacing(0)# 侧边栏- 下方设置self.left_menu_bottom_frame = QFrame()self.left_menu_bottom_frame.setMinimumHeight(40)self.left_menu_bottom_frame.setObjectName("left_menu_bottom_frame")self.left_menu_bottom_layout = QVBoxLayout(self.left_menu_bottom_frame)self.left_menu_bottom_layout.setContentsMargins(0, 0, 0, 0)self.left_menu_bottom_layout.setSpacing(0)

二、界面功能

1.初始化模型

def InitModel(modelPath):global ctu_seg, ctu_remark, ctu_draw,LoadModelFinishtry:ctu_seg = Ctu_SegAI(USEGPU='0', image_size=513, Model_Path=modelPath)except:ctu_seg = Nonetry:ctu_remark = Ctu_FaceRemark(modelPath)except:ctu_remark = Nonectu_draw = Ctu_LineDrawing(USEGPU=-1, image_size=512)ctu_draw.LoadModel(modelPath)LoadModelFinish=True

2.初始化模型

深度学习模型检测

def DL_Check(check_cut_AI,check_remark):global ctu_seg,ctu_draw,ctu_remark,cv_img_show,cv_img_show_o,DLCheckFinish,DLCheckFinish_Cameraorigin_img = cv_img_show_o.copy()cv2_img_remark = Nonetry:if check_cut_AI:origin_img = ctu_seg.predict_cut(origin_img)except:passif ctu_draw is not None:origin_img,cv2_img_remark = ctu_draw.predict(origin_img)try:if check_remark and cv2_img_remark is not None:remark = ctu_remark.predict(cv2_img_remark)for key,value_face in remark.items():origin_img = cv2.rectangle(origin_img, value_face['face'][0],value_face['face'][1], color=(0,0,0), thickness=1)for each_point in value_face['point']:cv2.circle(origin_img, each_point, 1, color=(0, 255, 0))if cv2_img_remark is not None:del cv2_img_remarkexcept:passcv_img_show = origin_img.copy()del origin_imgDLCheckFinish=TrueDLCheckFinish_Camera=True

3.相机采图

def get_Image(cap):global cv_img_show_o,get_image_Flagwhile get_image_Flag:try:_, cv_img_show_o = cap.read()cv2.waitKey(30)except:pass

4.获取坐标点

def get_result_DL(file_name, Px_list, Py_list,Qx_list,Qy_list, use_HmatFlag,  base_file,chara_split):global result_data_list_json,result_data_list_str,DLGetResultFinishtry:result_data_list_json,result_data_list_str = get_result(file_name, Px_list, Py_list,Qx_list,Qy_list, use_HmatFlag,  base_file,chara_split)except:result_data_list_json = result_data_list_str = ''DLGetResultFinish = True

总结

因代码篇幅过长,感兴趣的可以私聊沟通一起

基于python+pyqt+深度学习实现图像转素描【附部分源码】相关推荐

  1. python opencv 录制视频_如何使用OpenCV、Python和深度学习在图像和视频中实现面部识别?...

    Face ID 的兴起带动了一波面部识别技术热潮.本文将介绍如何使用 OpenCV.Python 和深度学习在图像和视频中实现面部识别,以基于深度识别的面部嵌入,实时执行且达到高准确度. 以下内容由 ...

  2. Keras快速上手:基于Python的深度学习

    Keras快速上手:基于Python的深度学习 谢梁,鲁颖,劳虹岚 著 ISBN:9787121318726 包装:平装 开本:16开 正文语种:中文 出版社: 电子工业出版社 出版时间:2017-0 ...

  3. 从Theano到Lasagne:基于Python的深度学习的框架和库

    从Theano到Lasagne:基于Python的深度学习的框架和库 [日期:2015-08-03] 来源:http://creative-punch.net/  作者:Creative Punch ...

  4. python人脸深度识别_基于Python的深度学习人脸识别方法

    基于 Python 的深度学习人脸识别方法 薛同来 ; 赵冬晖 ; 张华方 ; 郭玉 ; 刘旭春 [期刊名称] <工业控制计算机> [年 ( 卷 ), 期] 2019(032)002 [摘 ...

  5. 人脸识别学习一(Keras: 基于 Python 的深度学习库)

    只是把一些文字部分复制出来方便看,完整还是参考源地址,参考文章https://keras.io/zh/ 写在前面: 第一次接触Keras,用自己的话简单概括一下什么事Keras,(不准确之处欢迎批评指 ...

  6. Python编程:实现词云生成(附详细源码)

    Python编程:实现词云生成(附详细源码) 词云是一种数据可视化的方式,它可以用来展示某个主题下的主要关键词汇.在Python中,我们可以使用 wordcloud 库来实现词云的生成.本文将带您一步 ...

  7. 基于ITD实现的轴承故障信号分解并附Matlab源码

    基于ITD实现的轴承故障信号分解并附Matlab源码 轴承是旋转机械中重要的支撑部件,其状态的健康程度对设备运行的性能和寿命有着至关重要的影响.因此,轴承状态监测和故障诊断成为了研究热点.本文基于IT ...

  8. 基于python的深度学习框架有_《用Python实现深度学习框架》上市

    朋友们,<用Python实现深度学习框架>已经由人民邮电出版社出版上市了.在这本书中,我们带领读者仅用Python+Numpy实现一个基于计算图的深度学习框架MatrixSlow.本书讲解 ...

  9. 从0开始,基于Python探究深度学习神经网络

    来源 |  Data Science from Scratch, Second Edition 作者 | Joel Grus 全文共6778字,预计阅读时间50分钟. 深度学习 1.  张量 2.  ...

最新文章

  1. 下载源码,开源代码库
  2. python学习框架图-Python学习---Python的框架基础学习
  3. HttpHandler浅析
  4. Objective-C马路成魔【14-关键C语言功能】
  5. [转载] Java中的静态方法不能被子类重写
  6. Windows中命令提示符被禁用的解决方法
  7. C语言宏定义,内置宏的用法
  8. java中的堆和栈_实例理解Java中的堆和栈
  9. 图解机器学习算法(3) | KNN算法及其应用(机器学习通关指南·完结)
  10. HP1010和HP1020的区别
  11. 参数问题:nested exception is java.lang.NumberFormatException: For input string: “null“,已解决。
  12. 高峰论坛:专家热议物联网行业如何迎风飞扬
  13. 谷歌关闭音乐搜索服务
  14. c语言中以追加只写方式打开文本文件,C语言文本方式和二进制方式打开文件区别...
  15. SSM 电影后台管理项目
  16. UWB/蓝牙/WiFi/红外/Zigbee/LoRa Edge…….室内定位技术的百家争鸣时代
  17. 为什么电子邮件发送失败?电子邮件发送失败的原因及解决方法
  18. 推荐系统中特征交叉模型之——DeepWide/DeepFM/NFM
  19. vue 移动端头像裁剪_vue头像上传裁剪组件_一个漂亮的Vue组件,用于图像裁剪和上传...
  20. 搞了一个论坛玩玩!http://lupeiqing.3322.org/bbs

热门文章

  1. JS中给数字添加千分符
  2. 题解报告(CDUT暑期集训——第六场)
  3. 下班后还戴着大厂工牌招摇过市,秀大厂优越感吗?
  4. 巴菲特致股东的一封信:1981年
  5. 见缝插针 一个canvas小游戏
  6. android 年终盘点总结报告,2013 Android年终总结 - 盘点五年来的各种定制界面
  7. 关于MFCC的一些笔记(python)
  8. 2019年河源市计算机等级考试,2019年9月广东省河源市计算机等级考试注意事项
  9. 机器学习笔记03-求导规则与梯度下降算法推导
  10. 没想到《天龙八部》这段,只有搞IT的才看得懂