玩转Python图片处理(OpenCV)

news2024/9/24 17:08:20

    OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

   OpenCV-Python是OpenCV的Python的API接口,它拥有OpenCV C++ API的功能,同时也拥有Python语言的特性,可以做到跨平台使用。但值得注意的是在Python3(目前使用的是Python3.7)里对OpenCV-Python接口的中文支持并不是很友好。

安装:

sudo pip3 install opencv-python

直方图模块安装:

pip3 install matplotlib

简单的读取一张图片:

 1 import cv2 #导入opencv库
 2 
 3 #读取一张图片,地址不能带中文
 4 imgviewx=cv2.imread("imgx/zcy.jpg")
 5 
 6 #创建一个窗口,中文显示会出乱码
 7 cv2.namedWindow("东小东标题")
 8 
 9 #显示图片,参数:(窗口标识字符串,imread读入的图像)
10 cv2.imshow("东小东标题",imgviewx)
11 
12 #窗口等待任意键盘按键输入,0为一直等待,其他数字为毫秒数
13 cv2.waitKey(0)
14 
15 #销毁窗口,退出程序
16 cv2.destroyAllWindows()

其它属性详细介绍:

  1 import cv2 #导入opencv库
  2 import numpy as np
  3 
  4 #.........................................................................
  5 #读取一张图片,地址不能带中文
  6 '''
  7 第二个参数,取值可为:
  8 cv2.IMREAD_COLOR:默认参数,读入一副彩色图片,忽略alpha通道 
  9 cv2.IMREAD_GRAYSCALE:读入灰度图片 
 10 cv2.IMREAD_UNCHANGED:读入完整图片,包括alpha通道(png有,jpg无)
 11 '''
 12 #imgviewx=cv2.imread("imgx/wa.jpg")
 13 imgviewx=cv2.imread("imgx/DONG.jpg",cv2.IMREAD_COLOR)
 14 
 15 #.........................................................................
 16 #获取图片信息
 17 #一个像素有三个通道,BGR
 18 print(imgviewx.shape)#输出:(1080, 1920, 3) 高像素,宽像素,通道数
 19 print(imgviewx.size)# 120000  总通道数=高* 宽* 通道数
 20 print(imgviewx.dtype)# uint8  3个通道每个通道占的位数(8位,一个字节)
 21 #print(imgviewx) #输出效果视乎与下条相同
 22 #print(np.array(imgviewx)) #输出每个像素点的参数( B , G , R )
 23 #获取图片 B G R 各均值, #(204.46305102040816, 208.50832244897958, 217.29540408163263, 0.0) ,红色部分最多
 24 print(cv2.mean(imgviewx))
 25 #获取方差,也会打印均值,可用均值方差都为零判断图片无效
 26 #print(cv2.meanStdDev(imgviewx))
 27 
 28 
 29 
 30 #.........................................................................
 31 #图片处理
 32 #备份图片
 33 imgviewx1=imgviewx.copy()
 34 
 35 #均值模糊,主要用于去除图片噪点
 36 #读取图片并实现图片的模糊效果,参数:(读取图片,(X轴方向模糊,Y轴方向模糊))
 37 #imgviewx=cv2.blur(imgviewx,(5,5))
 38 
 39 #中值模糊,主要用于去除椒盐(烧烤配料)噪点
 40 #参数:(图片信息,模糊值)
 41 #imgviewx=cv2.medianBlur(imgviewx,9)
 42 
 43 #普通高斯模糊
 44 #参数:(图片信息,参数1,参数2)参数1和参数2只能设置一个
 45 #imgviewx=cv2.GaussianBlur(imgviewx,(0,0),1)
 46 
 47 #保留边缘(像素差),高斯模糊
 48 #参数(图片信息,0,要用怎样的方式(越大则越细),空间复杂度(越大越复杂))
 49 imgviewx=cv2.bilateralFilter(imgviewx,0,50,6)
 50 
 51 
 52 #美颜,美白效果valuex值越大越白
 53 #valuex=50;
 54 #imgviewx=cv2.bilateralFilter(cv2.imread("imgx/zcy.jpg"),valuex,valuex * 2,valuex / 2)
 55 
 56 #对比度和亮度调整
 57 #duix=0.5 #对比度
 58 #lightx=0  #亮度
 59 #imgviewx=cv2.addWeighted(imgviewx,duix,np.zeros(imgviewx.shape,imgviewx.dtype),1-duix,lightx)
 60 
 61 
 62 
 63 #显示文字
 64 # 参数:图像,文字内容, 坐标( x , y ) ,字体,大小,颜色( B , G ,R ),字体厚度
 65 #颜色值为0-255
 66 font = cv2.FONT_HERSHEY_SIMPLEX  # 定义字体
 67 imgviewx = cv2.putText(imgviewx,"DONG XIAO DONG",(10, 50), font, 1.2, (0, 0, 255), 5)
 68 
 69 
 70 #像素取反
 71 #imgviewx=cv2.bitwise_not(imgviewx)
 72 
 73 
 74 
 75 #遍历图片,效率低,不推荐使用
 76 def xgtp():
 77    global imgviewx
 78    gx,kx,tx=imgviewx.shape#得到像素高度,像素宽度,通道数
 79 
 80    for g in range(0,gx):
 81        for k in range(0,kx):  #这里得到的是每个像素点,每个点由RGB三色构成
 82            if(k>0 and k<100):
 83                imgviewx[g,k,0]=0       # B
 84                imgviewx[g,k,1]=255       #  G
 85                imgviewx[g,k,2]=255        #  R
 86            else:
 87                imgviewx[g, k, 0] = imgviewx[g, k, 0] #获取到原来的值
 88                imgviewx[g, k, 1] = imgviewx[g, k, 1]
 89                imgviewx[g, k, 2] = imgviewx[g, k, 2]
 90 
 91 #创建一个图形,使用np,所以效率高
 92 def cjtx():
 93     # 初始化像素点值全为0 (rgb都为零,所以是黑色)
 94     #参数:([高,宽,通道数],每个通道占的位数(一个字节))
 95     imgx=np.zeros([400,600,3],np.uint8)
 96 
 97     #初始化像素点值为全为1
 98     #imgx[110:130,50:70,2]表示一个范围:[高度起始点:高度结束点,宽度起始点:宽度结束点,哪个通道],起始点均以左上角
 99     #imgx[:,:,0]=np.ones([400,600],np.uint8)*255  #最终结果为第一个通道(B)全为255,所以是蓝色
