opencv实战---物体尺寸测量

物体尺寸测量的思路是找一个确定尺寸的物体作为参照物,根据已知的计算未知物体尺寸。

如下图所示,绿色的板子尺寸为220*300(单位:毫米),通过程序计算白色纸片的长度。

目录

1、相关库

2、读图+图片预处理

3、寻找轮廓

4、找到参照物的轮廓,并且进行图像矫正

5、结束 

完整代码:

实时实现物体尺寸计算代码:


 

1、相关库

opencv-python==4.2.0.34

numpy==1.21.6

2、读图+图片预处理

这一步就很常规的处理了。

为了看到图片所有的样子,所以进行resize一下。接下来进行灰度化+高斯模糊+canny边缘检测。然后为了加强边缘进行闭运算。

开运算:先腐蚀后膨胀。用来消除小物体,平滑边界,断开物体之间的粘连。

闭运算:先膨胀后腐蚀。用来填充物体内的小空洞,连接断开的轮廓线。

## 读图
path = '1.jpg'
img = cv2.imread(path)
## 图片预处理
# 由于原图太大,就按比例缩小。比例为0.18
img = cv2.resize(img, (0,0),None,0.18,0.18)    
imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)   # 灰度化
imgBlur = cv2.GaussianBlur(imgGray, (5,5), 1)     # 高斯模糊
imgCanny = cv2.Canny(imgBlur,100,100)     # 边缘检测
kernel = np.ones((5,5))
imgDial = cv2.dilate(imgCanny,kernel,iterations=3) # 膨胀
imgThre = cv2.erode(imgDial,kernel,iterations=2)   # 腐蚀

imgThre结果: 

3、寻找轮廓

