技术标签: OpenCV 图像处理 Python项目实战开发应用 Python
初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试有一定帮助。
这里主要使用PySimpleGUI、cv2和numpy库文件,PySimpleGUI库文件实现GUI可视化,cv2库文件是Python的OpenCV接口文件,numpy库文件实现数值的转换和运算,均可通过pip导入。
import PySimpleGUI as sg #pip install pysimplegui
import cv2 #pip install opencv-python
import numpy as np #pip install numpy
基于PySimpleGUI库文件实现GUI设计,本项目界面设计较为简单,设计800X400尺寸大小的框图,浅绿色背景,主要由摄像头界面区域和控制按钮区域两部分组成。效果如下所示:
GUI代码如下所示:
#背景色
sg.theme('LightGreen')
#定义窗口布局
layout = [
[sg.Image(filename='', key='image')],
[sg.Radio('None', 'Radio', True, size=(10, 1))],
[sg.Radio('threshold', 'Radio', size=(10, 1), key='thresh'),
sg.Slider((0, 255), 128, 1, orientation='h', size=(40, 15), key='thresh_slider')],
[sg.Radio('canny', 'Radio', size=(10, 1), key='canny'),
sg.Slider((0, 255), 128, 1, orientation='h', size=(20, 15), key='canny_slider_a'),
sg.Slider((0, 255), 128, 1, orientation='h', size=(20, 15), key='canny_slider_b')],
[sg.Radio('contour', 'Radio', size=(10, 1), key='contour'),
sg.Slider((0, 255), 128, 1, orientation='h', size=(20, 15), key='contour_slider'),
sg.Slider((0, 255), 80, 1, orientation='h', size=(20, 15), key='base_slider')],
[sg.Radio('blur', 'Radio', size=(10, 1), key='blur'),
sg.Slider((1, 11), 1, 1, orientation='h', size=(40, 15), key='blur_slider')],
[sg.Radio('hue', 'Radio', size=(10, 1), key='hue'),
sg.Slider((0, 225), 0, 1, orientation='h', size=(40, 15), key='hue_slider')],
[sg.Radio('enhance', 'Radio', size=(10, 1), key='enhance'),
sg.Slider((1, 255), 128, 1, orientation='h', size=(40, 15), key='enhance_slider')],
[sg.Button('Exit', size=(10, 1))]
]
#窗口设计
window = sg.Window('OpenCV实时图像处理',
layout,
location=(800, 400),
finalize=True)
打开电脑内置摄像头,将数据显示在GUI界面上,效果如下所示:
代码如下所示:
#打开内置摄像头
cap = cv2.VideoCapture(0)
while True:
event, values = window.read(timeout=0, timeout_key='timeout')
#实时读取图像
ret, frame = cap.read()
#GUI实时更新
imgbytes = cv2.imencode('.png', frame)[1].tobytes()
window['image'].update(data=imgbytes)
window.close()
进行阈值二值化操作,大于阈值values['thresh_slider']的,使用255表示,小于阈值values['thresh_slider']的,使用0表示,效果如下所示:
代码如下所示:
if values['thresh']:
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2LAB)[:, :, 0]
frame = cv2.threshold(frame, values['thresh_slider'], 255, cv2.THRESH_BINARY)[1]
进行边缘检测,values['canny_slider_a']表示最小阈值,values['canny_slider_b']表示最大阈值,效果如下所示:
代码如下所示:
if values['canny']:
frame = cv2.Canny(frame, values['canny_slider_a'], values['canny_slider_b'])
轮廓检测是形状分析和物体检测和识别的有用工具,连接所有连续点(沿着边界)的曲线,具有相同的颜色或强度,效果如下所示:
代码如下所示:
if values['contour']:
hue = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
hue = cv2.GaussianBlur(hue, (21, 21), 1)
hue = cv2.inRange(hue, np.array([values['contour_slider'], values['base_slider'], 40]),
np.array([values['contour_slider'] + 30, 255, 220]))
cnts= cv2.findContours(hue, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
cv2.drawContours(frame, cnts, -1, (0, 0, 255), 2)
进行高斯滤波,(21, 21)表示高斯矩阵的长与宽都是21,标准差取values['blur_slider'],效果如下所示:
代码如下所示:
if values['blur']:
frame = cv2.GaussianBlur(frame, (21, 21), values['blur_slider'])
色彩空间的转化,HSV转换为BGR,效果如下所示:
代码如下所示:
if values['hue']:
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
frame[:, :, 0] += int(values['hue_slider'])
frame = cv2.cvtColor(frame, cv2.COLOR_HSV2BGR)
增强对比度,使图像中的细节看起来更加清晰,效果如下所示:
代码如下所示:
if values['enhance']:
enh_val = values['enhance_slider'] / 40
clahe = cv2.createCLAHE(clipLimit=enh_val, tileGridSize=(8, 8))
lab = cv2.cvtColor(frame, cv2.COLOR_BGR2LAB)
lab[:, :, 0] = clahe.apply(lab[:, :, 0])
frame = cv2.cvtColor(lab, cv2.COLOR_LAB2BGR)
直接break即可跳出循环。
if event == 'Exit' or event is None:
break
拓展学习:基于Python的人工智能美颜系统
请关注公众号,回复关键字:OpenCV实时图像处理,获取项目资源。
文章浏览阅读4.3k次,点赞9次,收藏47次。此前后端代码只能在本地运行,不能在其他设备,联网访问,而搭建配置服务器后,把项目放在服务器运行,就可以通过服务器来访问我们的项目,如网站,作小程序数据接口等本文采用的是阿里云ECS服务器,可根据自己的需求购买对应性能和使用场景的服务器需要考虑的内容主要有,服务器地域,服务器性能(核心,内存),使用的系统,存储盘购买时间等,笔者配置的是一台双核4G内存,1Mbps带宽,CentOS 8.0 64位,40GB云盘的服务器,可以满足轻量web开发和数据接口需求购买后可以看到服务器的 公网IP ,可以理解_springboot + mysql 怎么开发一个纯后端接口给微信小程序使用
文章浏览阅读264次。MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model),视图(View)和控制器(Controller).通过分层使开发的软件结构更清晰,从而达到开发效率的提高,可维护性和扩展性得到提高.spring提供的MVC框架是在J2EE Web开发中对MVC模式的一个实现,本文通过实例讲解一下Spring MVC 的使用._""
文章浏览阅读669次。利用python读取excel中邮箱进行批量群发,使用中国移动内部邮箱或139邮箱-html编辑的正文并且带附件。_python从表格中读取数据群发邮件
文章浏览阅读1.7k次,点赞2次,收藏2次。一、介绍Sigar全名是SystemInformationGathererAndReporter,中文名是系统信息收集和报表工具。我是一个开源的工具,提供了跨平台的系统信息收集的API,是Hyperic-hq产品的基础包,是HypericHQ主要的数据收集组件。它用来从许多平台收集系统和处理信息。这些平台包括:Linux,Windows,Solaris,AIX,HP-UX,Fr..._org.hyperic..sigar
文章浏览阅读223次。# 默认端口是27017mongo# 指定端口mongo --port 28015# 连接远程主机mongo "mongodb://mongodb0.example.com:28015"mongo --host mongodb0.example.com:28015mongo --host mongodb0.example.com --port 28015# 指定连接..._/?authsource=
文章浏览阅读3.4w次,点赞48次,收藏289次。1.考点归纳一、思考题1数据的预处理包括哪些内容?答:数据的预处理是在对数据分类或分组之前所做的必要处理,内容包括数据的审核、筛选、排序等。(1)数据审核就是检查数据中是否有错误。对于通过调查取得的原始数据,主要从完整性和准确性两个方面去审核;对于通过其他渠道取得的二手数据,则应着重审核数据的适用性和时效性。(2)数据筛选是根据需要找出符合特定条件的某类数据。(3)数据排序是按一定顺序将数据排列,以便研究者通过浏览数据发现一些明显的特征或趋势,找到解决问题的线索。除此之外,排序还有助于对数据检查纠错,_统计学第八版贾俊平课后答案
文章浏览阅读2.3w次,点赞16次,收藏72次。目录1. Visual Studio Installer的安装2.程序安装和部署2.1创建安装项目2.2Application Folder 中添加文件2.3User's Desktop中添加快捷方式2.4添加卸载程序2.5 更多设置2.6 最终设置情况2.7 生成2.8 结果检验天空盒演示程序下载全部代码资源下载所打包的程序为:OpenGL..._visual studio installer
文章浏览阅读3k次,点赞3次,收藏10次。CentOS 配置 sftp 服务_centos sftp
文章浏览阅读1.6k次。目录使用label标签实现点击文字相应文本框获取焦点应用实例具体用法label标签的定义:label标签的作用:代码示例简要文字说明:使用label标签实现点击文字相应文本框获取焦点点击文字,就可以选中单选框或者复选框,亦或者是对应的文本框。应用实例在性别的选择上,对于单选框的选择只有很小一块区域,操作起来不是很方便,为了解决这个问题就可以使用label标签。具体用法label标签的定义:<label>用于为输入控件定义文本标签(label_label获得焦点时弹出图片
文章浏览阅读3.8k次。HOG(Histogram of Oriented Gradients),描述的是图像的局部特征,其命名也暗示了其计算方法,先计算图像中某一区域不同方向上梯度的值,然后累积计算频次,得到直方图,该直方图便可代表该区域了,也即从图像中抽取得到的特征向量,可以作为后续分类器的输入了。_梯度方向描述子
文章浏览阅读2.4k次,点赞2次,收藏9次。Hadoop(四)MapReduce_hadoop java mapreduce
文章浏览阅读1.1w次,点赞6次,收藏36次。存储过程存储过程就是一条或多条SQL语句的集合 当对数据库进行一系列的操作时 存储过程就可以将这些复杂的操作封装成一个代码块 以便重复使用 大大减少了数据库开发人员的工作量创建存储过程创建存储过程的基本语法CREATE PROCEDURE 存储过程名称([存储过程的参数列表])[存储过程的特性]routine_body存储过程的参数列表语法如下([[IN|OUT|INOUT]参数名..._数据库简单的存储过程