100     imgx[110:130,50:70,1]=np.ones([20,20],np.uint8)*255
101     cv2.imshow("第二个图形窗口",imgx)
102 
103 #图片区域处理
104 def pictureArea():
105     global imgviewx
106     #得到截图
107     areax=imgviewx[110:529,778:1200]
108     #将图片由RGB(3通道)转换为灰度(2通道)
109     areax=cv2.cvtColor(areax,cv2.COLOR_BGR2GRAY)
110     #将图片有2通道还原成3通道,但色彩不能还原
111     areax2=cv2.cvtColor(areax,cv2.COLOR_GRAY2RGB)
112     #处理后的区域写到原图上
113     imgviewx[110:529, 778:1200]=areax2
114     #显示截图
115     cv2.imshow("area",areax)
116 
117 #泛洪填充,相似像素填充
118 def fill_color():
119     global imgviewx
120     h,w,t=imgviewx.shape
121     #必要参数
122     maskx=np.zeros([h+2,w+2],np.uint8)
123     #参数接收:(图片信息,必要参数,参考点位置坐标,填充的颜色,查找范围:最低像素(参考减所写),查找范围:最高像素(参考加所写),全部填充)
124     cv2.floodFill(imgviewx,maskx,(100,100),(0,255,0),(100,100,100),(50,50,50),cv2.FLOODFILL_FIXED_RANGE)
125 
126 
127 
128 #通道分离与合并
129 def tongdao():
130     global imgviewx
131     b,g,r=cv2.split(imgviewx)#通道分离
132     cv2.imshow("bb",b)#通道图单独显示
133     cv2.imshow("gg",g)
134     cv2.imshow("rr",r)
135 
136     imgviewx[:,:,1]=135 #改变单个通道(0,1,2 => B,G,R)
137     cv2.imshow("chang red ",imgviewx)
138 
139     imgviewx=cv2.merge([b,g,r])#合并通道
140 
141 #像素运算
142 def pixel_operation():
143     #读入两张大小和通道相同的图片
144     img1=cv2.imread("imgx/img1.jpg")
145     img2=cv2.imread("imgx/img2.jpg")
146     print(img1.shape, "=====", img2.shape)
147     # 创建一个大小可调整的窗口
148     cv2.namedWindow("operation", cv2.WINDOW_NORMAL)
149     cv2.imshow("img111", img1)
150     cv2.imshow("img222",img2)
151     #处理图片
152     #像素点相加,如0(黑色),255(白色),0+255=255(白色),超过255还是白色
153     #imgoperation=cv2.add(img1,img2)
154     #像素相减,如0(黑色),255(白色),0-255=-255=0(黑色)
155     #imgoperation=cv2.subtract(img1,img2)
156     #像素相乘,255(白色),0/255=0(黑色)
157     #imgoperation=cv2.divide(img1,img2)
158     #像素相乘,255(白色),0*255=0(黑色)
159     #imgoperation=cv2.multiply(img2,img1)
160     #像素与,二进制与,如0与255为00000000&11111111=00000000
161     imgoperation=cv2.bitwise_and(img1,img2)
162     #像素或
163     imgoperation=cv2.bitwise_or(img1,img2)
164 
165     #显示处理后的图片
166     cv2.imshow("operation", imgoperation)
167 
168 
169 
170 #.......................................................................
171 #视频处理,视频无声音
172 def vediox():
173     ved=cv2.VideoCapture("imgx/vv.mp4")#打开视频
174     while True:
175         ret,tux=ved.read()
176         if ret== False:#判断视频是否播放完毕
177             break
178         else:
179             cv2.imshow("wideo1111",tux)#每帧显示
180             hsv=cv2.cvtColor(tux,cv2.COLOR_BGR2HSV)#转换成HSV图片格式,对颜色敏感
181             lowx=np.array([37,43,46])#表格在后面给出
182             uppx=np.array([77,255,255])
183             # 播放此输出的目标是白色
184             tux2=cv2.inRange(hsv,lowx,uppx)#利用低指和高指匹配延时,所匹配的是绿色
185             #播放此输出的目标是原色
186             tux3 = cv2.bitwise_and(tux,tux, mask=tux2)
187 
188             cv2.imshow("video222",tux3)
189 
190             if 27==cv2.waitKey(20):#按键退出播放
191                 break
192 
193 
194 #.........................................................................
195 #创建一个窗口,中文显示会出乱码,第一个参数为窗口唯一标识字符串
196 #窗口大小可调整,默认参数为c v2.WINDOW_AUTOSIZE 根据图像大小自动创建大小
197 #可建多个
198 cv2.namedWindow("东小东标题",cv2.WINDOW_NORMAL)
199 
200 
201 #.........................................................................
202 #创建鼠标点击事件回调函数,(事件,x轴位置,y轴位置,标记,属性)
203 def drawxxx(event,x,y,flags,param):
204     if event==cv2.EVENT_LBUTTONDOWN:
205         print("鼠标按下",x,y)
206     #elif event==cv2.EVENT_MOUSEMOVE:
207        # print("鼠标滑动")
208     elif event==cv2.EVENT_LBUTTONUP:
209         print("鼠标抬起")
210 
211 #注册鼠标监听事件(窗口,回调函数)
212 cv2.setMouseCallback("东小东标题",drawxxx)
213 
214 #.........................................................................
215 t1=cv2.getTickCount()#利用cpu时间......
216 #xgtp()#调用图片像素遍历函数
217 #cjtx()#调用创建图形函数
218 #vediox()#调用视频处理函数
219 #tongdao()#通道处理
220 #pixel_operation()#像素点的加减乘除等处理
221 #pictureArea()#图片区域处理
222 #fill_color()#泛洪填充,相似像素填充
223 t2=cv2.getTickCount()
224 timesx=(t2-t1)/cv2.getTickFrequency()
225 print("花费时间:%s 毫秒"%(timesx*1000))
226 
227 
228 #显示图片,参数:(窗口唯一标识字符串,imread读入的图像)
229 #可以不基于窗口,可建多个
230 cv2.imshow("东小东标题",imgviewx)
231 
232 
233 #.........................................................................
234 #将图片保存,写入到文件
235 cv2.imwrite("2.jpg",imgviewx)
236 
237 
238 
239 #.........................................................................
240 #窗口退出
241 #窗口等待任意键盘按键输入,0为一直等待,其他数字为毫秒数
242 #等待时间到则返回-1,如有键盘按键按下则返回按键的ASCII码
243 #可使用print(cv2.waitKey(0))获取该按键值
244 keyx=cv2.waitKey(0)
245 print(keyx)
246 if keyx==27:
247     print("你按下了键盘的:ESC键")
248 
249 #.........................................................................
250 #销毁窗口,退出程序
251 cv2.destroyAllWindows()