# 寻找所有的外轮廓
contours, hiearchy = cv2.findContours(imgThre, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
finalCountours = []
minArea = 1000
filter = 4
# 遍历找到的轮廓
for i in contours:area = cv2.contourArea(i)  # 轮廓的面积if area > minArea:  # 如果大于设置的最小轮廓值,就往下走peri = cv2.arcLength(i, True)  # 封闭轮廓的长度approx = cv2.approxPolyDP(i, 0.02 * peri, True)  # 封闭轮廓曲线拐点坐标bbox = cv2.boundingRect(approx)  # 找到轮廓的最小矩形if filter > 0:  # 需不需要根据拐点个数进行过滤轮廓if len(approx) == filter:  # 拐点个数,面积,拐点坐标,边界框,轮廓finalCountours.append([len(approx), area, approx, bbox, i])else:finalCountours.append([len(approx), area, approx, bbox, i])
# 将轮廓从大到小进行排列
finalCountours = sorted(finalCountours,key=lambda x:x[1] , reverse=True)  if draw:  # 是否要画出来轮廓for con in finalCountours:cv2.drawContours(img,con[4],-1,(0,0,255),3)

找到图像中的外轮廓

  • 函数findContours()常用参数含义:第一个为输入图像,一般是二值图像。CV_RETR_EXTERNAL表示只检测外轮廓。CV_CHAIN_APPROX_SIMPLE表示保留该方向的终点坐标,也就是拐点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息

遍历每个轮廓:

  • 求每个轮廓的面积,如果面积大于阈值,就进行下一步(滤掉那些小的不重要的轮廓)
  • 函数arcLength():计算轮廓的周长。参数:第一个为图像轮廓点集合;第二个表示轮廓是否封闭的
  • 函数approxPolyDP():对图像轮廓进行多边形拟合。参数:第一个为图像轮廓点集合;第二个表示输出的精度,通俗来说,就是原本的曲线与拟合的曲线之间的最大距离;第三个表示轮廓是否封闭的。返回值是拐点坐标
  • 函数boundingRect():计算轮廓的垂直边界最小矩形。找到闭合曲线对应的最小矩形
  • 是否需要根据拐点个数进行过滤轮廓。如果需要的话,如果是曲线拐点个数等于过滤器设置的拐点个数,那就将这个曲线的拐点个数、面积、拐点坐标、曲线的最小矩阵作为一个元组存进finalCountours里。不需要过滤器的话,那就直接把这些东西放进finalCountours里。

将轮廓从大到小排列:

  • 函数sorted():排列顺序。参数:第一个为可排序的对象;key为自定义指标进行排序;reverse排序规则,True为降序,False为升序(默认)
  • 函数lambda:一种没有名字的函数。函数名是返回结果,一般用来定义简单的函数。
  • ----lambda x:x[1]           第一个x表示列表的第一个元素,这里表示finalCountours中的元组,x是形参,可以用任意字母代替。x[1]代表元组里的第二个元素,在这里也就是area。所以,key=lambda x:x[1]代表根据area的大小进行排序。
  • 判断是否画出来轮廓。遍历降序排列之后的finalCountours,根据里面的每个元组(一个元组代表一个轮廓)的第五个元素,即i画出来轮廓。颜色为(0,0,255),红色。

画出来的结果: 

 

为了方便,将预处理和寻找轮廓写成一个方法,以供后续调用。方法参数:图像,边缘检测阈值,是否展示边缘检测后的图像(默认为不展示),最小面积(默认为1000),过滤器的拐点大小(默认为0),是否画最后的轮廓(默认为不画)。返回值:图像+存放有每个轮廓的拐点个数、面积、拐点位置、边界框、轮廓的finalCountours

def getContours(img, cThr=[100,100], showCanny=False, minArea=1000, filter=0, draw=False):imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)imgBlur = cv2.GaussianBlur(imgGray, (5,5), 1)imgCanny = cv2.Canny(imgBlur,cThr[0],cThr[1])kernel = np.ones((5,5))imgDial = cv2.dilate(imgCanny,kernel,iterations=3)imgThre = cv2.erode(imgDial,kernel,iterations=2)if showCanny:cv2.imshow('Canny',imgThre)# 寻找所有的外轮廓contours,hiearchy = cv2.findContours(imgThre,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)finalCountours = []# 遍历找到的轮廓for i in contours:area = cv2.contourArea(i)   # 轮廓的面积if area > minArea:          # 如果大于设置的最小轮廓值,就往下走peri = cv2.arcLength(i,True)    # 封闭的轮廓的长度approx = cv2.approxPolyDP(i,0.02*peri,True)    # 封闭轮廓的拐点bbox = cv2.boundingRect(approx)   # 找到边界框if filter > 0:   # 需不需要根据拐点个数进行过滤轮廓if len(approx)==filter:    # 拐点个数,面积,拐点位置,边界框,轮廓finalCountours.append([len(approx),area,approx,bbox,i])else:finalCountours.append([len(approx), area, approx, bbox, i])finalCountours = sorted(finalCountours,key=lambda x:x[1] , reverse=True)   # 根据轮廓大小进行从大到小的排序if draw:  # 是否要画出来轮廓for con in finalCountours:cv2.drawContours(img,con[4],-1,(0,0,255),3)return img,finalCountours

4、找到参照物的轮廓,并且进行图像矫正

# 找到最大轮廓,也就是绿色板子的位置
if len(finalCountours)!=0:biggest = finalCountours[0][2]   # 最大轮廓的曲线拐点位置

因为已经将finalCountours进行排序了,finalCountours[0]就是最大的轮廓,也就是绿色板子的位置。finalCountours[0][2]也就是approx,曲线拐点位置坐标。

接下来就是图像矫正了。想要变成如下图所示的样子。

# 图像矫正的方法
def warpImg(img,points,w,h,pad=20):points = reorder(points)pts1 = np.float32(points)pts2 = np.float32([[0,0],[w,0],[0,h],[w,h]])matrix = cv2.getPerspectiveTransform(pts1,pts2)imgWrap = cv2.warpPerspective(img,matrix,(w,h))return imgWrap

