深圳餐饮公司网站制作/长沙营销网站建设

深圳餐饮公司网站制作,长沙营销网站建设,网站建设与策划,驻马店重点项目建设网站【1】引言 前序学习了5种阈值处理方法,包括(反)阈值处理、(反)零值处理和截断处理,相关文章链接为: python学opencv|读取图像(三十三)阈值处理-灰度图像-CSDN博客 python学opencv|读取图像(三十四&#…

【1】引言

前序学习了5种阈值处理方法,包括(反)阈值处理、(反)零值处理和截断处理,相关文章链接为:

python学opencv|读取图像(三十三)阈值处理-灰度图像-CSDN博客

python学opencv|读取图像(三十四)阈值处理-彩色图像-CSDN博客

python学opencv|读取图像(三十五)反阈值处理-CSDN博客

python学opencv|读取图像(三十六)(反)零值处理-CSDN博客

python学opencv|读取图像(三十七 )截断处理-CSDN博客

经过对比,会发现零值处理获得的图像效果更为明显。

但实际上,无论是哪种处理方法,内部的阈值开关都是自由设定的,因此,难以确认零值处理是否效果总是相对较好?

这时候,我们刚好发现了一个自适应处理函数:cv.adaptiveThreshold(),这个函数允许图像按照方块大小,逐个做阈值处理,相当于是更为精细化的阈值处理方式。

【2】官网教程

点击下述链接,可以直达cv.adaptiveThreshold()函数的官网教程:

OpenCV: Miscellaneous Image Transformations

在官网,可以看到cv.adaptiveThreshold()函数的参数说明:

图1

具体的参数解释为:

void cv::adaptiveThreshold     (     InputArray     src,  #输入图像
        OutputArray     dst,                                             #输出图像
        double     maxValue,                                           #阈值上限
        int     adaptiveMethod,                                        #自适应方法
        int     thresholdType,                                           #阈值处理方法
        int     blockSize,                                                  #方块大小
        double     C )                                                       #均值或者加权均值减去的常量,一般是正整数

官网指出,自适应放大法adaptiveMethod只有两种选择:cv.THRESH_BINARY和cv.THRESH_BINARY_INV。

【3】代码测试  

cv.adaptiveThreshold()函数只能对灰度图进行自适应处理,这里我们先回忆一下灰度图生成技巧:

python学opencv|读取图像(十一)彩色图像转灰度图的两种办法_opencv读取png图片为灰度图片-CSDN博客

因此我们在设计程序时,也设计了两种灰度图转化方法,以作为对前述学习知识的复习:

 

import cv2 as cv # 引入CV模块
import numpy as np #引入numpy模块# 读取图片-直接转化灰度图
src = cv.imread('srcf.png',0) #读取图像
dst=src#输出图像# 读取图片-函数转化灰度图
src1 = cv.imread('srcf.png') #读取图像
dst1=cv.cvtColor(src1,cv.COLOR_BGR2GRAY) #转化为灰度图dstt=np.hstack((dst,dst1)) #两种灰度图拼接在一起

 由于我们已经知晓了这两种方法转化后的图像效果一样,因此直接进行自适应处理,并且把零值处理加进来做对比:

#自适应处理
dstt1=cv.adaptiveThreshold(src,158,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,5,3) #
dstt2=cv.adaptiveThreshold(src,158,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,5,3) #
dsttv1=cv.adaptiveThreshold(src,158,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY_INV,5,3) #
dsttv2=cv.adaptiveThreshold(src,158,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY_INV,5,3) #
#零值处理
t2,dst2=cv.threshold(src,58,158,cv.THRESH_TOZERO) #零值-阈值开关58,阈值上限158
#dstt3=cv.adaptiveThreshold(src,158,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_TOZERO,5,3) #
dsttt=np.hstack((dstt1,dstt2)) #两种灰度图拼接在一起
dstttv=np.hstack((dsttv1,dsttv2)) #两种灰度图拼接在一起8,cv.THRESH_TOZERO) #零值-阈值开关58,阈值上限158

然后对图像进行呈现和保存:

#阈值和零值处理
#t1,dst1=cv.threshold(src,58,158,cv.THRESH_BINARY) #阈值-阈值开关58,阈值上限158
#t2,dst2=cv.threshold(src,58,158,cv.THRESH_TOZERO) #零值-阈值开关100,阈值上限255#截断处理
#t3,dst3=cv.threshold(src,58,158, cv.THRESH_TRUNC) #截断-阈值开关158,阈值上限200#t2,dst2=cv.threshold(src,100,255,cv.THRESH_TOZERO) #阈值开关100,阈值上限255
#t3,dst3=cv.threshold(src,0,255,cv.THRESH_TOZERO) #阈值开关0,阈值上限255#反阈值和反零值处理
#tt1,dstt1=cv.threshold(src,58,158,cv.THRESH_BINARY_INV) #阈值开关100,阈值上限255
#tt2,dstt2=cv.threshold(src,58,158,cv.THRESH_TOZERO_INV) #阈值开关100,阈值上限255#tt1,dstt1=cv.threshold(src,58,158,cv.THRESH_TOZERO_INV) #阈值开关58,阈值上限158
#tt2,dstt2=cv.threshold(src,100,255,cv.THRESH_TOZERO_INV) #阈值开关100,阈值上限255
#tt3,dstt3=cv.threshold(src,0,255,cv.THRESH_TOZERO_INV) #阈值开关0,阈值上限255#和原图对比
#ttt1=np.hstack((dst,dst1,dst3)) #原图-阈值-截断对比
#ttt2=np.hstack((dst,dst2,dst3)) #原图-零值-截断对比
#ttt3=np.hstack((dst,dstt1,dst3)) #原图-反阈值-截断对比
#ttt4=np.hstack((dst,dstt2,dst3)) #原图-反零值-截断对比
#ttt5=np.hstack((dst,dst1,dst2)) #原图-阈值-零值对比
#ttt6=np.hstack((dst3,dstt1,dstt2)) #截断-反阈值-反零值对比
#ttt7=np.vstack((ttt5,ttt6)) #原图-阈值-零值-截断-反阈值-反零值对比
#展示图像
#cv.imshow('srcft0', dst)  # 在屏幕展示效果
cv.imshow('srcft', dstt)  # 在屏幕展示效果
cv.imshow('srcft2', dst2)  # 在屏幕展示效果
cv.imshow('srcftt1', dsttt)  # 在屏幕展示效果
cv.imshow('srcftt2', dstttv)  # 在屏幕展示效果
#cv.imshow('srcfttv1', dsttv1)  # 在屏幕展示效果
#cv.imshow('srcfttv2', dsttv2)  # 在屏幕展示效果
#cv.imshow('srcftt3', dstt3)  # 在屏幕展示效果
#cv.imshow('srcft3', ttt3)  # 在屏幕展示效果
#cv.imshow('srcft4', ttt4)  # 在屏幕展示效果
#cv.imshow('srcft5', ttt7)  # 在屏幕展示效果
#显示BGR值
#print("原图-dst像素数为[100,100]位置处的BGR=", dst[100, 100])  # 获取像素数为[100,100]位置处的BGR
#print("阈值-dst1像素数为[100,100]位置处的BGR=", dst1[100, 100])  # 获取像素数为[100,100]位置处的BGR
#print("零值-dst2像素数为[100,100]位置处的BGR=", dst2[100, 100])  # 获取像素数为[100,100]位置处的BGR
#print("截断-dst3像素数为[100,100]位置处的BGR=", dst3[100, 100])  # 获取像素数为[100,100]位置处的BGR
print("dstt1像素数为[100,100]位置处的BGR=", dstt1[100, 100])  # 获取像素数为[100,100]位置处的BGR
print("dsttv1像素数为[100,100]位置处的BGR=", dsttv1[100, 100])  # 获取像素数为[100,100]位置处的BGR
print("dstt2像素数为[100,100]位置处的BGR=", dstt2[100, 100])  # 获取像素数为[100,100]位置处的BGR
print("dsttv2像素数为[100,100]位置处的BGR=", dsttv2[100, 100])  # 获取像素数为[100,100]位置处的BGR#print("dstt3像素数为[100,100]位置处的BGR=", dstt3[100, 100])  # 获取像素数为[100,100]位置处的BGR#保存图像
cv.imwrite('srcf-dstt.png', dstt)  # 保存图像
cv.imwrite('srcf-dst1.png', dst2)  # 保存图像
cv.imwrite('srcf-dsttt.png', dsttt)  # 保存图像
cv.imwrite('srcf-dstttv.png', dstttv)  # 保存图像
#cv.imwrite('srcf-ttt1.png', dsttv1)  # 保存图像
#cv.imwrite('srcf-ttt2.png', dsttv2)  # 保存图像
#cv.imwrite('srcf-ttt3.png', dstt3)  # 保存图像
#cv.imwrite('srcf-JC-t3-VC-ttt3.png', ttt3)  # 保存图像
#cv.imwrite('srcf-JC-t3-VC-ttt4.png', ttt4)  # 保存图像
#cv.imwrite('srcf-JC-t3-VC-ttt7.png', ttt7)  # 保存图像
cv.waitKey()  # 图像不会自动关闭
cv.destroyAllWindows()  # 释放所有窗口

此处使用的原始图像为:

图2

转化后的两种灰度图为:

图3 两种方法转化的灰度图

按照自适应转化后的图像为:

图4  左cv.ADAPTIVE_THRESH_MEAN_C右cv.ADAPTIVE_THRESH_GAUSSIAN_C-cv.THRESH_BINARY阈值处理方法

图4显示了cv.ADAPTIVE_THRESH_MEAN_C和cv.ADAPTIVE_THRESH_GAUSSIAN_C应用cv.THRESH_BINARY阈值处理方法获得的两种图像,实际上看不出显著差别。

图5  左cv.ADAPTIVE_THRESH_MEAN_C右cv.ADAPTIVE_THRESH_GAUSSIAN_C-cv.THRESH_BINARY_INV阈值处理方法

图5显示了cv.ADAPTIVE_THRESH_MEAN_C和cv.ADAPTIVE_THRESH_GAUSSIAN_C应用cv.THRESH_BINARY_INV阈值处理方法获得的两种图像,实际上也看不出显著差别。

图4和图5相对来说,因为是按照相反的阈值处理方法,所以在颜色黑白上有明显的差别,相对来说,图4代表的阈值处理方法保存的细节相对更多。

之后大家一起看一下零值处理的图像:

图6 零值处理

相对来说,零值处理保留的细节多,自适应处理保留轮廓更多。

此时的完整代码为(下述代码附带了很多注释,调整“#”出现的位置,可以用来辅助测试其他阈值处理方法):

import cv2 as cv # 引入CV模块
import numpy as np #引入numpy模块# 读取图片-直接转化灰度图
src = cv.imread('srcf.png',0) #读取图像
dst=src#输出图像# 读取图片-函数转化灰度图
src1 = cv.imread('srcf.png') #读取图像
dst1=cv.cvtColor(src1,cv.COLOR_BGR2GRAY) #转化为灰度图dstt=np.hstack((dst,dst1)) #两种灰度图拼接在一起#自适应处理
dstt1=cv.adaptiveThreshold(src,158,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,5,3) #
dstt2=cv.adaptiveThreshold(src,158,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,5,3) #
dsttv1=cv.adaptiveThreshold(src,158,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY_INV,5,3) #
dsttv2=cv.adaptiveThreshold(src,158,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY_INV,5,3) #
#零值处理
t2,dst2=cv.threshold(src,58,158,cv.THRESH_TOZERO) #零值-阈值开关58,阈值上限158
#dstt3=cv.adaptiveThreshold(src,158,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_TOZERO,5,3) #
dsttt=np.hstack((dstt1,dstt2)) #两种灰度图拼接在一起
dstttv=np.hstack((dsttv1,dsttv2)) #两种灰度图拼接在一起
#阈值和零值处理
#t1,dst1=cv.threshold(src,58,158,cv.THRESH_BINARY) #阈值-阈值开关58,阈值上限158
#t2,dst2=cv.threshold(src,58,158,cv.THRESH_TOZERO) #零值-阈值开关100,阈值上限255#截断处理
#t3,dst3=cv.threshold(src,58,158, cv.THRESH_TRUNC) #截断-阈值开关158,阈值上限200#t2,dst2=cv.threshold(src,100,255,cv.THRESH_TOZERO) #阈值开关100,阈值上限255
#t3,dst3=cv.threshold(src,0,255,cv.THRESH_TOZERO) #阈值开关0,阈值上限255#反阈值和反零值处理
#tt1,dstt1=cv.threshold(src,58,158,cv.THRESH_BINARY_INV) #阈值开关100,阈值上限255
#tt2,dstt2=cv.threshold(src,58,158,cv.THRESH_TOZERO_INV) #阈值开关100,阈值上限255#tt1,dstt1=cv.threshold(src,58,158,cv.THRESH_TOZERO_INV) #阈值开关58,阈值上限158
#tt2,dstt2=cv.threshold(src,100,255,cv.THRESH_TOZERO_INV) #阈值开关100,阈值上限255
#tt3,dstt3=cv.threshold(src,0,255,cv.THRESH_TOZERO_INV) #阈值开关0,阈值上限255#和原图对比
#ttt1=np.hstack((dst,dst1,dst3)) #原图-阈值-截断对比
#ttt2=np.hstack((dst,dst2,dst3)) #原图-零值-截断对比
#ttt3=np.hstack((dst,dstt1,dst3)) #原图-反阈值-截断对比
#ttt4=np.hstack((dst,dstt2,dst3)) #原图-反零值-截断对比
#ttt5=np.hstack((dst,dst1,dst2)) #原图-阈值-零值对比
#ttt6=np.hstack((dst3,dstt1,dstt2)) #截断-反阈值-反零值对比
#ttt7=np.vstack((ttt5,ttt6)) #原图-阈值-零值-截断-反阈值-反零值对比
#展示图像
#cv.imshow('srcft0', dst)  # 在屏幕展示效果
cv.imshow('srcft', dstt)  # 在屏幕展示效果
cv.imshow('srcft2', dst2)  # 在屏幕展示效果
cv.imshow('srcftt1', dsttt)  # 在屏幕展示效果
cv.imshow('srcftt2', dstttv)  # 在屏幕展示效果
#cv.imshow('srcfttv1', dsttv1)  # 在屏幕展示效果
#cv.imshow('srcfttv2', dsttv2)  # 在屏幕展示效果
#cv.imshow('srcftt3', dstt3)  # 在屏幕展示效果
#cv.imshow('srcft3', ttt3)  # 在屏幕展示效果
#cv.imshow('srcft4', ttt4)  # 在屏幕展示效果
#cv.imshow('srcft5', ttt7)  # 在屏幕展示效果
#显示BGR值
#print("原图-dst像素数为[100,100]位置处的BGR=", dst[100, 100])  # 获取像素数为[100,100]位置处的BGR
#print("阈值-dst1像素数为[100,100]位置处的BGR=", dst1[100, 100])  # 获取像素数为[100,100]位置处的BGR
#print("零值-dst2像素数为[100,100]位置处的BGR=", dst2[100, 100])  # 获取像素数为[100,100]位置处的BGR
#print("截断-dst3像素数为[100,100]位置处的BGR=", dst3[100, 100])  # 获取像素数为[100,100]位置处的BGR
print("dstt1像素数为[100,100]位置处的BGR=", dstt1[100, 100])  # 获取像素数为[100,100]位置处的BGR
print("dsttv1像素数为[100,100]位置处的BGR=", dsttv1[100, 100])  # 获取像素数为[100,100]位置处的BGR
print("dstt2像素数为[100,100]位置处的BGR=", dstt2[100, 100])  # 获取像素数为[100,100]位置处的BGR
print("dsttv2像素数为[100,100]位置处的BGR=", dsttv2[100, 100])  # 获取像素数为[100,100]位置处的BGR#print("dstt3像素数为[100,100]位置处的BGR=", dstt3[100, 100])  # 获取像素数为[100,100]位置处的BGR#保存图像
cv.imwrite('srcf-dstt.png', dstt)  # 保存图像
cv.imwrite('srcf-dst1.png', dst2)  # 保存图像
cv.imwrite('srcf-dsttt.png', dsttt)  # 保存图像
cv.imwrite('srcf-dstttv.png', dstttv)  # 保存图像
#cv.imwrite('srcf-ttt1.png', dsttv1)  # 保存图像
#cv.imwrite('srcf-ttt2.png', dsttv2)  # 保存图像
#cv.imwrite('srcf-ttt3.png', dstt3)  # 保存图像
#cv.imwrite('srcf-JC-t3-VC-ttt3.png', ttt3)  # 保存图像
#cv.imwrite('srcf-JC-t3-VC-ttt4.png', ttt4)  # 保存图像
#cv.imwrite('srcf-JC-t3-VC-ttt7.png', ttt7)  # 保存图像
cv.waitKey()  # 图像不会自动关闭
cv.destroyAllWindows()  # 释放所有窗口

【4】细节说明

自适应处理函数cv.adaptiveThreshold():

只能处理单通道的灰度图;

阈值处理方法只能选用cv.THRESH_BINARY和cv.THRESH_BINARY_INV两种阈值处理方法。

图7

【5】总结

掌握了python+opencv实现图像自适应处理的技巧。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/67488.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据可视化:让数据讲故事的艺术

目录 1 前言2 数据可视化的基本概念2.1 可视化的核心目标2.2 传统可视化手段 3 数据可视化在知识图谱中的应用3.1 知识图谱的可视化需求3.2 知识图谱的可视化方法 4 数据可视化叙事:让数据讲故事4.1 叙事可视化的关键要素4.2 数据可视化叙事的实现方法 5 数据可视化…

vue | 插值表达式

Vue 是一个用于 构建用户界面 的 渐进式 框架 1. 构建用户界面:基于 数据 动态 渲染 页面 2. 渐进式:循序渐进的学习 3. 框架:一套完整的项目解决方案,提升开发效率↑ (理解记忆规则) 插值表达式: 插值表达式是一种 Vu…

单片机存储器和C程序编译过程

1、 单片机存储器 只读存储器不是并列关系,是从ROM发展到FLASH的过程 RAM ROM 随机存储器 只读存储器 CPU直接存储和访问 只读可访问不可写 临时存数据,存的是CPU正在使用的数据 永久存数据,存的是操作系统启动程序或指令 断电易失 …

二、点灯基础实验

嵌入式基础实验第一个就是点灯,地位相当于编程界的hello world。 如下为LED原理图,要让相应LED发光,需要给I/O口设置输出引脚,低电平,二极管才会导通 2.1 打开初始工程,编写代码 以下会实现BLINKY常亮&…

豆包MarsCode:构造特定数组的逆序拼接

问题描述 思路分析 1. 数组的组成: 我们要根据 i 的不同值拼接出不同长度的子数组。对于每个 i 从 1 到 n,我们要把数字从 n 逆序到 i 拼接成一个子数组。 例如,当 i 1 时,拼接 [n, n-1, ..., 1]。当 i 2 时,拼接 …

RK3588平台开发系列讲解(NPU篇)NPU 驱动的组成

文章目录 一、NPU 驱动组成二、查询 NPU 驱动版本三、查询 rknn_server 版本四、查询 librknn_runtime 版本沉淀、分享、成长,让自己和他人都能有所收获!😄 一、NPU 驱动组成 NPU 驱动版本、rknn_server 版本、librknn_runtime 版本以及 RKNN Toolkit 版本的对应关系尤为重…

论文阅读:CosAE Learnable Fourier Series for Image Restoration

这是 2024 NeurIPS 上发表的一篇文章,介绍了一种新型的基于傅里叶级数的通用编码器。 Abstract 本文介绍了余弦自动编码器(Cosine Autoencoder, CosAE),这是一种新颖的通用自动编码器,它将经典傅里叶级数与前馈神经网…

YOLOv11改进,YOLOv11检测头融合RepConv卷积,并添加小目标检测层(四头检测),适合目标检测、分割等任务

摘要 作者提出了一种简单而强大的卷积神经网络架构,其推理阶段采用与 VGG 类似的网络体结构,仅由一堆 3x3 卷积和 ReLU 组成,而训练阶段的模型具有多分支拓扑。这种训练阶段和推理阶段架构的解耦通过结构重参数化技术实现,因此我们将该模型命名为 RepVGG。 # 理论介绍 Re…

深度学习笔记——循环神经网络RNN

大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细介绍面试过程中可能遇到的循环神经网络RNN知识点。 文章目录 文本特征提取的方法1. 基础方法1.1 词袋模型(Bag of Words, BOW)工作原…

Selenium工具使用Python 语言实现下拉框定位操作

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 我们通常遇到的下拉框有显性的下拉框和隐性的下拉框;有的下拉框还可以进行单选或多选操作,在selenium中如何实现下拉框的定位通常使用selec…

使用 Continue 插件时,发现调用外部地址

https://us.i.posthog.com/e/?ip1&_1737025525924&ver1.163.0&compressiongzip-js 看是一个帮助改善产品的网址。估计类似某推广流量监控的插件工具吧。网上没用查到其他说明,可能国内使用不多的原因。 但是发送的数据看不出来是个什么内容。 我用来搜…

【PyQt】图像处理系统

[toc]pyqt实现图像处理系统 图像处理系统 1.创建阴影去除ui文件 2.阴影去除代码 1.创建阴影去除ui文件 UI文件效果图: 1.1QT Desiger设置组件 1.两个Pushbutton按钮 2.两个label来显示图像 3.Text Browser来显示输出信息 1.2布局的设置 1.先不使用任何La…

【Idea】编译Spring源码 read timeout 问题

Idea现在是大家工作中用的比较多的开发工具,尤其是做java开发的,那么做java开发,了解spring框架源码是提高自己技能水平的一个方式,所以会从spring 官网下载源码,导入到 Idea 工具并编译,但是发现build的时…

Linux 音视频入门到实战专栏(视频篇)视频编解码 MPP

文章目录 一、MPP 介绍二、获取和编译RKMPP库三、视频解码四、视频编码 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍如何调用alsa api来进行音频数据的播放和录制。 一、MPP 介绍 瑞芯微提供的媒体处理软件平台…

爬虫后的数据处理与使用(使用篇--实现分类预测)

()紧接上文,在完成基本的数据处理后,接下来就是正常的使用了。当然怎么用,确实需要好好思考一下~ 上文:爬虫后的数据处理与使用(处理篇) 前言: 一般来说,我…

RabbitMQ--延迟队列

(一)延迟队列 1.概念 延迟队列是一种特殊的队列,消息被发送后,消费者并不会立刻拿到消息,而是等待一段时间后,消费者才可以从这个队列中拿到消息进行消费 2.应用场景 延迟队列的应用场景很多,…

flutter开发-figma交互设计图可以转换为flutter源代码-如何将设计图转换为flutter源代码-优雅草央千澈

flutter开发-figma交互设计图可以转换为flutter源代码-如何将设计图转换为flutter源代码-优雅草央千澈 开发背景 可能大家听过过蓝湖可以转ui设计图为vue.js,react native代码,那么请问听说过将figma的设计图转换为flutter源代码吗?本文优雅草央千澈带…

当设置dialog中有el-table时,并设置el-table区域的滚动,看到el-table中多了一条横线

问题:当设置dialog中有el-table时,并设置el-table区域的滚动,看到el-table中多了一条横线; 原因:el-table有一个before的伪元素作为表格的下边框下,初始的时候已设置,在滚动的时候并没有重新设置…

代理模式实现

一、概念:代理模式属于结构型设计模式。客户端不能直接访问一个对象,可以通过代理的第三者来间接访问该对象,代理对象控制着对于原对象的访问,并允许在客户端访问对象的前后进行一些扩展和处理;这种设置模式称为代理模…

windows 搭建flutter环境,开发windows程序

环境安装配置: 下载flutter sdk https://docs.flutter.dev/get-started/install/windows 下载到本地后,随便找个地方解压,然后配置下系统环境变量 编译windows程序本地需要安装vs2019或更新的开发环境 主要就这2步安装后就可以了&#xff0…