模拟实现一个简单的拍照程序:

 1 import cv2            #导入opencv库
 2 import numpy as np
 3 
 4 #调用摄像头
 5 def videox():
 6     vix=cv2.VideoCapture(0) #打开摄像头
 7     while True:
 8         ret,tu=vix.read()    # ret为返回值,tu为当前帧
 9         tu1=cv2.flip(tu,1)   #图像反转,1为左右对换,-1为上下对换
10         cv2.imshow("东小东标题",tu1)  #显示图片在窗口上
11         if 65==cv2.waitKey(10):        #等待大写 A 键盘按键按下
12             cv2.imwrite("DONG.jpg",tu1)#保存停止帧图片
13             break
14 
15 cv2.namedWindow("东小东标题")#创建一个窗口,中文显示会出乱码问题
16 
17 videox()  #调用摄像头函数
18 
19 print(cv2.waitKey(0))#等待任意键按下,并输出该按键的值
20 
21 cv2.destroyAllWindows()#销毁窗口

直方图基本:

import cv2 #导入opencv库
import numpy
#直方图均衡化,对比度改变
def equalization_rgb(imgtu):
    #只能使用灰度图片
    imgx=cv2.cvtColor(imgtu,cv2.COLOR_RGB2GRAY)#转换为灰度

    #默认参数,自接使用
    #imgtu=cv2.equalizeHist(imgx)#均衡化

    #可修改参数clipLimit的值得到不一样效果
    chanlx=cv2.createCLAHE(clipLimit=30.0,tileGridSize=(8,8))
    imgtu=chanlx.apply(imgx)

    cv2.imshow("equalization",imgtu)#显示