主要的函数是getPerspectiveTransform和warpPerspective。

  • 函数getPerspectiveTransform():由四对点计算透射变换。参数:输入图像的四边形顶点坐标pts1;输出图像的相应的四边形顶点坐标pts2。从而得到一个3*3的变换矩阵。pts1就是绿色板子四个点的坐标了,也就是biggest。pts2的坐标,根据最终要的形式来看,左上角的顶点需要变成(0,0),再根据绿色板子的宽和高,就可以推算出四个点的位置了。
  • 函数warpPerspective():对图像进行透视变换。参数:需要变换的原始图像;变换矩阵;输出图像的大小。

了解了什么是图像矫正,那就开始想办法得到这些参数:原始图像,pts1,pts2。原始图像已知,pts2已知(绿色板子作为参照物,宽和高是已知的),虽然表面上pst1好像就是biggest,但biggest的四个点的坐标顺序不是按照下图所示进行排序的,所以pts1需要进一步的处理。

 

左上角1的点,横坐标和纵坐标之和肯定是最小的那个;右下角4的点横坐标和纵坐标之和肯定是最大的那个;右上角2的点,它的差分是最小的;左下角3的点,差分是最大的。

所以书写一个方法,将轮廓坐标按顺序重新排列。

# 将轮廓拐点重新排列的方法
def reorder(myPoints):myPointsNew = np.zeros_like(myPoints)myPoints = myPoints.reshape((4,2))add = myPoints.sum(1)myPointsNew[0] = myPoints[np.argmin(add)]myPointsNew[3] = myPoints[np.argmax(add)]diff = np.diff(myPoints,axis=1)myPointsNew[1] = myPoints[np.argmin(diff)]myPointsNew[2] = myPoints[np.argmax(diff)]return myPointsNew

调用方法。wP为绿板的宽度220,hP为绿板的高度300。

imgWrap = warpImg(img, biggest, wP, hP)

结果发现会出现蓝色箭头所示的边缘地区没有填充满。

 所以用pad进行填充。 加入图像矫正的方法里。得到这一步理想的结果。

imgWrap = imgWrap[pad:imgWrap.shape[0]-pad,pad:imgWrap.shape[1]-pad]

5、结束 

找到纸片的位置,用线条框出,拐点重新排序。这些步骤和前面一致。

imgContours2, conts2 = utils.getContours(imgWrap, minArea=2000, filter=4, cThr=[50,50])if len(conts)!=0:for obj in conts2:cv2.polylines(imgContours2,[obj[2]],True,(0,255,0),2)nPoints = utils.reorder(obj[2])

nPoints为每个轮廓重新排序后的四个拐点坐标。

计算纸片宽度和高度。根据勾股定理,计算斜边的长度。用方法表示:

def findDis(pts1,pts2):return ((pts2[0]-pts1[0])**2 + (pts2[1]-pts1[1])**2)**0.5

 

 调用该方法,转换成厘米为单位,然后保留一位小数:

nW = round((findDis(nPoints[0][0],nPoints[1][0])/10),1)
nH = round((findDis(nPoints[0][0],nPoints[2][0])/10),1)

创建箭头:

cv2.arrowedLine(imgContours2, (nPoints[0][0][0],nPoints[0][0][1]),(nPoints[1][0][0],nPoints[1][0][1]),(255,0,255),3,8,0,0.05)
cv2.arrowedLine(imgContours2, (nPoints[0][0][0],nPoints[0][0][1]),(nPoints[2][0][0],nPoints[2][0][1]),(255,0,255),3,8,0,0.05)

 把尺寸也标上去:

