OpenCV基础知识(8)— 图形检测
前言:Hello大家好,我是小哥谈。图形检测是计算机视觉的一项重要功能。通过图形检测可以分析图像中可能存在的形状,然后对这些形状进行描绘,例如搜索并绘制图像的边缘,定位图像的位置,判断图像中有没有直线、有没有圆形等。虽然图形检测涉及非常深奥的数学算法,但是OpenCV已经将这些算法封装成了简单的方法,开发者只要学会如何调用方法、如何调整参数即可很好的实现检测功能。本节课就介绍如何检测图像的形状、图像所占的区域,以及如何查找图像中出现的几何图形等。🌈
前期回顾:
史上最全OpenCV常用方法及使用说明汇总,建议收藏!
OpenCV基础知识(1)— OpenCV概述
OpenCV基础知识(2)— 图像处理的基本操作
OpenCV基础知识(3)— 图像数字化基础(像素、色彩空间)
OpenCV基础知识(4)— 绘制图形
OpenCV基础知识(5)— 几何变换
OpenCV基础知识(6)— 滤波器
OpenCV基础知识(7)— 腐蚀与膨胀
目录
🚀1.图像的轮廓
🚀2.轮廓的拟合
💥💥2.1 矩形包围框
💥💥2.2 圆形包围框
🚀3.Canny边缘检测
🚀4.霍夫变换
💥💥4.1 直线检测
💥💥4.2 圆环检测
🚀5.总结
🚀1.图像的轮廓
轮廓,是指图像中图形或物体的外边缘线条。简单的几何图形轮廓是由平滑的线构成的,容易识别,但不规则的轮廓可能有许多个点构成,识别起来比较困难。
OpenCV提供的findContours()方法可以通过计算图像梯度来判断出图像的边缘,然后将边缘的点封装成数组返回。🌳
findContours()方法的语法格式如下:
contours,hierarchy = cv2.findContours(image,mode,method)
参数说明:
image:被检测的图像,必须是8位单通道二值图像。如果原始图像是彩色图像,必须转为灰度图像,并经过二值化阈值处理。
mode:轮廓的检索模式,具体值详见表。
参数值 | 含义 |
cv2.RETR_EXTERNAL | 只检测外轮廓 |
CV2.RETR_LIST | 检测所有轮廓,但不建立层次关系。 |
CV2.RETR_CCOMP | 检测所有轮廓,并建立两级层次关系。 |
CV2.RETR_TREE | 检测所有轮廓,并建立树状结构的层次关系。 |
method:检测轮廓时使用的方法,具体值详见表。
参数值 | 含义 |
cv2.CHAIN_APPROX_NONE | 储存轮廓上的所有点 |
cv2.CHAIN_APPROX_SIMPLE | 只保存水平、垂直或对角线轮廓的端点 |
CV2.CHAIN_APPROX_TC89_L1 | Ten-Chin1近似算法的一种 |
CV2.CHAIN_APPROX_TC89_KCOS | Ten-Chin1近似算法的一种 |
返回值说明:
contours:检测出的所有轮廓,list类型,每一个元素都是某个轮廓的像素坐标数组。
hierarchy:轮廓之间测层次关系。
通过findContours()方法找到图像轮廓之后,为了方便开发人员观测,最好能把轮廓画出来,于是OpenCV方法提供了drawContours()方法专门用来绘制这些轮廓。🌳
drawContours()方法的语法如下:
image = cv2.drawContours(image,contours,contourIdx,color,thickness,lineType,hierarchy,maxLevel,offse)
参数说明:
image:被绘制轮廓的原始图像,可以是多通道图像。
contours:findContours()方法得出的轮廓列表。
contourIdx:绘制轮廓的索引,如果为-1则绘制所有轮廓。
color:绘制颜色,使用RGB格式。
thickness:可选参数,画笔的粗细程度,如果该值为-1则绘制实心轮廓。
lineType:可选参数,绘制轮廓的线型。
hierarchy:可选参数,findContours()方法得出的层次关系。
maxLevel:可选参数,绘制轮廓的层次深度,最深绘制第maxLevel层。
offse:可选参数,偏移量,可以改变绘制结果的位置。
返回值说明:
image:同参数中的image,方法执行后原始图像中就包含绘制的轮廓了,可以不使用此返回值保存结果。
案例1:
绘制几何图像的轮廓,具体代码如下:
import cv2
img = cv2.imread("shape1.png") # 读取原图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 彩色图像转为变成单通道灰度图像
t, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # 灰度图像转为二值图像
# 检测图像中出现的所有轮廓,记录轮廓的每一个点
contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
# 绘制所有轮廓,宽度为5,颜色为红色
cv2.drawContours(img, contours, -1, (0, 0, 255), 5)
cv2.imshow("img", img) # 显示绘制结果
cv2.waitKey() # 按下任何键盘按键后
cv2.destroyAllWindows() # 释放所有窗体
运行效果如图所示:
案例2:
绘制花朵的轮廓。
绘制之前首先要降低图像中的噪声干扰,先进行滤波处理,再将图像处理成二值灰度图像,并检测出轮廓,再利用绘制轮廓的方法在原始图像中绘制轮廓。🌺
具体代码如下:
import cv2
img = cv2.imread("flower.jpg") # 读取原图
cv2.imshow("img", img) # 显示原图
img = cv2.medianBlur(img, 5) # 使用中值滤波去除噪点
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 原图从彩图变成单通道灰度图像
t, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # 灰度图像转化为二值图像
cv2.imshow("binary", binary) # 显示二值化图像
# 获取二值化图像中的轮廓极轮廓层次数据
contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
cv2.drawContours(img, contours, -1, (0, 0, 255), 2) # 在原图中绘制轮廓
cv2.imshow("contours", img) # 显示绘有轮廓的图像
cv2.waitKey() # 按下任何键盘按键后
cv2.destroyAllWindows() # 释放所有窗体
运行效果如图所示:
🚀2.轮廓的拟合
拟合,是指将平面上的一系列点,用一条光滑的曲线连接起来。轮廓的拟合就是将凹凸不平的轮廓用平整的几何图形体现出来。
下面就为大家介绍如何按照轮廓绘制矩形包围框和圆形包围框。🌴
💥💥2.1 矩形包围框
矩形包围框是指图像轮廓的最小矩形边界。OpenCV提供的boundingRect()方法可以自动计算出轮廓最小矩形边界的坐标和宽高。🐳
boundingRect()方法的语法如下:
retval = cv2.boundingRect(array)
参数说明:
array:轮廓数组
返回值说明:
retval:元组类型,包含四个整数值,分别是最小矩形包围框左上角顶点的横坐标、左上角顶点的纵坐标、矩形的宽和矩形的高。所以也可以写成x,y,w,h = cv2.boundingRect(array)的形式。
案例:
为爆炸图形绘制矩形包围框。具体代码如下:
import cv2
img = cv2.imread("shape2.png") # 读取原图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 从彩色图像变成单通道灰度图像
# 将灰度图像进行二值化阈值处理
t, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 获取二值化图像中的轮廓极轮廓层次数据
contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
x, y, w, h = cv2.boundingRect(contours[0]) # 获取第一个轮廓的最小矩形边框,记录坐标和宽高
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2) # 绘制红色矩形
cv2.imshow("img", img) # 显示绘制结果
cv2.waitKey() # 按下任何键盘按键后
cv2.destroyAllWindows() # 释放所有窗体
运行效果如图所示:
💥💥2.2 圆形包围框
圆形包围框与矩形包围框同理,是图像轮廓的最小圆形边界。OpenCV提供的minEnclosingCircle()方法可以自动计算出轮廓最小圆形边界的圆心和半径。
minEnclosingCircle()方法的语法格式如下:
center,radius = cv2.minEnclosingCircle(points)
参数说明:
points:轮廓数组
返回值说明:
center:元组类型,包含两个浮点值,是最小圆形包围框圆心的横坐标和纵坐标。
radius:浮点类型,最小圆形包围框的半径。
案例:
为爆炸图形绘制圆形包围框。具体代码如下:
import cv2
img = cv2.imread("shape2.png") # 读取原图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 从彩色图像变成单通道灰度图像
# 将灰度图像进行二值化阈值处理
t, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 获取二值化图像中的轮廓极轮廓层次数据
contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
center, radius = cv2.minEnclosingCircle(contours[0]) # 获取最小圆形边框的圆心点和半径
x = int(round(center[0])) # 圆心点横坐标转为近似整数
y = int(round(center[1])) # 圆心点纵坐标转为近似整数
cv2.circle(img, (x, y), int(radius), (0, 0, 255), 2) # 绘制圆形
cv2.imshow("img", img) # 显示绘制结果
cv2.waitKey() # 按下任何键盘按键后
cv2.destroyAllWindows() # 释放所有窗体
运行效果如图所示:
🚀3.Canny边缘检测
Canny边缘检测算法是John F.Canny 于1986年开发出来的一个多级边缘检测算法,该算法根据像素的梯度变化寻找图像边缘,最终可以绘制出十分精细的二值边缘图像。🌿
OpenCV将Canny边缘检测算法封装在Canny()方法中,该方法的语法如下:
edgrs = cv2.Canny(image,threshold1,threshold2,apertureSize,L2gradient)
参数说明:
image:检测的原始图像
threshold1:计算过程中使用的第一个阈值,可以是最小阈值,也可以是最大阈值,通常用来设置最小阈值。
threshold2:计算过程中使用的第二个阈值,通常用来设置最大阈值。
apertureSize:可选参数,Sobel算子的孔径大小。
L2gradient:可选参数,计算图像梯度的标识,默认值为False。值为True时会采用更精准的算法进行计算。
返回值说明:
edges:计算后得出的边缘图像,是一个二值灰度图像。
说明:♨️♨️♨️
在开发过程中可以通过调整最小阈值和最大阈值来控制边缘检测的精细程度。当两个阈值都较小的时候,会检测出更多的细节;当两个阈值都较大的时候,会忽略较多的细节。
案例:
使用Canny算法检测美女图像,具体代码如下:
import cv2
img = cv2.imread("1.webp") # 读取原图
r1 = cv2.Canny(img, 10, 50); # 使用不同的阈值进行边缘检测cv2.imshow("img", img) # 显示原图
cv2.imshow("r1", r1) # 显示边缘检测结果
cv2.waitKey() # 按下任何键盘按键后
cv2.destroyAllWindows() # 释放所有窗体
运行效果如图所示:
🚀4.霍夫变换
霍夫变换是一种特征检测,通过算法识别图像的特征,从而判断出图像中的特殊形状,例如直线和圆。下面就为大家介绍如何检测图像中的直线和圆。
💥💥4.1 直线检测
霍夫直线变换是通过霍夫坐标系的直线与笛卡尔坐标系的点之间的映射关系来判断图像中的点是否构成直线。OpenCV将此封装成了两个方法,分别是cv2.HoughLines()方法和
cv2.HoughLinesP()方法,前者用于检测无线延长的直线,后者用于检测线段。🌼
本节就介绍比较常用的HoughLinesP()方法。
HoughLinesP()方法名称最后有一个大写的P,该方法只能检测二值灰度图像,也就是只有两种像素值的黑白图像。方法最后会把找出的所有线段的两个端点坐标保存成一个数组。
HoughLinesP()方法的语法如下:
lines = cv2.HoughLinesP(image,rho,theta,threshold,minLineLength,maxLineGap)
参数说明:
image:检测的原始图像
rho:检测直线使用的半径步长,值为1时,表示检测所有可能的半径步长。
theta:搜索直线的角度,值为π/180时,表示检测的所有角度。
threshold:阈值,该值越小,检测的直线就越多。
minLineLength:线段的最小长度,小于该长度的直线不会记录到结果中。
maxLineGap:线段之间的最小距离。
返回值说明:
lines:一个数组,元素为所有检测出的线段,每个线段也是一个数组,内容为线段两个端点的横纵坐标,格式为[[[x1,y1,x2,y2],[x1,y1,x2,y2]]]。
说明:♨️♨️♨️
使用该方法前需要先为原始图像进行降噪处理,否则会影响检测结果。
案例:
检测笔图像中出现的直线,具体代码如下:
import cv2
import numpy as npimg = cv2.imread("pen.jpg") # 读取原图
o = img.copy() # 复制原图
o = cv2.medianBlur(o, 5) # 使用中值滤波进行降噪
gray = cv2.cvtColor(o, cv2.COLOR_BGR2GRAY) # 从彩色图像变成单通道灰度图像
binary = cv2.Canny(o, 50, 150) # 绘制边缘图像
# 检测直线,精度为1,全角度,阈值为15,线段最短100,最小间隔为18
lines = cv2.HoughLinesP(binary, 1, np.pi / 180, 15, minLineLength=100, maxLineGap=18)
for line in lines: # 遍历所有直线x1, y1, x2, y2 = line[0] # 读取直线两个端点的坐标cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2) # 在原始图像上绘制直线
cv2.imshow("canny", binary) # 显示二值化边缘图案
cv2.imshow("img", img) # 显示绘制结果
cv2.waitKey() # 按下任何键盘按键后
cv2.destroyAllWindows() # 释放所有窗体
运行效果如图所示:
💥💥4.2 圆环检测
霍夫圆环变换的原理与霍夫直线变换类似。OpenCV提供的HoughCircle()方法用于检测图像中的圆,该方法在检测过程中进行两轮筛选:第一轮筛选会找出可能的是圆的圆心坐标,第二轮筛选会计算出这些圆心坐标可能的对应的半径长度。方法最后会将圆心坐标和半径长度封装成一个浮点型数组。🍃
HoughCircle()方法的语法格式如下:
circles = cv2.HoughCircle(image,method,dp,minDist,param1,param2,minRadius,maxRadius)
参数说明:
image:检测的原始图像
method:检测方法
dp:累加器分辨率与原始图像分辨率之比的倒数。值为1时,累加器与原始图像具有相同的分辨率;值为2时,累加器的分辨率为原始图像的1/2。通常使用1作为参数。
minDist:圆心之间的最小距离
param1:可选参数,Canny边缘检测使用的最大阈值。
param2:可选参数,检测圆环结果的投票数。第一轮筛选时投票数超过该值的圆才会进入第二轮筛选。值越大,检测出的圆越小,但越精准。
minRadius:可选参数,圆的最小半径。
maxRadius:可选参数,圆的最大半径。
返回值说明:
circles:一个数组,元素为所有检测出的圆,每个圆也是一个数组,内容为圆心的横、纵坐标和半径长度,格式为[[[x1,y1,r1],[x2,y2,r2]]]。
说明:♨️♨️♨️
使用该方法前需要先为原始图像进行降噪处理,否则会影响检测结果。
案例:
绘制硬币图像的圆环和对应圆心,具体代码如下:
import cv2
import numpy as npimg = cv2.imread("coin.jpg") # 读取原图
o = img.copy() # 复制原图
o = cv2.medianBlur(o, 5) # 使用中值滤波进行降噪
gray = cv2.cvtColor(o, cv2.COLOR_BGR2GRAY) # 从彩色图像变成单通道灰度图像
# 检测圆环,圆心最小间距为70,Canny最大阈值为100,投票数超过25。最小半径为10,最大半径为50
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 70, param1=100, param2=25, minRadius=10, maxRadius=50)
circles = np.uint(np.around(circles)) # 将数组元素四舍五入成整数
for c in circles[0]: # 遍历圆环结果x, y, r = c # 圆心横坐标、纵坐标和圆半径cv2.circle(img, (x, y), r, (0, 0, 255), 3) # 绘制圆环cv2.circle(img, (x, y), 2, (0, 0, 255), 3) # 绘制圆心
cv2.imshow("img", img) # 显示绘制结果
cv2.waitKey() # 按下任何键盘按键后
cv2.destroyAllWindows() # 释放所有窗体
运行效果如图所示:
🚀5.总结
总结:
🍀(1)图像的轮廓:先对图像做二值化处理,cv2.findContours()检测轮廓,cv2.drawContours()绘制轮廓。
🍀(2)轮廓的拟合:包括矩形包围框和圆形包围框。
🍀(3)Canny边缘检测:最实用、最简单、效果最好的边缘检测方法。阈值越小,边缘越多。
🍀(4)霍夫变换:包括直线检测和圆环检测。其中,直线检测是检测之前先降噪,再做二值化阈值处理,圆环检测是检测之前先降噪,再转为单通道灰度图像。
相关文章:
OpenCV基础知识(8)— 图形检测
前言:Hello大家好,我是小哥谈。图形检测是计算机视觉的一项重要功能。通过图形检测可以分析图像中可能存在的形状,然后对这些形状进行描绘,例如搜索并绘制图像的边缘,定位图像的位置,判断图像中有没有直线、…...
Java虚拟机
文章目录 JVM运行时数据区域HotSpot虚拟机对象探秘实战:OutOfMemoryError异常 JVM 运行时数据区域 HotSpot虚拟机对象探秘 实战:OutOfMemoryError异常...
c++学习 之 函数重载注意事项
文章目录 引用作为函数重载的条件函数重载遇到默认参数 引用作为函数重载的条件 #include <iostream> using namespace std; void fun(int &a) {cout << "void fun(int & a)" << endl; }void fun(const int &a) {cout << "…...
2023-08-27 LeetCode每日一题(合并区间)
2023-08-27每日一题 一、题目编号 56. 合并区间二、题目链接 点击跳转到题目位置 三、题目描述 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组&#…...
C#,数值计算——调适数值积分法(adaptive quadrature)的计算方法与源程序
1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// 调适数值积分法 /// adaptive quadrature /// </summary> public class Adapt { private double x1 { get; } 0.942882415695480; private …...
微信小程序发布迭代版本后如何提示用户强制更新新版本
在点击小程序发布的时候选择,升级选项 之前用户使用过的再打开小程序页面就会弹出升级弹窗modal...
星际争霸之小霸王之小蜜蜂(七)--消失的子弹
目录 前言 一、删除子弹 二、限制子弹数量 三、继续重构代码 总结 前言 昨天我们已经让子弹飞了起来,但是会面临一个和之前小蜜蜂一样的问题,小蜜蜂的行动应该限制在窗口内,那么子弹也是有相同之处,也需要限制一个移动范围&…...
Hadoop入门机安装hadoop
0目录 1.Hadoop入门 2.linux安装hadoop 1.Hadoop入门 定义 Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。 优势 高可靠性:Hadoop底层维护多…...
cookie技术介绍
title: cookie技术 date: 2023-08-27 21:34:19 tags: [cookie, 网络, http] categories: 网络 我们经常说的cookie缓存数据,允许cookie是什么意思? Cookie也被称作Cookies,它是一种让网站的服务器端可以把少量数据存储在客户端的硬盘或内存中&#x…...
网络摄像头:SparkoCam Crack
SparkoCam 网络摄像头软件 SparkoCam 是一款网络摄像头和视频效果软件,用于广播实时网络摄像头效果并将其应用到视频聊天和录音中。 使用佳能/尼康数码单反相机作为常规网络摄像头通过向实时视频聊天和视频录制添加酷炫的网络摄像头效果和图形来增强 USB 网络摄像…...
【缓存设计】记一种不错的缓存设计思路
文章目录 前言场景设计思路小结 前言 之前与同事讨论接口性能问题时听他介绍了一种缓存设计思路,觉得不错,做个记录供以后参考。 场景 假设有个以下格式的接口: GET /api?keys{key1,key2,key3,...}&types{1,2,3,...}其中 keys 是业务…...
微信小程序大学校园二手教材与书籍拍卖系统设计与实现
摘 要 随着应用技术的发展以及电子商务平台的崛起,利用线上平台实现的二手交易为传统的二手交易市场注入了新的生机,大学校园内的新生和应届毕业生的相互交替产生了巨大的二手交易空间,同时考虑到环保和资源再利用,大学校园的书籍…...
涛然自得周刊(第06期):韩版苏东坡的突围
作者:何一涛 日期:2023 年 8 月 27 日 涛然自得周刊主要精选作者阅读过的书影音内容,不定期发布。历史周刊内容可以看这里。 电影 兹山鱼谱 讲述丁若铨因政治事件被贬黜到了遥远的黑山岛。来到岛上后,丁被大自然环境疗愈&#…...
DOCKER 部署 webman项目
# 设置基础镜像 FROM php:8.2-fpm# 安装必要的软件包和依赖项 RUN apt-get update && apt-get install -y \nginx \libzip-dev \libpng-dev \libjpeg-dev \libfreetype6-dev \&& rm -rf /var/lib/apt/lists/*# 安装 PHP 扩展 RUN docker-php-ext-configure gd …...
LLMs:LangChain-Chatchat(一款可实现本地知识库问答应用)的简介、安装、使用方法之详细攻略
LLMs:LangChain-Chatchat(一款可实现本地知识库问答应用)的简介、安装、使用方法之详细攻略 目录 LangChain-Chatchat的简介 1、原理图解 2、文档处理实现流程 1、模型支持 (1)、LLM 模型支持 (2)、Embedding 模型支持 LangChain-Chatchat的安装 1、镜像部署…...
Qt 解析XML文件 QXmlStreamReader
如何使用QXmlStreamReader来解析格式良好的XML,Qt的文档中指出,它是一种更快、更方便的Qt自己的SAX解析器(QXmlSimpleReader)的替代,它也较快,在某种情况下,比DOM(QDomDocument&…...
图像线段检测几种方法
1、方法一 当我将OpenCV提升到4.1.0时,LineSegmentDetector(LSD)消失了。 OpenCV-contrib有一个名为FastLineDetector的东西,如果它被用作LSD的替代品似乎很好。如果你有点感动,你会得到与LSD几乎相同的结果。 2、方…...
【Vue2.0源码学习】生命周期篇-初始化阶段(initEvents)
文章目录 1. 前言2. 解析事件3. initEvents函数分析4. 总结 1. 前言 本篇文章介绍生命周期初始化阶段所调用的第二个初始化函数——initEvents。从函数名字上来看,这个初始化函数是初始化实例的事件系统。我们知道,在Vue中,当我们在父组件中…...
SQL高级知识点
MySQL基础 1、安装 1)设置编码 2)设置密码 2、配置文件:my.ini、my.cnf 1)设置端口号 port3306 2)设置编码 default-character-setutf8character-set-serverutf8 3)存储引擎 default-storage-engineINNODB 4)最大连接数 max_connections100 注意&…...
【安全】原型链污染 - Code-Breaking 2018 Thejs
目录 准备工作 环境搭建 加载项目 复现 代码审计 payload 总结 准备工作 环境搭建 Nodejs BurpSuite 加载项目 项目链接 ① 下载好了cmd切进去 ② 安装这个项目 可以检查一下 ③运行并监听 可以看到已经在3000端口启动了 复现 代码审计 const fs require(fs) cons…...
【架构】探索计算机处理器的世界:ARM和x86架构解析及指令集
目录 导语ARM架构x86架构AMD公司对比与应用不同架构处理器的指令集结语 导语 计算机处理器是数字化时代的核心引擎,而在众多处理器架构中,ARM和x86是备受关注的三个。本文将带您深入探索这三个架构,介绍它们的特点、公司背景以及应用领域。让…...
SpringBoot权限认证
SpringBoot的安全 常用框架:Shrio,SpringSecurity 两个功能: Authentication 认证Authorization 授权 权限: 功能权限访问权限菜单权限 原来用拦截器、过滤器来做,代码较多。现在用框架。 SpringSecurity 只要引入就可以使…...
OpenGL-入门-BMP像素图glReadPixels
glReadPixels函数用于从帧缓冲区中读取像素数据。它可以用来获取屏幕上特定位置的像素颜色值或者获取一块区域内的像素数据。下面是该函数的基本语法: void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *da…...
同源策略以及SpringBoot的常见跨域配置
先说明一个坑。在跨域的情况下,浏览器针对复杂请求,会发起预检OPTIONS请求。如果服务端对OPTIONS进行拦截,并返回非200的http状态码。浏览器一律提示为cors error。 一、了解跨域 1.1 同源策略 浏览器的同源策略(Same-Origin Po…...
基于jeecg-boot的flowable流程跳转功能实现
更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: https://gitee.com/nbacheng/nbcio-boot 前端代码:https://gitee.com/nbacheng/nbcio-vue.git 在线演示(包括H5) : http://122.227.135.243:9888 今天我…...
react图片预加载
道阻且长,行而不辍,未来可期 图片预加载的原理:new一个image对象,用这个对象加载图片,等这个对象将这个图片请求完后,再将这个图片放入原本应该放置的位置 代码如下: import React, { useEffe…...
数据库管理
SQL语言分类: DDL:数据定义语言,用于创建数据库对象,如库、表、索引等 DML:数据操纵语言,用于对表中的数据进行管理 DQL:数据查询语言,用于从数据表中查找符合条件的数据记录 DCL&am…...
【2023年11月第四版教材】《第8章-整合管理》(第3部分)
《第8章-整合管理》(第3部分) 9 监控项目工作9.1 监控项目工作★★★9.2 数据分析9.4 决策9.5 工作绩效报告 10 实施整体变更控制10.1 实施整体变更控制★★★ (18上36)10.2 变更请求★★★10.3变更控制工具★★★10.4 数据分析10…...
初阶数据结构(三)链表
💓博主csdn个人主页:小小unicorn💓 ⏩专栏分类:c 🚚代码仓库:小小unicorn的学习足迹🚚 🌹🌹🌹关注我带你学习编程知识 前面我们讲的线性表的顺序存储结构。它…...
Python小知识 - 八大排序算法
八大排序算法 排序算法是计算机科学中非常重要的一个研究领域。排序算法可以分为内部排序和外部排序,内部排序是数据记录在计算机内部,而外部排序是数据记录在计算机外部,这里我们主要讨论内部排序。 内部排序中的算法大致可以归纳为四类&…...
东营哪里做网站/seo工程师招聘
这里采用的是Edushi接口(详情请看http://www.edushi.com/api/freeAPI.htm) 目前(2007.03.07)只支持以下城市:杭州(hz) 上海(sh) 青岛(qd) 深圳(sz) 西安(xian) 长沙(changsha)成都(chengdu) 广州(guangzhou) 嘉兴(jiaxing) 佛山(fs) 温州(wz)上虞(sy) 余姚(yy) 丽水(lishui)1…...
网站建设微信公众号小程序制作/今日足球比赛分析推荐
点击上方“iOS开发”,选择“置顶公众号”关键时刻,第一时间送达!作者:mirrorzyb链接:https://www.jianshu.com/p/5d836e89d9d1iOS开发整理发布,转载请联系作者获得授权Fastlane是一套使用Ruby写的自动化工具…...
营口建设信息网站/seo优化培训课程
在过去的几个星期,(几乎)每次都有消息 Ubuntu 15.04在启动时检测到系统程序错误 跑出来“欢迎”我。那时我是直接忽略掉它的,但是这种情况到了某个时刻,它就让人觉得非常烦人了!检测到系统程序错误(System program problem detect…...
做网站需求报告/自动点击关键词软件
1. 函数的任意数目的参数你可能知道PHP允许你定义一个默认参数的函数。但你可能并不知道PHP还允许你定义一个完全任意的参数的函数下面是一个示例向你展示了默认参数的函数:// 两个默认参数的函数function foo($arg1 , $arg2 ) { echo "arg1: $arg1\n&quo…...
wordpress 搜索结果分类/谷歌sem推广
大数据是什么?在维克托迈尔-舍恩伯格及肯尼斯库克耶编写的《大数据时代》中提出:大数据指不用随机分析法(抽样调查)这样捷径,而采用所有数据进行分析处理。那么究竟多大的数据算是大数据,这个其实并没有明确…...
为什么检测行业不能用网站做/友情链接交换平台免费
cmin和cmax介绍 cmin和cmax是PostgreSQL中表的系统字段之一,用来判断同一个事务内的其他命令导致的行版本变更是否可见。即在事务中每个命令都应该能看到其之前执行的命令的变更。 很多人都通过测试都会发现在同一张表中cmin和cmax总是相等的,所以认为…...