人工智能理论之opencv图像预处理、数据库、GUI布局的综合应用(图像预处理版块)

文章目录

  • 前言
  • 图像预处理
    • 卷积核概念
    • 图像平滑处理
      • 高斯滤波
    • 双边滤波
    • 中值滤波
    • Canny边缘检测
    • 图像形态学操作
    • 形态学梯度
    • 顶帽
    • 小结
  • 图片预处理
    • 1.引入库
  • 图像预处理
    • 错误尝试
    • 成功运行
  • 总结


前言

对前面学习综合应用的总结,不单是一个版块,而是三个版块综合到一起可以完成的智能系统的运用。
例如`以 pysimpleGui 作为界面 ,设计一个基于图像或者视频的识别系统,题目自定
要求:
1 要用到图像预处理操作
2 设计的业务逻辑尽量用到数据库操作

作为新手小白,完成这个练习写了一天半的代码,在AI辅助和同学的帮助下,依然没能完整完成一个合理运行的代码。接下来我会重新迅速过一遍关于之前的重点,并且每一个部分的难点和易错点进行分享,最后再分析我的源代码(出现的问题是可以运行GUI界面但是没办法进行数据库的链接,相当是只有形式)

目前定的题目和内容为车库车牌智能识别


图像预处理

在这部分我遇到的包括图片、文件路径的填充地址,包括对图像选择处理的方式都是只有简单的理解并没有很充足的认识,目前我们从最开始的代码一步一步进行回顾。
首先我们要明白为什么会有图像预处理,主要目的是为了改善图像质量、提取有用信息、减少冗余数据,从而提高后续处理的效率和准确性。如果我们要智能分析的对象(基于生活)不可能只有我们需要的数据,所以这就是我们第一步进行预处理的原因

卷积核概念

这一点在实际运用提到的地方不少,卷积核大小,一般为奇数
如:33、55、7*7
保证锚点在中间,防止位置发生偏移,在具体代码中很有很重要的涉及,不然在图像预处理总会出现图片有误的情况
卷积核大小,越大看到信息越多,提取特征和计算量也更大,在我自己第一次编写相关代码的时候,就出现偶数对于照片提取也有极大的限制。

图像平滑处理

希望对各种应用方式处理的原理,可以理解对哪种情况采用哪种处理方式,更加让我们去理解处理的原因,而不是生硬的去记住
首先我们要明白为什么会有图像平滑处理这一步。图像中必定有噪声,而图像中的噪声区别于平时听到的声音,可以理解为图像中聒噪的、干扰的“声音“更加专业的解释为图像数据中的不必要的或多余的干扰信息。它妨碍了人们通过视觉器官接收信息的理解。噪声在理论上可以定义为“不可预测,只能用概率统计方法来认识的随机误差”。因此,将图像噪声看成是多维随机过程是合适的,描述噪声的方法可以借用随机过程的描述,即用其概率分布函数和概率密度分布函数。
对图像噪声的分类我们也可以主要分为两个部分,外部噪声和内部噪声。外部噪声主要由外部环境因素引起,如光线变化、电磁干扰等。内部噪声则是由于设备本身的因素引起,如传感器噪声等。
这种种的说法我们更可以明白的是图像噪声的存在严重影响了图像的质量,使得我们视觉能接收到的信息变得模糊和不清晰,为了减少图中的噪声,可以采取一些更加专业的图像处理技术,接下来我们要做的便是图像降噪
而图像平滑处理(高斯滤波、中值滤波、双边滤波)则可以让我们由于各种拍摄外部环境引起的噪点,或者内部因素引起的噪点进行减少。

高斯滤波

应用场景却不包括这些:

  1. 去除高斯噪声: 高斯滤波可以有效地去除高斯噪声,因为该滤波器在计算像素值时会对周围像素进行加权平均,从而抑制噪声的影响。
  2. 模糊处理: 由于高斯滤波会平均周围像素的值,因此它也可用于实现图像的模糊处理,例如在某些需求下需要模糊化处理的图像或区域。
  3. 提取大致轮廓: 由于高斯滤波会平滑图像细节,因此在一定程度上可以帮助提取图像的大致轮廓和结构特征。
    采用的函数为cv2.GaussianBIUER
    有三个参数(图像,高斯核的大小(通常以元组的形式进行指定width,height),高斯核在方向上的标准差)
import cv2
img = cv2.imread("images/renwu01.jpeg")
# 定义高斯核大小和标准差
ksize = (9, 9)
sigma = 3# 对图像进行高斯模糊处理
blurred_image = cv2.GaussianBlur(img, ksize, sigma)# 显示原始图像和滤波后的图像cv2.imshow('old Image', img)
cv2.imshow('new Image', blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

双边滤波

适用于各种类型的图像,特别适合于那些需要平滑处理但仍保留边缘细节的图像,例如人脸识别,图像增加和图像去噪等领域
使用函数 cv2.bilateralFilter 可以对图像保持边缘清晰的同时也对图像进行平滑处理。
四个参数,(图像,滤波器的直径d,颜色空间的标准差sigmaColor,sigmaspace)
sigmaColor较大时候处理范围较大,但是图像细节信息丢失更多,较小时候,会选择颜色差异较小的像素进行平滑处理,更好保留边缘细节。
sigmaspace较大时候,更大空间被平滑处理,细节被进一步平滑,反之相反。

import cv2
img = cv2.imread("images/renwu02.png")
# 定义滤波器参数
d =30
sigmaColor = 100
sigmaSpace = 150# 对图像进行双边滤波处理
filtered_image = cv2.bilateralFilter(img, d, sigmaColor, sigmaSpace)# 显示原始图像和滤波后的图像cv2.imshow('old Image', img)
cv2.imshow('new Image', filtered_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

中值滤波

图像处理中常用的一种平滑滤波方法,其主要作用是去除图像中的胡椒噪声或其他类型的脉冲噪声。通过中值滤波可以有效地将这些异常值去除,从而使图像变得更加平滑
中值滤波适用于各种类型的图像,特别适用于那些受到椒盐噪声干扰的图像。
函数为cv2.medianBlur() 图像进行中值滤波处理,去除图像中的斑点噪声

import cv2
img = cv2.imread("images/hujiao.png")# 对图像进行高斯模糊处理
blurred_image = cv2.medianBlur(img,5)# 显示原始图像和滤波后的图像cv2.imshow('old Image', img)
cv2.imshow('new Image', blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
总结一下:高斯滤波重在模糊效果,双边滤波重在美颜效果,中值滤波虽然处理人物图像某些情况跟高斯滤波的情况视觉相差不大,但是如果遇到带有高斯噪音的情况,高斯滤波可以很好的处理,而中值滤波会破坏照片自然。而碰到带有含椒盐噪声的人物图像,高斯模糊会会使边缘也进行模糊,而中值滤波能有效果处理噪声并且保持图像的边缘和细节。
仅个人理解,欢迎大家讨论。

Canny边缘检测

适用于图像处理、计算机视觉和机器学习中的物体识别。图像分割等。
基本上在边缘检测之前先对图像进行灰度处理,理解有这几个方面:
1、首先如果是彩色图像,为三通道(R,G,B),而灰色为单通道,显著减少数据量和计算复杂度。
2、许多边缘检测法(Canny)都是基于灰度图像进行设计的。
3、彩色图像中的颜色信息会干扰边缘检测,当颜色变化与实际边缘无关的时候,灰度图像只关注亮度变化,更容易检测真正的边缘。灰度图像中保留亮度信息,并且直方图均衡化等方法进一步增强对比度,使得边缘化更加明显。
使用函数为cv2.Canny(图像,第一个阈值(边缘检测的低阈值),第二个阈值(边缘检测的高阈值))

  1. 低阈值
    • 低阈值用来识别可能的边缘像素。如果一个像素的梯度值大于低阈值,那么这个像素可能会被认为是边缘的一部分。
    • 但是,单独依靠低阈值来识别边缘是不够的,因为它可能会导致很多虚假的边缘被识别出来,特别是那些由于噪声引起的边缘。
  2. 高阈值
    • 高阈值用于识别强烈的边缘像素。如果一个像素的梯度值大于高阈值,那么这个像素几乎可以肯定是边缘的一部分。
    • 高阈值的存在可以有效地减少由于噪声引起的虚假边缘。
import cv2# 读取并转换为灰度图
image = cv2.imread("images/car.png")
# 将图像从BGR到灰度图像的转换
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 应用 Canny 边缘检测
edges = cv2.Canny(image, 50, 80)
# 显示结果
cv2.imshow('边缘检测', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

这里是有无灰度转化后进行处理的对比,上图是经过处理后的对比。
在这里插入图片描述

在这里插入图片描述

图像形态学操作

这里就不太常对几个方法进行详细阐述,更多的是通过是我自己的理解,有想了解的伙伴可以去前面笔记查看更加详细的了解。
腐蚀操作:cv2.erode(图像,定义结构元素[类型: 结构元素(核),是一个二维数组。说明: 核定义了腐蚀操作的邻域范围。通常是一个正方形矩阵,如 np.ones((3, 3), np.uint8) 表示一个3x3的全1矩阵] ),iterations 腐蚀重复操作次数)
膨胀:cv2.dilate(图像、定义结构类型( 结构元素(核),是一个二维数组。
说明: 核定义了膨胀操作的邻域范围。通常是一个正方形矩阵,如 np.ones((5, 5), np.uint8) 表示一个5x5的全1矩阵),iterations膨胀重复操作次数)
开运算:先腐蚀后膨胀,cv2.morphologyEx(图像,cv2.MORPH_OPEN,kernel[一个5x5的全1矩阵,用于定义开运算的邻域范围。])
闭运算:先膨胀后腐蚀,cv.2morphologyEx(图像,cv2.MORPH_CLOSE,kernel)
对于开闭运算结果差别:假设你有一张包含小噪声点和小孔洞的图像:
开运算:处理后的图像会去除小噪声点,使对象边界更加平滑。
闭运算:处理后的图像会填补小孔洞,使对象更加完整。
总结
开运算:适用于去除小噪声点和断开连接的对象。
闭运算:适用于填补小孔洞和连接接近的对象。

形态学梯度

计算膨胀后的图像与腐蚀后的图像之间的差值来得到的,可以突出物体的边缘。
形态学梯度= 原图-腐蚀的图
kernel = np.ones((9, 9), np.uint8)
cv2.morphologyEx(图像,cv2.MORPH_GRADIENT,kernel)

import cv2
import numpy as np# 读取图像
img = cv2.imread("images/xtx.gif")
# 定义结构元素
kernel = np.ones((9, 9), np.uint8)
# 执行腐蚀操作
eroded = cv2.morphologyEx(img, cv2.MORPH_GRADIENT,kernel)
# 显示结果
cv2.imshow('Original Image', img)
cv2.imshow('Eroded Image', eroded)
cv2.waitKey(0)
cv2.destroyAllWindows()

这里是新旧图的对比,可以看到通过操作让图形形态有更加明确的标记。
在这里插入图片描述

顶帽

顶帽: 原图减去开运算,得到大图形外的小图形
cv2.morphologyEX(img,cv2.MORPH_TOPHAT,kernel)
kernel = np.ones((7, 7), np.uint8)

import cv2
import numpy as np# 读取图像
img = cv2.imread("images/kai.jpg")
# 定义结构元素
kernel = np.ones((7, 7), np.uint8)
# 执行腐蚀操作
eroded = cv2.morphologyEx(img, cv2.MORPH_TOPHAT,kernel)
# 显示结果
cv2.imshow('Original Image', img)
cv2.imshow('Eroded Image', eroded)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
黑帽则是与顶帽相反的操作
kernel = np.ones((7, 7), np.uint8)
cv2.morphologylogyEx(img,cv2.MORPH_BALCKHAT,kernel)
在OpenCV中,形态学操作(如腐蚀、膨胀、开运算、闭运算等)使用的核(kernel)并没有默认值。你需要根据具体的应用需求手动定义核的形状和大小。核的选择对形态学操作的结果有很大影响,因此合理选择核是非常重要的。
使用具体情况可以根据图像继续采纳。

小结

通过对基本概念的整理,我们基本可以清晰的明确使用方法和使用情况,当然还有裁剪大小的这些在具体代码使用中再进行汇总和说明,接下来便开始车牌处理系统的中的预处理部分。

图片预处理

1.引入库

代码如下(示例):

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import  ssl
ssl._create_default_https_context = ssl._create_unverified_context

图像预处理

第一步尝试,在经过两个小时的调试后还是有很大的问题,如果大家想直接找到成功代码请移步第二步

错误尝试

import cv2
import numpy  as np
from PIL import Image
import os

首先想好我们需要的库,计算机视觉处理所以选择有import cv2、关于数组的计算和运用有import numpy as np 、还有广泛的文件格式支持和图像处理方法有
from PIL import Image、使用os模块来遍历文件夹的所有图片文件。
接下来是我对自己代码的一些思考和逻辑的总结
首先是对imread的说明,imread确实是可以读取,但是只是单张图片而不是一个文件夹,本文相当于要读取一个文件的图片,首先要明确,上次我预处理中所面对的对象不清晰,导致数据库也不能及时的读到刷新的数据。还有就是文件命名的问题使用自己通俗易懂的文件方便区别和防止后面逻辑的编写错误。

def process_images(file_path):file_path = "C://Users//LENOVO//Desktop//opencv//car"#获取文件夹内所有的文件名,列出指定文件夹内的所有文件名,并存储在列表 file_names 中.file_names = os.listdir(file_path)#过滤出图片文件(假设文件扩展名为 .png 或 .jpg)#使用列表推导式从file_names中筛选出扩展名为.png或.jpg的文件名,储存在image_filesimage_files = [file for file in file_names if file.endswith('.png') or file.endswith('.jpg')]#使用 os.path.join 将文件夹路径 folder_path 和文件名 image_file 拼接成完整的文件路径 image_pathfor image_file in image_files:#构建完整的文件路径image_path = os.path.join(file_path,image_file)#读取图片img = cv2.imread(image_path)if img is None:print(f"运行失败:{image_path}")continue #持续进行处理下一个文件

成功运行

在经过了两个小时的调试,最终在这样的方法下无法做出来,这也对于每个代码人不可或缺经过的错误尝试,后面通过掩模的方式我成功将车牌识别的功能成功完成先一步一步为大家解答。

import cv2
import os
import paddlehub as hub
import numpy as np
from myocr.MyUtile import demo01

这里针对于demo01的说明

import paddlehub as hubdef identify(img):ocr = hub.Module(name='chinese_ocr_db_crnn_server')rs = ocr.recognize_text(images=[img])return rs[0]['data'][0]['text']

需要了解的可以查看我前面对于ocr文字识别模型的讲解,这里是将需要文字调试先进行填写包。
在遇到的问题也遇到调用不到包的时候我则使用了调用代码

def demo01(image):if image is None:return "None"try:ocr = hub.Module(name='chinese_ocr_db_crnn_server')rs = ocr.recognize_text(images=[image])if rs and rs[0]['data']:return rs[0]['data'][0]['text']return "Not recognized"except Exception as e:print(f"Error in demo01: {e}")return "Error"

进行检查测试,最终才进行调用,所以很大的一个收获是我们要学会及时的对当前写的代码进行检查。

import cv2
import os
import paddlehub as hub
import numpy as np
from myocr.MyUtile import demo01
#进行图片预处理
#定义一个函数为process_images file_path作为一个占位符,代表所有图片存在的文件夹
def demo01(image):if image is None:return "None"try:ocr = hub.Module(name='chinese_ocr_db_crnn_server')rs = ocr.recognize_text(images=[image])if rs and rs[0]['data']:return rs[0]['data'][0]['text']return "Not recognized"except Exception as e:print(f"Error in demo01: {e}")return "Error"
def process_images(file_path):# 初始化OCR模块ocr = hub.Module(name="chinese_ocr_db_crnn_server")#获取文件夹内所有的文件名,列出指定文件夹内的所有文件名,并存储在列表 file_names 中.file_names = os.listdir(file_path)#过滤出图片文件(假设文件扩展名为 .png 或 .jpg)#使用列表推导式从file_names中筛选出扩展名为.png或.jpg的文件名,储存在image_filesimage_files = [file for file in file_names if file.endswith('.png') or file.endswith('.jpg')]#使用 os.path.join 将文件夹路径 folder_path 和文件名 image_file 拼接成完整的文件路径 image_pathfor image_file in image_files:#构建完整的文件路径image_path = os.path.join(file_path,image_file)#读取图片img = cv2.imread(image_path)if img is None:print(f"运行失败:{image_path}")continue #持续进行处理下一个文件# 把图像转换成HSV空间hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)print(f"HSV image shape: {hsv_img.shape}")# 获取蓝色所在的HSV范围lower = np.array([100, 100, 50])upper = np.array([140, 255, 255])# 创建掩膜mask = cv2.inRange(hsv_img, lower, upper)# 把图像转换成灰度图像ret, t_img = cv2.threshold(mask, 20, 255, cv2.THRESH_BINARY)print(f"Threshold image shape: {t_img.shape}")# 检测轮廓contours, _ = cv2.findContours(t_img, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)# 把图像转换成BGR图像bgr_img = cv2.cvtColor(t_img, cv2.COLOR_GRAY2BGR)# 画出检测的轮廓的点out_img = cv2.drawContours(bgr_img, contours, -1, (0, 255, 0), 1)cai_img = None# 处理每个轮廓for contour in contours:x, y, w, h = cv2.boundingRect(contour)if w > 100 and h > 50:# 画出轮廓cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 1)cai_img = img[y:y + h, x:x + w]if cai_img is None or cai_img.size == 0:print(f"Invalid cropped image at ({x}, {y}, {w}, {h})")continue# 调用OCR识别函数rs = demo01(cai_img)print(f"车牌号码是: {rs}")# 显示处理后的图像cv2.imshow("Processed Image", img)cv2.waitKey(0)cv2.destroyAllWindows()# 示例:调用函数处理指定目录下的图片
process_images(r"C:\Users\LENOVO\Desktop\opencv\car")

完整的代码以及我写的相关笔记都在注释行,首先收获很大的就是对于路径参数的使用,虽然之前会读取图片,可是在代码逻辑中对于参数赋值的情况形参实参的运用,作为新手的我总会有点小问题,本次对于图片路径和文件路径的书写逻辑有了进步。第二就是对于调试有了深刻认识,我想作为每一个代码人绕不开的弯,对于知识的应用都是我在前面笔记有书写的,在综合运用的时候书写的注意点要进行适当的总结。

总结

由于新手的独立第一次完成项目,可能遇到的问题错误点较多,放在一篇笔记中会有点看花眼,影响阅读和学习的感受,所以每一篇笔记更新一个版块。大家有想交流沟通和指正的可以和我多进行讨论,下一篇更新有关数据库的联动的知识。

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

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

相关文章

Nginx(编译)+Lua脚本+Redis 实现自动封禁访问频率过高IP

1.安装lua 1.1安装LuaJIT yum install readline-devel mkdir -p lua-file cd lua-file/ wget https://github.com/LuaJIT/LuaJIT/archive/refs/tags/v2.0.5.tar.gz tar -zxvf LuaJIT-2.0.5.tar.gz cd LuaJIT-2.0.5 make && make install PREFIX/usr/local/luajit 1.2…

【python程序】恢复曾经删除的QQ说说

是否还能想起曾经的QQ说说,是否还想知道自己以前删除了什么 今天就给大家介绍下这个可以恢复以前删除的QQ说说的 小工具 这个工具是由python编写的,也已经打包好了小程序,一键运行 具体下载地址:https://pan.quark.cn/s/b3f41e3…

【统计子矩阵——部分前缀和+双指针】

题目 代码 #include <bits/stdc.h> using namespace std; typedef long long ll; const int N 510; int s[N][N]; int main() {ios::sync_with_stdio(0);cin.tie(0);int n, m, k;cin >> n >> m >> k;for(int i 1; i < n; i)for(int j 1; j <…

Java版——设计模式笔记

Java版——设计模式笔记 设计模式的分类 创建型模式&#xff08;Creational&#xff09;&#xff1a;关注对象的实例化过程&#xff0c;包括了如何实例化对象、隐藏对象的创建细节等。常见的创建型模式有单例模式、工厂模式、抽象工厂模式等。结构型模式&#xff08;Structur…

多语言电商系统的多语言设计机制

在全球化电商市场中&#xff0c;跨语言沟通是提升用户体验和扩大市场份额的关键。为了满足不同语言用户的需求&#xff0c;构建一个支持多语言的电商系统已成为企业扩展国际市场的重要步骤。多语言电商系统需要能够根据用户的语言偏好自动显示内容&#xff0c;同时保证翻译的准…

【Steam登录】protobuf协议逆向 | 续

登录接口&#xff1a; ‘https://api.steampowered.com/IAuthenticationService/BeginAuthSessionViaCredentials/v1’ 精准定位&#xff0c;打上条件断点 this.CreateWebAPIURL(t) ‘https://api.steampowered.com/IAuthenticationService/BeginAuthSessionViaCredentials/v1…

Python | Leetcode Python题解之第556题下一个更大元素III

题目&#xff1a; 题解&#xff1a; class Solution:def nextGreaterElement(self, n: int) -> int:x, cnt n, 1while x > 10 and x // 10 % 10 > x % 10:cnt 1x // 10x // 10if x 0:return -1targetDigit x % 10x2, cnt2 n, 0while x2 % 10 < targetDigit:c…

Python——数列1/2,2/3,3/4,···,n/(n+1)···的一般项为Xn=n/(n+1),当n—>∞时,判断数列{Xn}是否收敛

没注释的源代码 from sympy import * n symbols(n) s n/(n1) print(数列的极限为&#xff1a;,limit(s,n,oo))

Java基础——类和对象的定义链表的创建,输出

目录 什么是类&#xff1f; 什么是对象? 如何创建链表&#xff1f; 尾插法&#xff1a; 头插法&#xff1a; 输出链表的长度 输出链表的值 什么是类&#xff1f; 创建Java程序必须创建一个类class. .java程序需要经过javac指令将文件翻译为.class字节码文件&#xff0c…

python代码打包exe文件(可执行文件)

一、exe打包 1、构建虚拟环境 conda create -n env_name python3.8 #env_name,python根据自己需求修改2、保存和安装项目所需的所有库 pip freeze > requirements.txt3、虚拟环境安装项目包、库 pip install -r requirements.txt4、安装pyinstaller pip install pyinst…

【Linux】冯诺依曼体系结构

目录 一、冯诺依曼体系结构二、冯诺依曼体系结构的基本组成三、关于冯诺依曼体系结构的一些问题结尾 一、冯诺依曼体系结构 冯诺依曼体系结构&#xff0c;也称为普林斯顿结构&#xff0c;是现代计算机设计的基础框架。这一体系结构由数学家冯诺依曼在20世纪40年代提出&#xf…

图像信号处理器(ISP,Image Signal Processor)详解

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 图像信号处理器&#xff08;ISP&#xff0c;Image Signal Processor&#xff09; 是专门用于处理图像信号的硬件或处理单元&#xff0c;广泛应用于图像传感器&#xff08;如 CMOS 或 CCD 传感器&a…

英飞凌Aurix2G TC3XX GPT12模块详解

英飞凌Aurix2G TC3XX GPT12模块详解 本文主要介绍英飞凌 Aurix2G TC3XX系列芯片GPT12模块硬件原理、MCAL相关配置和部分代码实现。 文章目录 英飞凌Aurix2G TC3XX GPT12模块详解1 模块介绍2 功能介绍2.1 结构2.2 独立运行模式2.2.1 定时器模式2.2.2 门控定时器模式2.2.3 计数…

Python小白学习教程从入门到入坑------第二十九课 访问模式(语法进阶)

目录 一、访问模式 1.1 r 1.2 w 1.3 1.3.1 r 1.3.2 w 1.3.3 a 1.4 a 一、访问模式 模式可做操作若文件不存在是否覆盖r只能读报错-r可读可写报错是w只能写创建是w可读可写创建是a只能写创建否&#xff0c;追加写a可读可写创建否&#xff0c;追加写 1.1 r r&…

【Linux】Linux入门实操——vim、目录结构、远程登录、重启注销

一、Linux 概述 1. 应用领域 服务器领域 linux在服务器领域是最强的&#xff0c;因为它免费、开源、稳定。 嵌入式领域 它的内核最小可以达到几百KB, 可根据需求对软件剪裁&#xff0c;近些年在嵌入式领域得到了很大的应用。 主要应用&#xff1a;机顶盒、数字电视、网络…

十三:java web(5)-- Spring数据持久层

目录 Spring 数据持久层 1. Spring 与 JDBC 1.1 使用 Spring 管理数据库连接 1.1.2 Apache Commons DBCP 基于配置文件xml 使用 1.1.3 Apache Commons DBCP 基于配置类使用 1.1.4 HikariCP 基于配置文件xml 使用 推荐使用 Spring Boot 默认连接池 1.1.5 HikariCP 基于配置…

uniApp之uni-file-picker使用踩坑

标题党~也不算坑吧 就是初体验 上传是需要存储一下子的&#xff0c;我以为uniApp是自己免费开的服务给大家中转使用&#xff0c;就没管这个事&#xff0c;但是官网是这么说的&#xff1a; 就我是怎么发现的&#xff0c;使用了一段时间后&#xff0c;上传的图片都裂了&#xff…

开源竞争-大数据项目期末考核

开源竞争&#xff1a; 自己没有办法完全掌握技术的时候就开源这个技术&#xff0c;培养出更多的技术依赖&#xff0c;让更多人完善你的技术&#xff0c;那么这不就是在砸罐子吗&#xff1f;一个行业里面总会有人砸罐子的&#xff0c;你不如先砸还能听个想。 客观现实&#xf…

Flutter3.22.2中SliverAppBar设置背景色滑动显示颜色错误

在使用Flutter项目开发中&#xff0c;可能会有页面需要滑动收起标题栏的效果&#xff0c;一般都会使用SliverAppBar来实现&#xff0c;当项目的Flutter的SDK版本升级到3.4后&#xff0c;发现使用了SliverAppBar的页面&#xff0c;在滑动过程中&#xff0c;标题栏和状态栏的颜色…

SpringBoot3中swagger无法使用

前言 springboot 3开始javax包改成了jakarta&#xff0c;而swagger-oas等包中依然使用的是javax&#xff0c;所以报错。另外springfox已经停止更新有段时间了&#xff0c;并且不支持OpenAPI 3标准&#xff0c;升级Springboot 3.0以后会有更多问题暴露出来。而SpringBoot 3只支…