x,y,w,h = obj[3]
cv2.putText(imgContours2,'{}cm'.format(nW),(x+30,y-10),cv2.FONT_HERSHEY_COMPLEX_SMALL,1,(255,0,255),2)
cv2.putText(imgContours2, '{}cm'.format(nH), (x - 70, y + h // 2), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (255, 0, 255), 2)

最终结果:

 

完整代码:

其中scale主要也是想让矫正后的图片能显示得大点。后面用绿板的尺寸计算纸片的时候再除回去的。

import cv2
import numpy as npimport cv2
import numpy as npscale = 2
wP = 220*scale
hP = 300*scaledef getContours(img, cThr=[100,100], showCanny=False, minArea=1000, filter=0, draw=False):imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)imgBlur = cv2.GaussianBlur(imgGray, (5,5), 1)imgCanny = cv2.Canny(imgBlur,cThr[0],cThr[1])kernel = np.ones((5,5))imgDial = cv2.dilate(imgCanny,kernel,iterations=3)imgThre = cv2.erode(imgDial,kernel,iterations=2)if showCanny:cv2.imshow('Canny',imgThre)# 寻找所有的外轮廓contours,hiearchy = cv2.findContours(imgThre,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)finalCountours = []# 遍历找到的轮廓for i in contours:area = cv2.contourArea(i)   # 轮廓的面积if area > minArea:          # 如果大于设置的最小轮廓值,就往下走peri = cv2.arcLength(i,True)    # 封闭的轮廓的长度approx = cv2.approxPolyDP(i,0.02*peri,True)    # 封闭轮廓的拐点bbox = cv2.boundingRect(approx)   # 找到边界框if filter > 0:   # 需不需要根据拐点个数进行过滤轮廓if len(approx)==filter:    # 拐点个数,面积,拐点位置,边界框,轮廓finalCountours.append([len(approx),area,approx,bbox,i])else:finalCountours.append([len(approx), area, approx, bbox, i])finalCountours = sorted(finalCountours,key=lambda x:x[1] , reverse=True)   # 根据轮廓大小进行从大到小的排序if draw:  # 是否要画出来轮廓for con in finalCountours:cv2.drawContours(img,con[4],-1,(0,0,255),3)return img,finalCountours# 四个点是随机的,于是重新排序
def reorder(myPoints):myPointsNew = np.zeros_like(myPoints)myPoints = myPoints.reshape((4,2))add = myPoints.sum(1)myPointsNew[0] = myPoints[np.argmin(add)]myPointsNew[3] = myPoints[np.argmax(add)]diff = np.diff(myPoints,axis=1)myPointsNew[1] = myPoints[np.argmin(diff)]myPointsNew[2] = myPoints[np.argmax(diff)]return myPointsNewdef warpImg(img,points,w,h,pad=20):# print(points)points = reorder(points)pts1 = np.float32(points)pts2 = np.float32([[0,0],[w,0],[0,h],[w,h]])matrix = cv2.getPerspectiveTransform(pts1,pts2)imgWrap = cv2.warpPerspective(img,matrix,(w,h))imgWrap = imgWrap[pad:imgWrap.shape[0]-pad,pad:imgWrap.shape[1]-pad]return imgWrapdef findDis(pts1,pts2):return ((pts2[0]-pts1[0])**2 + (pts2[1]-pts1[1])**2)**0.5path = '1.jpg'
img = cv2.imread(path)
img = cv2.resize(img, (0, 0), None, 0.18, 0.18)
img, conts = getContours(img, minArea=8000, filter=4)
if len(conts) != 0:biggest = conts[0][2]  # 最大轮廓的拐点位置# print(biggest)imgWrap = warpImg(img, biggest, wP, hP)imgContours2, conts2 = getContours(imgWrap, minArea=2000, filter=4, cThr=[50, 50])if len(conts) != 0:for obj in conts2:cv2.polylines(imgContours2, [obj[2]], True, (0, 255, 0), 2)nPoints = reorder(obj[2])nW = round((findDis(nPoints[0][0] // scale, nPoints[1][0] // scale) / 10), 1)nH = round((findDis(nPoints[0][0] // scale, nPoints[2][0] // scale) / 10), 1)# 创建箭头cv2.arrowedLine(imgContours2, (nPoints[0][0][0], nPoints[0][0][1]), (nPoints[1][0][0], nPoints[1][0][1]),(255, 0, 255), 3, 8, 0, 0.05)cv2.arrowedLine(imgContours2, (nPoints[0][0][0], nPoints[0][0][1]), (nPoints[2][0][0], nPoints[2][0][1]),(255, 0, 255), 3, 8, 0, 0.05)x, y, w, h = obj[3]cv2.putText(imgContours2, '{}cm'.format(nW), (x + 30, y - 10), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1,(255, 0, 255), 2)cv2.putText(imgContours2, '{}cm'.format(nH), (x - 70, y + h // 2), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1,(255, 0, 255), 2)cv2.imshow('background', imgContours2)cv2.imshow('Original', img)
cv2.waitKey(0)

实时实现物体尺寸计算代码:

注意:必须有参照物在,不然实现不了。

放方法的程序utils.py:

import cv2
import numpy as npdef getContours(img, cThr=[100,100], showCanny=False, minArea=1000, filter=0, draw=False):imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)imgBlur = cv2.GaussianBlur(imgGray, (5,5), 1)imgCanny = cv2.Canny(imgBlur,cThr[0],cThr[1])kernel = np.ones((5,5))imgDial = cv2.dilate(imgCanny,kernel,iterations=3)imgThre = cv2.erode(imgDial,kernel,iterations=2)if showCanny:cv2.imshow('Canny',imgThre)# 寻找所有的外轮廓contours,hiearchy = cv2.findContours(imgThre,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)finalCountours = []# 遍历找到的轮廓for i in contours:area = cv2.contourArea(i)   # 轮廓的面积if area > minArea:          # 如果大于设置的最小轮廓值,就往下走peri = cv2.arcLength(i,True)    # 封闭的轮廓的长度approx = cv2.approxPolyDP(i,0.02*peri,True)    # 封闭轮廓的拐点bbox = cv2.boundingRect(approx)   # 找到边界框if filter > 0:   # 需不需要根据拐点个数进行过滤轮廓if len(approx)==filter:    # 拐点个数,面积,拐点位置,边界框,轮廓finalCountours.append([len(approx),area,approx,bbox,i])else:finalCountours.append([len(approx), area, approx, bbox, i])finalCountours = sorted(finalCountours,key=lambda x:x[1] , reverse=True)   # 根据轮廓大小进行从大到小的排序if draw:  # 是否要画出来轮廓for con in finalCountours:cv2.drawContours(img,con[4],-1,(0,0,255),3)return img,finalCountours# 四个点是随机的,于是重新排序
def reorder(myPoints):myPointsNew = np.zeros_like(myPoints)myPoints = myPoints.reshape((4,2))add = myPoints.sum(1)myPointsNew[0] = myPoints[np.argmin(add)]myPointsNew[3] = myPoints[np.argmax(add)]diff = np.diff(myPoints,axis=1)myPointsNew[1] = myPoints[np.argmin(diff)]myPointsNew[2] = myPoints[np.argmax(diff)]return myPointsNewdef warpImg(img,points,w,h,pad=20):# print(points)points = reorder(points)pts1 = np.float32(points)pts2 = np.float32([[0,0],[w,0],[0,h],[w,h]])matrix = cv2.getPerspectiveTransform(pts1,pts2)imgWrap = cv2.warpPerspective(img,matrix,(w,h))imgWrap = imgWrap[pad:imgWrap.shape[0]-pad,pad:imgWrap.shape[1]-pad]return imgWrapdef findDis(pts1,pts2):return ((pts2[0]-pts1[0])**2 + (pts2[1]-pts1[1])**2)**0.5