#直方图比较,图片相似度比较,遍历像素点,速度慢慢
def create_compara(imgtu):
    h,w,t=imgtu.shape
    rgbx=numpy.zeros([16*16*16,1],numpy.float32)
    bsize=256/16
    for row in range(h):
        for col in range(w):
            b=imgtu[row,col,0]
            g=imgtu[row,col,1]
            r=imgtu[row,col,2]
            index=numpy.int(b/bsize)*16*16+numpy.int(g/bsize)*16+numpy.int(r/bsize)
            rgbx[numpy.int(index),0]=rgbx[numpy.int(index),0]+1
    return rgbx

def compare_ing():
    img1=cv2.imread("imgx/xxG.png")
    img2=cv2.imread("imgx/xxR.png")
    hist1=create_compara(img1)
    hist2=create_compara(img2)
    cv2.imshow("img1111",img1)
    cv2.imshow("img2222",img2)
    va1=cv2.compareHist(hist1,hist2,cv2.HISTCMP_BHATTACHARYYA)
    va2=cv2.compareHist(hist1,hist2,cv2.HISTCMP_CORREL)
    va3=cv2.compareHist(hist1,hist2,cv2.HISTCMP_CHISQR)
    print("巴氏距离,越小越相似(0,1):",va1)
    print("相关性,越接近于1,越相似:",va2)
    print("卡方,越小越相似:",va3)