主程序:

import cv2
import numpy as np
import utils########################################webcam = False
path = '1.jpg'
cap = cv2.VideoCapture(0)
cap.set(10,160)   # 改变亮度
cap.set(3,680)    # 改变宽度
cap.set(4,1080)   # 改变高度
scale = 2
wP = 220*scale
hP = 300*scalewhile True:if webcam:success,img = cap.read()    # 如果webCam为True,那就打开摄像头else:img = cv2.imread(path)           # 否则就读图片img = cv2.resize(img, (0,0),None,0.18,0.18)img, conts = utils.getContours(img,minArea=8000,filter=4)if len(conts)!=0:biggest = conts[0][2]   # 最大轮廓的拐点位置# print(biggest)imgWrap = utils.warpImg(img, biggest, wP, hP)imgContours2, conts2 = utils.getContours(imgWrap, minArea=2000, filter=4, cThr=[50,50])if len(conts)!=0:for obj in conts2:cv2.polylines(imgContours2,[obj[2]],True,(0,255,0),2)nPoints = utils.reorder(obj[2])nW = round((utils.findDis(nPoints[0][0]//scale,nPoints[1][0]//scale)/10),1)nH = round((utils.findDis(nPoints[0][0]//scale,nPoints[2][0]//scale)/10),1)# 创建箭头cv2.arrowedLine(imgContours2, (nPoints[0][0][0],nPoints[0][0][1]),(nPoints[1][0][0],nPoints[1][0][1]),(255,0,255),3,8,0,0.05)cv2.arrowedLine(imgContours2, (nPoints[0][0][0],nPoints[0][0][1]),(nPoints[2][0][0],nPoints[2][0][1]),(255,0,255),3,8,0,0.05)x,y,w,h = obj[3]cv2.putText(imgContours2,'{}cm'.format(nW),(x+30,y-10),cv2.FONT_HERSHEY_COMPLEX_SMALL,1,(255,0,255),2)cv2.putText(imgContours2, '{}cm'.format(nH), (x - 70, y + h // 2), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (255, 0, 255), 2)cv2.imshow('background', imgContours2)cv2.imshow('Original',img)cv2.waitKey(1)

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

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