#读取一张图片,地址不能带中文
imgviewx=cv2.imread("imgx/zcy.jpg")

#创建一个窗口,中文显示会出乱码
cv2.namedWindow("东小东标题")

#显示图片,参数:(窗口标识字符串,imread读入的图像)
cv2.imshow("东小东标题",imgviewx)

#------------------
#equalization_rgb(imgviewx)#直方图均衡化,提高对比度
compare_ing()#直方图比较,图片相似度

#-------------------

#窗口等待任意键盘按键输入,0为一直等待,其他数字为毫秒数
cv2.waitKey(0)

#销毁窗口,退出程序
cv2.destroyAllWindows()

模板匹配:

 1 import cv2 #导入opencv库
 2 
 3 #参数:(要寻找的目标,原图片)
 4 def templatex(img_target,img_root):
 5 
 6     #模板匹配方法
 7     #toolx=cv2.TM_SQDIFF_NORMED
 8     toolx=cv2.TM_CCORR_NORMED
 9     #toolx=cv2.TM_CCOEFF_NORMED
10 
11     h,w=img_target.shape[:2]#获取目标图像的高和宽
12     #操作匹配
13     result=cv2.matchTemplate(img_root,img_target,toolx)
14     #得到区域
15     min_x,max_x,min_y,max_y=cv2.minMaxLoc(result)
16 
17     #获取起始点坐标
18     if toolx==cv2.TM_SQDIFF_NORMED:
19         tl=min_y
20     else:
21         tl=max_y
22     #获取结束点坐标,其中tl[0]表示起始点x轴值,tl[1]表示y
23     br=(tl[0]+w,tl[1]+h)
24     #创建一个矩形框,参数(要写到的图片,起始点坐标,结束点坐标,颜色值,厚度)
25     cv2.rectangle(img_root,tl,br,(0,0,255),5)
26     #显示图片
27     cv2.imshow("img_rootxx",img_root)
28 
29 
30 
31 #读取一张图片,地址不能带中文
32 imgviewx=cv2.imread("imgx/wa.jpg")
33 
34 #创建一个窗口,中文显示会出乱码
35 cv2.namedWindow("东小东标题",cv2.WINDOW_NORMAL)
36 
37 #获取原图片截图
38 areax = imgviewx[110:529, 778:1200]
39 cv2.imshow("jjjttt",areax)
40 
41 templatex(areax,imgviewx)
42 
43 
44 #显示图片,参数:(窗口标识字符串,imread读入的图像)
45 cv2.imshow("东小东标题",imgviewx)
46 
47 #窗口等待任意键盘按键输入,0为一直等待,其他数字为毫秒数
48 cv2.waitKey(0)
49 
50 #销毁窗口,退出程序
51 cv2.destroyAllWindows()

二值化,黑白图片:

 1 import cv2 #导入opencv库
 2 
 3 #读取一张图片,地址不能带中文
 4 imgviewx=cv2.imread("imgx/wa.jpg")
 5 
 6 #创建一个窗口,中文显示会出乱码
 7 cv2.namedWindow("东小东标题")
 8 
 9 imgviewx2=imgviewx.copy()
10 #得到灰度图片
11 imgviewx2=cv2.cvtColor(imgviewx2,cv2.COLOR_BGR2GRAY)
12 #二值化图像,黑白图像,只有0和1,0为0,1为255
13 ret,imgviewx2=cv2.threshold(imgviewx2,0,255,cv2.THRESH_BINARY|cv2.THRESH_OTSU)
14 #二值化方法2
15 imgviewx2=cv2.adaptiveThreshold(imgviewx2,200,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,25,5)
16 
17 
18 #显示图片,参数:(窗口标识字符串,imread读入的图像)
19 cv2.imshow("img222222",imgviewx2)
20 cv2.imshow("东小东标题",imgviewx)
21 
22 #窗口等待任意键盘按键输入,0为一直等待,其他数字为毫秒数
23 cv2.waitKey(0)
24 
25 #销毁窗口,退出程序
26 cv2.destroyAllWindows()

 附录:

HSV取值对应表:

树莓派(2018-06-27-raspbian-stretch.img)安装需要的依赖包:

sudo apt-get install libatlas-base-dev

sudo apt-get install libjasper-runtime

sudo pip3 install opencv-contrib-python

sudo apt-get install libhdf5-dev

sudo apt-get install libhdf5-serial-dev

sudo apt install libqtgui4

sudo apt install libqt4-test

sudo apt-get install libcv-dev

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

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

相关文章

Qt扫盲-QLabel使用总结

QLabel使用总结一、QLabel 显示内容二、注意事项1. 格式注意2. 不保留先前状态3. 格式对齐4. 伙伴焦点三、信号和槽函数使用1. 信号2. 槽函数总结&#xff1a;QLabel 其实就是一个用来只读显示的简易控件。适合数据量很小的内容显示。QLabel用于显示 文本或图像。 不提供用户交…

深度学习之目标检测通用技巧

深度学习之目标检测通用技巧深度学习之目标检测通用技巧深度学习之目标检测通用技巧 一 数据增强 1.离线增强 离线增强:对数据集进行处理&#xff0c;数据的数目会变成增强因子原数据集的数目 2.在线增强 对输入模型的batch的数据进行增强&#xff0c;如旋转、平移、翻折等…

今天给大家介绍一篇基于SSM的教材管理系統的设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

【Tensorflow学习三】神经网络搭建八股“六步法”编写手写数字识别训练模型

神经网络搭建八股“六步法”编写手写数字识别训练模型Sequential用法model.compile(optimizer优化器,loss损失函数,metrics["准确率"])model.fitmodel.summery六步法搭建鸢尾花分类网络class搭建具有非顺序网络结构MNIST数据集Fashion MNIST数据集用Tensorflow API:t…

java计算机毕业设计基于安卓Android的掌上酒店预订APP

项目介绍 网络的广泛应用给生活带来了十分的便利。所以把掌上酒店预订与现在网络相结合,利用java技术建设掌上酒店预订APP,实现掌上酒店预订的信息化。则对于进一步提高掌上酒店预订发展,丰富掌上酒店预订经验能起到不少的促进作用。 掌上酒店预订APP能够通过互联网得到广泛的…