相关文章

python-opencv尺寸测量

原文:python-opencv尺寸测量_Krasjet_Yu.的博客-CSDN博客_python尺寸测量 首先,利用机器视觉来测定零件尺寸,我们能够直接得到的是图片的像素,要想获得尺寸大小,我们必须找到像素和实际尺寸间的关系。 我们在这里定义…

用Cmake build OpenCV后,在VS中查看OpenCV源码的方法(环境VS2022+openCV4.8.0) Part III

用Cmake build OpenCV后,在VS中查看OpenCV源码的方法(环境VS2022openCV4.8.0) Part III 用Cmake build OpenCV后,在VS中查看OpenCV源码的方法(环境VS2022openCV4.8.0) Part I_松下J27的博客-CSDN博客 用Cmake build OpenCV后&…

理解HTTPS/TLS/SSL(一)基础概念+配置本地自签名证书

文章目录 没有HTTPS时的样子场景模拟WireShark的Capture Filter和Display Filter设置Capture Filter启动程序设置Display Filter过滤抓到的包 结论 关于为什么加密更简洁有力的回答对称加密和非对称加密和CA证书密钥交换对称加密非对称加密CA机构和证书如何解决客户端和CA机构之…

顺序表链表OJ题(1)——【LeetCode】

W...Y的主页 😊 代码仓库分享 💕 前言: 今天我们来回顾一下顺序表与链表,针对这一块我们也有许多OJ题目供大家参考。当我们学习完顺序表链表后避免不了一些习题的练习,这样才能巩固我们学习的内容。 话不多说&#xf…

PCI/PCIE总线的宏观理解

1、pcie总线协议实现的效果 (1)像访问内存一样去访问外设; (2)当建立好CPU地址空间到PCI/PCIE地址空间的映射关系后,程序访问CPU地址空间就可以达到访问PCI/PCIE地址空间的效果; 2、芯片地址空间 (1)32位的CPU寻址范围是4G,64位的…

MySQL执行更新的流程

一、加载缓存数据 引擎要执行更新语句的时候 ,比如对“id10”这一行数据,他其实会先将“id10”这一行数据看看是否在缓冲池里,如果不在的话,那么会直接从磁盘里加载到缓冲池里来,而且接着还会对这行记录加独占锁。 二…

Spring中Bean及@Bean的理解与new对象的区别

一直在纠结一个问题:new创建对象和用Bean创建对象有什么区别吗?为什么在spring中要使用Bean?Bean有什么作用? 一、Bean是啥 1、Java面向对象,对象有方法和属性,那么就需要对象实例来调用方法和属性&#x…

Spring Bean到底是什么?有什么用?

Spring Bean是什么?有什么用? 一、Bean到底是什么?二.怎么使用bean?三.Bean配置四.Bean的作用域 Bean在Spring和SpringMVC中随处可见,将这个概念内化很重要,下面分享一下我的想法: 一、Bean到底是什么? …