基于风能转换系统的非线性优化跟踪控制(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清…

一、CDD在诊断开发中的作用

本专栏将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希望能对大家有所帮助,与大家共同成长,早日成为一名车载诊断、通信全栈工程师。 本文介绍CDD在诊断开发中的作用,欢迎各位朋友订阅、评论,可以提…

如何评价模型的好坏?

回归&#xff1a; MSE&#xff08;均方误差&#xff09;—— 判定方法&#xff1a;值越小越好&#xff08;真实值-预测值&#xff0c;平方之后求和平均&#xff09;RMSE&#xff08;均根方误差&#xff09;—— 判定方法&#xff1a;值越小越好&#xff08;MSE开根号&#xff…

Dijkstra最短路径算法

参考&#xff1a;(3条消息) Dijkstra算法图文详解_一叶执念的博客-CSDN博客_迪杰斯特拉算法 如图&#xff0c;假设图中共有n条路径&#xff08;如D-C-E&#xff09;&#xff0c;根据路径长度进行小到大排序。 1、起点到达某终点的距离是无穷符号&#xff0c;表示该起点还需要借…

27岁到来之际,我在阿里实现了年薪40W+的小目标

顺着大佬的思路&#xff0c;我分析了自己的实际水平和状况&#xff1a; 1、技术不精不成体系&#xff1a;技术能力浮于表面&#xff0c;对底层逻辑和架构不了解&#xff0c;也不知道如何系统化进行学习; 2、遇到职场瓶颈期&#xff1a;站在3年职场的分水岭上&#xff0c;没有…

Linux网络原理及编程(8)——第十八节 数据链路层

目录 1、MAC地址 2、MAC帧 3、MAC帧协议 4、MTU 5、ARP请求和应答 各位好&#xff0c;博主新建了个公众号《自学编程村》&#xff0c;拉到底部即可看到&#xff0c;有情趣可以关注看看哈哈&#xff0c;关注后还可以加博主wx呦~~~&#xff08;公众号拉到底部就能看到呦~~&a…

基于java+springmvc+mybatis+jsp+mysql的新冠肺炎疫苗接种管理系统

项目介绍 新冠疫苗接种管理系统&#xff0c;在网站首页可以查看首页&#xff0c;疫苗信息&#xff0c;疫苗资讯 &#xff0c;个人中心&#xff0c;后台管理&#xff0c;在线客服等内容&#xff0c;并进行详细操作。管理员登录进入系统可以查看首页&#xff0c;个人中心&#x…

vue自定义keepalive组件的问题解析

前一阵来了一个新的需求&#xff0c;要在vue项目中实现一个多开tab页面的功能&#xff0c;本来心想&#xff0c;这不简单嘛就是一个增加按钮重定向吗&#xff1f;&#xff08;当然如果这么简单我就不写这个文章了&#xff09;。很快写完&#xff0c;提交测试。测试大哥很快就提…

一份奇奇怪怪的地图设计书

地图设计书 地图设计是通过研究实验制定新编地图的内容、表现形式及其生产工艺程序的工作&#xff0c;是地图制图学各种活动的中心&#xff0c;贯穿整个地图制图过程。本设计选择了福建省龙岩市作为研究区域&#xff0c;并结合相应区域的土地利用类型、水系、道路等数据&#…

儿童剧本杀行业是好生意吗?剧本杀门店管理系统

红楼梦、西游记、水浒传、三国演义是中国四大名著&#xff0c;几乎每个中国人上到70岁老人&#xff0c;下到十岁小学生都知道&#xff0c;同时还有花木兰、包青天、八仙过海等故事也都耳濡目染&#xff0c;小说描述的淋漓尽致&#xff0c;影视剧老戏骨们将每个角色刻画的深入人…

spring-aop源码分析(3)完结_执行流程分析

本文详细介绍Spring AOP的执行阶段流程。 Cglib代理的代理拦截逻辑在DynamicAdvisedInterceptor中&#xff0c;JDK代理的拦截逻辑在JdkDynamicAopProxy中&#xff0c;本文将从这两个类入手分析Spring AOP的执行阶段流程。 DynamicAdvisedInterceptor private static class D…

Modbus数据采集方案

目录 目标 Modbus协议简介 配置界面以及实例 概述 modbus协议应该是工业行业应用最广泛的协议&#xff0c;由于其协议简单、通讯标准、扩展性强的特点&#xff0c;被各个行业大量的应用。作为通讯网关机来说&#xff0c;设计一个便捷易懂的配置方式显得尤其重要。本方案基于…

多模态中的指令控制(InstructPix2Pix,SayCan)

InstructPix2Pix: Learning to Follow Image Editing Instructions 图像的语言指令生成。目的是遵循人工指令去编辑图像&#xff0c;即给定输入图像和一个如何编辑它的文本指令&#xff0c;模型尝试遵循这些指令来编辑图像。 这份论文与现有基于文本的图像编辑工作们最大的不同…

【JVM】方法区与永久代、元空间之间的关系

方法区与永久代、元空间之间的关系 方法区是JVM规范中定义的一块内存区域&#xff0c;用来存储类元数据、方法字节码、即时编译器需要的信息等 永久代是Hotspot虚拟机对JVM规范的实现(1.8之前) 元空间是Hotspot虚拟机对JVM规范的实现(1.8以后&#xff09;&#xff0c;使用本地…

java基于springboot高校学报论文在线投稿系统-计算机毕业设计

项目介绍 在新发展的时代&#xff0c;众多的软件被开发出来&#xff0c;给用户带来了很大的选择余地&#xff0c;而且人们越来越追求更个性的需求。在这种时代背景下&#xff0c;高校只能以工作人员为导向&#xff0c;以稿件的持续创新作为高校最重要的竞争手段。 系统采用了J…