spring bean是什么

原文链接:https://www.awaimai.com/2596.html 歪麦博客 Spring有跟多概念,其中最基本的一个就是bean,那到底spring bean是什么? Bean是Spring框架中最核心的两个概念之一(另一个是面向切面编程AOP)。 是否正确理解…

Spring Bean的作用域

在Spring中,bean作用域用于确定哪种类型的bean实例应该从Spring容器中返回给调用者。 目前Spring Bean的作用域或者说范围主要有五种。 作用域描述singleton在spring IoC容器仅存在一个Bean实例,Bean以单例方式存在,bean作用域范围的默认值…

Spring bean是什么?

Spring有跟多概念,其中最基本的一个就是bean,那到底spring bean是什么? Bean是Spring框架中最核心的两个概念之一(另一个是面向切面编程AOP)。 是否正确理解 Bean 对于掌握和高效使用 Spring 框架至关重要。 遗憾的是&#xff0…

什么是bean

什么是bean? bean是计算机自动生成的类,bean是一个由Spring IoC容器实例化、组装和管理的对象。也就是说,bean并不是程序员编辑的,而是程序运行时,由spring通过反射生成的。在程序中,我们并不使用代码去ne…

Bean介绍

1.Bean 简介 在 Spring 中,所有被IOC 容器管理的,构成应用核心骨架的对象都被成为 Bean,它是由容器来实例化、装配、管理的对象。此外,它也是你应用中众多对象的一个。Bean 以及依赖的实例化和装配等工作全部是由容器中的配置元信…

Bean专题——什么是Bean?怎么注册、使用?生命周期?作用域?

1.什么是Bean? Bean是被实例的、组装的、及被Spring容器管理的Java对象。Spring容器会自动完成Bean对象的实例化。创建应用对象之间的协作关系的行为被称为:装配,这就是依赖注入的本质。 2.Spring三种装配方案 1.隐式的bean发现机制和自动…

【Spring第三篇】什么是Bean?

在Spring 中,构成应用程序主干并由Spring IoC容器管理的对象称为bean。bean是一个由Spring IoC容器实例化、组装和管理的对象。 我们总结如下: 1.bean是对象,一个或者多个不限定 2.bean由Spring中一个叫IoC的东西管理 3.我们的应用程序由一个…

大数据-玩转数据-Flink窗口函数

一、Flink窗口函数 前面指定了窗口的分配器, 接着我们需要来指定如何计算, 这事由window function来负责. 一旦窗口关闭, window function 去计算处理窗口中的每个元素. window function 可以是ReduceFunction,AggregateFunction,or ProcessWindowFunction中的任意一种. Reduc…

软考:中级软件设计师:网络类型与拓扑结构,网络规划与设计,ip地址与子网划分,特殊含义的IP地址

软考:中级软件设计师:网络类型与拓扑结构 提示:系列被面试官问的问题,我自己当时不会,所以下来自己复盘一下,认真学习和总结,以应对未来更多的可能性 关于互联网大厂的笔试面试,都是需要细心准…

Qt入门教程【Core篇】Layout布局(布局管理器、手动布局)

😈「编程小鱼酱秘密基地」:传送门 😈「CSDN主页」:传送门 😈「Bilibil首页」:传送门 😈「网易云课堂」:传送门 😈「CSDN学院」:传送门 😈「51CTO学…

前端布局 Flex(弹性)布局

1. flex布局优点 操作方便,布局极为简单,移动端应用很广泛 pc端浏览器支持情况较差 IE11或者更低版本,不支持或仅部分支持 2. flex布局原理 flex意为“弹性布局”,用来为盒状模型提供最大的灵活性,任何一个容器都…

Java BorderLayout(边框布局)布局管理器

BorderLayout BorderLayout 将容器分为 EAST 、 SOUTH 、 WEST 、 NORTH 、 CENTER五个区域,普通组件可以被放置在这 5 个区域的任意一个中 。 BorderLayout布局 管理器的布局示意图如图所示 。 当改变使用 BorderLayout 的容器大小时, NORTH 、 SOUTH …