当前位置: 首页 > news >正文

【OpenCV】计算机视觉图像处理基础知识

目录

前言

推荐

1、OpenCV礼帽操作和黑帽操作

2、Sobel算子理论基础及实际操作

3、Scharr算子简介及相关操作

4、Sobel算子和Scharr算子的比较

5、laplacian算子简介及相关操作

6、Canny边缘检测的原理

6.1 去噪

6.2 梯度运算

6.3 非极大值抑制

6.4 滞后阈值

7、Canny边缘检测的函数及使用


前言

本文将非常细致的讲解相关与计算机视觉OpenCV图像处理的相关知识即操作,非常的简单易懂。

推荐

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站

1、OpenCV礼帽操作和黑帽操作

图像顶帽操作也叫图像礼帽操作,实际上就是:
结果图像=原图像-图像开运算
那么我们知道图像的开运算就是对图像先腐蚀操作,然后在进行膨胀操作,得到的图像其实就是进行了取噪的一个处理,然后我们所说的礼帽图像操作就是使用原图像-图像的开运算操作。
函数依旧是:

result = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

其中img表示原始图像,cv2.MORPH_TOPHAT表示进行礼帽操作,然后kernel表示卷积核,这里我们之前已经讲过。
核心函数是:

k=np.ones((5,5),np.uint8)
r=cv2.morphologyEx(o,cv2.MORPH_TOPHAT,k)

这样我们显示以下我们处理的图像就可以知道:

处理之后我们得到了相应的噪声结果。

图像黑帽操作就是图像的闭运算-原图像
黑帽结果图像=图像闭运算-原图像
我们之前也介绍过这个闭运算操作就是先对图像进行膨胀操作,然后进行腐蚀操作。
函数是:

result = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)

其中cv2.MORPH_BLACKHAT表示的就是黑帽操作的意思,kernel表示卷积核。
然后我们看一下图像处理的核心函数:

k=np.ones((5,5),np.uint8)
r=cv2.morphologyEx(o,cv2.MORPH_BLACKHAT,k)

得到的结果是:

可以看到我们把图像中的小气泡都取出来了。

2、Sobel算子理论基础及实际操作

首先我们来了解一个边界的定义,看一个图来理解更加的明白。

对于如图中的水平梯度,我们看A、B两个地方,右侧像素值减去左侧像素值不为0,那么我们就说在此图中A列和B列是边界,否则不是边界。同样对于垂直梯度我们也是这样定义。
对于Sobel算子,我们先来看x方向他进行了什么操作:

P5x=(p3-p1)+2*(p6-p4)+(p9-p7)
右侧像素值减去左侧像素值,中间行参数稍大为2。
同样对于y轴方向也做了一个同样的操作,
P5y=(p7-p1)+2*(p8-p2)+(p9-p3)
下一行像素值减去上一行像素值,中间列参数稍大为2
然后我们计算了一个近似梯度值:
G= 根号(𝐺𝑥2 + 𝐺𝑦2)
简化版本就是:
G=|𝐺𝑥|+| 𝐺𝑦|

这中心点的P5的Sobel算子就是按照这个方式进行计算。
对于P5点完成的Sobel算子计算就是这样:

那么好,我们来看一下在python中对于Sobel是一个什么样的函数:

dst = cv2.Sobel( src , ddepth , dx , dy , [ksize] )

其中src表示原始图像,ddeph表示图像的深度,那么我们一般设定为-1,用来表示和原图像保持一致。dx,dy表示x轴的方向或者y轴的方向,ksize表示核大小。
其中我们在已经知道的256色位图中,白色点像素值255,黑色点像素值0。
这里对于dx,dy方向为什么我们取绝对值进行一下解答,因为加入一块黑块在一个白色背景下,那么我们在水平方向上,左侧那么得到的数值就是一个负数,对于右侧那么我们得到的是就是一个正常的正数,那么对于OpenCV来说,当我们没有加绝对值得时候如果出现了负数,统一处理成0。
 

根据图我们就可以知道,左侧的线被OpenCV处理成了0。所以我们这里要加上一个绝对的运算。无论对于水平方向还是垂直方向都是如此。
然后我们要将原始图像处理成256为的色位图。其函数是:

dst = cv2.convertScaleAbs( src [, alpha[, beta]] )

目标图像=调整(原始图像*alpha+beta)
其中alpha和beta可以理解为权重的意思。
当我们想要计算水平方向上的Sobel算子的时候,那么我们就设定函数中的参数dx=1,dy=0.对于垂直方向也是如此。那么这里我们就会想:如果我们两个方向都一起设置这样是不是比计算完x的方向然后计算y方向,然后进行结合这样是不是更加的方便一些呢?也就是说下图中的方式一比方式二更加的简介方便呢?

事实上不是这样的,而且两个图像有很大的差异,这个我们后续会看到结果。
那么当我们完成了这一步操作之后,我们还要做两个图像的权重和,其函数是:

dst=cv2.addWeighted( src1 , alpha , src2 , beta , gamma )

这里我们说的通俗一点就是,src1表示计算的x轴方向的图像,alpha表示x轴方向上的图像所占的比重,src2表示计算的y轴方向的图像,beta表示y轴方向上的图像所占的比重是多少,最后gamma表示一个修正数值。

dst(I)=saturate(src1(I)*alpha+src2(I)*beta+gamma)

接下来我们来验证一下各个结果:

import cv2
import numpy as np
o = cv2.imread('image\\sobel4.bmp',cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(o,-1,1,0)
cv2.imshow("original",o)
cv2.imshow("x",sobelx)
cv2.waitKey()
cv2.destroyAllWindows()

这里我们没有加上绝对值计算x轴方向上的Sobel算子,得到的结果是:

很明显左侧的没有计算出来。

import cv2
import numpy as np
o = cv2.imread('image\\sobel4.bmp',cv2.IMREAD_GRAYSCALE)
sobelx = cv2.Sobel(o,cv2.CV_64F,1,0)
sobelx = cv2.convertScaleAbs(sobelx) # 转回uint8 
cv2.imshow("original",o)
cv2.imshow("x",sobelx)
cv2.waitKey()
cv2.destroyAllWindows()

当我们加上绝对值后的结果是:

对于垂直方向的结果也是如此。最后我们计算出x,y的方向。进行融合并且和直接将x,y表示成1的结果进行一下对比,我们来看结果:
核心代码:

sobelx = cv2.Sobel(o,cv2.CV_64F,1,0)
sobely = cv2.Sobel(o,cv2.CV_64F,0,1)
sobelx = cv2.convertScaleAbs(sobelx) # 转回uint8 
sobely = cv2.convertScaleAbs(sobely) 
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0) 
sobelxy11=cv2.Sobel(o,cv2.CV_64F,1,1)
sobelxy11=cv2.convertScaleAbs(sobelxy11)

根据结果我们可以得到:使用了dx,dy的情况下无法检测到边。然后我们用lena来测试一下结果。

在我们相加表示的情况下,边缘检测的线条十分清晰,将分割的地带表达的特别清楚。

3、Scharr算子简介及相关操作

经过大量的科学家验证,发现3*3的Sobel算子可能并不是特别的精确,于是又提出了相应的Scharr算子,其实就是改变了运算的尺度而已。

Sobel算子由原来的121变为了3 10 3,这样的一个组合。其余的操作都是和Sobel算子一致我们来简要的说明一下:
dst=Scharr(src, ddpeth, dx, dy)
这里面少了核的大小,但是和Sobel算子依然一直,参数这里就不解释了,唯一不同的就是我们使用Sobel算子可以设置成dx=1,dy=1。那么对于Scharr算子如果这样设置就会报错。这里需要注意一下。满足条件:
dx >= 0 && dy >= 0 && dx+dy == 1
 

import cv2
import numpy as np
o = cv2.imread('image\\scharr.bmp',cv2.IMREAD_GRAYSCALE)
scharrx = cv2.Scharr(o,cv2.CV_64F,1,0)
scharry = cv2.Scharr(o,cv2.CV_64F,0,1)
scharrx = cv2.convertScaleAbs(scharrx) # 转回uint8 
scharry = cv2.convertScaleAbs(scharry) 
scharrxy = cv2.addWeighted(scharrx,0.5,scharry,0.5,0) 
cv2.imshow("original",o)
cv2.imshow("x",scharrx)
cv2.imshow("y",scharry)
cv2.imshow("xy",scharrxy)
cv2.waitKey()
cv2.destroyAllWindows()

4、Sobel算子和Scharr算子的比较

对于上述我们的测试图,其实看不出来Sobel算子和Scharr算子到底有什么区别,看起来是一致的,那么我们这里使用大美女lena进行一次Sobel和Scharr,得到结果进行对比一下可以知道:

sobelx = cv2.Sobel(o,cv2.CV_64F,1,0,ksize=3)
sobely = cv2.Sobel(o,cv2.CV_64F,0,1,ksize=3)
sobelx = cv2.convertScaleAbs(sobelx) # 转回uint8 
sobely = cv2.convertScaleAbs(sobely) 
sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0) 
scharrx = cv2.Scharr(o,cv2.CV_64F,1,0)
scharry = cv2.Scharr(o,cv2.CV_64F,0,1)
scharrx = cv2.convertScaleAbs(scharrx) # 转回uint8 
scharry = cv2.convertScaleAbs(scharry) 
scharrxy = cv2.addWeighted(scharrx,0.5,scharry,0.5,0)

很明显,这里我们看一下了lena的肩膀部分,可以看到使用Shcarr算子进行计算的时候,刻画的更加细致。

5、laplacian算子简介及相关操作

拉普拉斯算子类似于二阶sobel导数。实际上,在OpenCV中通过调用sobel算子来计算拉普拉斯算子。使用的公式为:
∆𝑠𝑟𝑐 = 𝜕2𝑠𝑟𝑐/𝜕𝑥2 + 𝜕2𝑠𝑟𝑐/𝜕𝑦2
使用的卷积核也和Sobel和Shcarr算子的不一致:

看起来有点像高斯的,哈哈哈。
这里我们进行一下讲解,
P5new=(p2+p4+p6+p8)-4*p5

当没有处于边界的时候呢,我们可以得到P5的数值是变化不大的,当处于边界的时候,P5的数值是变化非常大的,这是因为什么呢?

对于拉普拉斯算子的函数估计我们也可以猜到:
dst = cv2.Laplacian( src, ddepth )
自然是没有水平方向和垂直方向的。
实际操作中,计算梯度值可能会出现负数。通常处理的图像是np.uint8类型,如果结果也是该类型,所有负数会自动截断为0,发生信息丢失。所以,通常计算时,使用更高的数据类型cv2.CV_64F,取绝对值后,再转换为np.uint(cv2.CV_8U)类型。
所以我们还是要取一次绝对值的运算:
dst = cv2.convertScaleAbs( src )
 

import cv2
import numpy as np
o = cv2.imread('image\\laplacian.bmp',cv2.IMREAD_GRAYSCALE)
laplacian = cv2.Laplacian(o,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian) # 转回uint8 
cv2.imshow("original",o)
cv2.imshow("laplacian",laplacian)
cv2.waitKey()
cv2.destroyAllWindows()

我们对lena进行一次拉普拉斯算子操作,得到的结果是:

6、Canny边缘检测的原理

Canny边缘检测算子是John F. Canny于 1986 年开发出来的一个多级边缘检测算法。更为重要的是 Canny 创立了边缘检测计算理论(Computational theory of edge detection)解释这项技术如何工作。
Canny 的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是:
1.最优检测:算法能够尽可能多地标识出图像中的实际边缘,漏检真实边缘的概率和误检非边缘的概率都尽可能小;
2.最优定位准则:检测到的边缘点的位置距离实际边缘点的位置最近,或者是由于噪声影响引起检测出的边缘偏离物体的真实边缘的程度最小;
3.检测点与边缘点一一对应:算子检测的边缘点与实际边缘点应该是一一对应。
Canny边缘检测的一般步骤:1.去噪 2.梯度运算 3.非极大值抑制 4.滞后阈值。下面我们就分别讲解一下这些操作:

6.1 去噪

边缘检测容易受到噪声的影响。因此,在进行边缘检测前,通常需要先进行去噪。我们一般使用高斯滤波进行图像去噪处理。也就是让临近的像素具有更高的重要度。对周围像素计算加权平均值,较近的像素具有较大的权重值。

比较像我们之间讲到的k近邻算法的意思哈。进行去噪处理之后呢,我们对于平滑图像进行一次Sobel算子梯度运算。

6.2 梯度运算

𝐸𝑑𝑔𝑒𝐺𝑟𝑎𝑑𝑖𝑒𝑛𝑡 𝐺 = 根号下(𝐺𝑥2 + 𝐺𝑦2)
对于方向:𝐴𝑛𝑔𝑙𝑒 𝜃 = 𝑡𝑎𝑛−1(𝐺𝑦/𝐺𝑥)

对于每一个点计算之后的方向就是这样。大小和方向在图中都已经进行了标记。梯度的方向一般总是与边界垂直。梯度方向被归为四类:垂直,水平,和两个对角线。

6.3 非极大值抑制

在获得了梯度和方向后,遍历图像,去除所有不是边界的点。实现方法:逐个遍历像素点,判断当前像素点是否是周围像素点中具有相同方向梯度的最大值。

点A、点B、点C三点具有相同的方向,梯度方向垂直于边缘。判断点A是否为点A、点B、点C的局部最大值 :如果是,保留该点;否则,它被抑制(归零)。

这里就表示在垂直方向上进行了抑制,取出最大值。

6.4 滞后阈值

这里对非极大值抑制之后,我们进行了一次滞后阈值操作,分别取一个最小阈值和一个最大阈值,然后图像像素点的曲线与最大最小阈值相连则保留,如果不相连则抛弃。

我们来看一下边缘检测的结果图:

7、Canny边缘检测的函数及使用

Canny边缘检测的函数是:
edges = cv2.Canny( image, threshold1, threshold2 )
threshold1表示阈值1,threshold2表示阈值2。也就是我们刚刚介绍到的最大最小阈值。

import cv2
import numpy as np
o=cv2.imread("image\\canny.bmp",cv2.IMREAD_GRAYSCALE)
r=cv2.Canny(o,100,200)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()

然后我们在对lena做一次,结果是:

调整阈值,可以控制边缘细节。maxVal、minVal变小,有更多的细节信息。

如果觉得博主的文章还不错或者您用得到的话,可以免费的关注一下博主,如果三连收藏支持就更好啦!这就是给予我最大的支持!

相关文章:

【OpenCV】计算机视觉图像处理基础知识

目录 前言 推荐 1、OpenCV礼帽操作和黑帽操作 2、Sobel算子理论基础及实际操作 3、Scharr算子简介及相关操作 4、Sobel算子和Scharr算子的比较 5、laplacian算子简介及相关操作 6、Canny边缘检测的原理 6.1 去噪 6.2 梯度运算 6.3 非极大值抑制 6.4 滞后阈值 7、Ca…...

Course1-Week3-分类问题

Course1-Week3-分类问题 文章目录 Course1-Week3-分类问题1. 逻辑回归1.1 线性回归不适用于分类问题1.2 逻辑回归模型1.3 决策边界 2. 逻辑回归的代价函数3. 实现梯度下降4. 过拟合与正则化4.1 线性回归和逻辑回归中的过拟合4.2 解决过拟合的三种方法4.3 正则化4.4 用于线性回归…...

Dockerfile 指令的最佳实践

这些建议旨在帮助您创建一个高效且可维护的Dockerfile。 一、FROM 尽可能使用当前的官方镜像作为镜像的基础。Docker推荐Alpine镜像,因为它受到严格控制,体积小(目前不到6 MB),同时仍然是一个完整的Linux发行版。 FR…...

Drools 入门:折扣案例

1. 安装 在idea软件中安装Drools 插件&#xff0c;我这里是直接搜索Drools就可以搜到 2. 实现入门案例 2.1 配置pom.xml文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi&q…...

微信小程序中生命周期钩子函数

微信小程序 App 的生命周期钩子函数有以下 7 个&#xff1a; onLaunch(options)&#xff1a;当小程序初始化完成时&#xff0c;会触发 onLaunch&#xff08;全局只触发一次&#xff09;。onShow(options)&#xff1a;当小程序启动或从后台进入前台显示时&#xff0c;会触发 on…...

“无忧文件安全!上海迅软DSE文件加密软件助您轻松管控分公司数据!

许多大型企业集团由于旗下有着分布在不同城市的分支机构&#xff0c;因此在规划数据安全解决方案时&#xff0c;不适合采用市面上常见的集中式部署方式来管控各分部服务器&#xff0c;而迅软DSE文件加密软件支持采用分布式部署的方式来解决这一问题。 企业用户只需在总部内部署…...

详解线段树

前段时间写过一篇关于树状数组的博客树状数组&#xff0c;今天我们要介绍的是线段树&#xff0c;线段树比树状数组中的应用场景更加的广泛。这些问题也是在leetcode 11月的每日一题频繁遇到的问题&#xff0c;实际上线段树就和红黑树 、堆一样是一类模板&#xff0c;但是标准库…...

C语言——指针的运算

1、指针 - 整数 #include<stdio.h> #define N_VALUES 5 int main() {flout values[N_VALUES];flout *vp;for(vp&values[0];vp<&values[N_VALUES]&#xff1b;) //指针的关系运算{*vp0; //指针整数} } 2、指针 - 指针 #include<stdio.h> int main() …...

Apache Hive(部署+SQL+FineBI构建展示)

Hive架构 Hive部署 VMware虚拟机部署 一、在node1节点安装mysql数据库 二、配置Hadoop 三、下载 解压Hive 四、提供mysql Driver驱动 五、配置Hive 六、初始化元数据库 七、启动Hive(Hadoop用户) chown -R hadoop:hadoop apache-hive-3.1.3-bin hive 阿里云部…...

python入门级简易教程

Python是一种高级编程语言&#xff0c;由Guido van Rossum于1991年创建。它是一种通用的、解释型的、高级的、动态的、面向对象的编程语言。 Python的编程哲学是简洁明了&#xff0c;强调代码的可读性和简洁性&#xff0c;使开发人员能够快速开发出正确的代码。Python被广泛用…...

模拟一个集合 里面是设备号和每日的日期

问题&#xff1a; 需要模拟一个集合 里面是设备号和每日的日期 代码如下&#xff1a; static void Main(string[] args){string equipmentCodePar "";DateTime time DateTime.Now; // 获取当前时间DateTime startDate time.AddDays(1 - time.Day);//获取当前月第一…...

antdesign前端一直加载不出来

antdesign前端一直加载不出来 报错&#xff1a;Module “./querystring” does not exist in container. while loading “./querystring” from webpack/container/reference/mf at mf-va_remoteEntry.js:751:11 解决方案&#xff1a;Error: Module “xxx“ does not exist …...

排序算法介绍(一)插入排序

0. 简介 插入排序&#xff08;Insertion Sort&#xff09; 是一种简单直观的排序算法&#xff0c;它的工作原理是通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。插入排序在实现上&#xff0c;通常…...

2023新优化应用:RIME-CNN-LSTM-Attention超前24步多变量回归预测算法

程序平台&#xff1a;适用于MATLAB 2023版及以上版本。 霜冰优化算法是2023年发表于SCI、中科院二区Top期刊《Neurocomputing》上的新优化算法&#xff0c;现如今还未有RIME优化算法应用文献哦。RIME主要对霜冰的形成过程进行模拟&#xff0c;将其巧妙地应用于算法搜索领域。 …...

RNN:文本生成

文章目录 一、完整代码二、过程实现2.1 导包2.2 数据准备2.3 字符分词2.4 构建数据集2.5 定义模型2.6 模型训练2.7 模型推理 三、整体总结 采用RNN和unicode分词进行文本生成 一、完整代码 这里我们使用tensorflow实现&#xff0c;代码如下&#xff1a; # 完整代码在这里 imp…...

Rust UI开发(五):iced中如何进行页面布局(pick_list的使用)?(串口调试助手)

注&#xff1a;此文适合于对rust有一些了解的朋友 iced是一个跨平台的GUI库&#xff0c;用于为rust语言程序构建UI界面。 这是一个系列博文&#xff0c;本文是第五篇&#xff0c;前四篇链接&#xff1a; 1、Rust UI开发&#xff08;一&#xff09;&#xff1a;使用iced构建UI时…...

Linux学习笔记2

web服务器部署&#xff1a; 1.装包&#xff1a; [rootlocalhost ~]# yum -y install httpd 2.配置一个首页&#xff1a; [rootlocalhost ~]# echo i love yy > /var/www/html/index.html 启动服务&#xff1a;[rootlocalhost ~]# systemctl start httpd Ctrl W以空格为界…...

数据结构算法-插入排序算法

引言 玩纸牌 的时候。往往 需要将牌从乱序排列变成有序排列 这就是插入排序 插入排序算法思想 先看图 首先第一个元素 我默认已有序 那我们从第二个元素开始&#xff0c;依次插入到前面已有序的部分中。具体来说&#xff0c;我们将第二个元素与第一个元素比较&#xff0c;…...

安装Kuboard管理K8S集群

目录 第一章.安装Kuboard管理K8S集群 1.安装kuboard 2.绑定K8S集群&#xff0c;完成信息设定 3.内网安装 第二章.kuboard-spray安装K8S 2.1.先拉镜像下来 2.2.之后打开后&#xff0c;先熟悉功能&#xff0c;注意版本 2.3.打开资源包管理&#xff0c;选择符合自己服务器…...

网络安全行业大模型调研总结

随着人工智能技术的发展&#xff0c;安全行业大模型SecLLM&#xff08;security Large Language Model&#xff09;应运而生&#xff0c;可应用于代码漏洞挖掘、安全智能问答、多源情报整合、勒索情报挖掘、安全评估、安全事件研判等场景。 参考&#xff1a; 1、安全行业大模…...

Linux AMH服务器管理面板本地安装与远程访问

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 1. Linux 安装AMH 面板2. 本地访问AMH 面板3. Linux安装…...

Sharding-Jdbc(3):Sharding-Jdbc分表

1 分表分库 LogicTable 数据分片的逻辑表&#xff0c;对于水平拆分的数据库(表)&#xff0c;同一类表的总称。 订单信息表拆分为2张表,分别是t_order_0、t_order_1&#xff0c;他们的逻辑表名为t_order。 ActualTable 在分片的数据库中真实存在的物理表。即上个示例中的t_…...

zookeeper集群 +kafka集群

1.zookeeper kafka3.0之前依赖于zookeeper zookeeper是一个开源&#xff0c;分布式的架构&#xff0c;提供协调服务&#xff08;Apache项目&#xff09; 基于观察者模式涉及的分布式服务管理架构 存储和管理数据&#xff0c;分布式节点上的服务接受观察者的注册&#xff0c…...

2022年全国大学生数据分析大赛医药电商销售数据分析求解全过程论文及程序

2022年全国大学生数据分析大赛 医药电商销售数据分析 原题再现&#xff1a; 问题背景   20 世纪 90 年代是电子数据交换时代&#xff0c;中国电子商务开始起步并初见雏形&#xff0c;随后 Web 技术爆炸式成长使电子商务处于蓬勃发展阶段&#xff0c;目前互联网信息碎片化以…...

Python版本与opencv版本的对应关系

python版本要和opencv版本相对应&#xff0c;否则安装的时候会报错。 可以到Links for opencv-python上面查看python版本和opencv版本的对应关系&#xff0c;如图&#xff0c;红框内是python版本&#xff0c;绿框内是opencv版本。 查看自己的python版本后&#xff0c;使用下面…...

【开源视频联动物联网平台】LiteFlow

LiteFlow是一个轻量且强大的国产规则引擎框架&#xff0c;可用于复杂的组件化业务的编排领域。它基于规则文件来编排流程&#xff0c;支持xml、json、yml三种规则文件写法方式&#xff0c;再复杂的逻辑过程都能轻易实现。LiteFlow于2020年正式开源&#xff0c;2021年获得开源中…...

家用智能门锁——智能指纹锁方案

智能指纹锁产品功能&#xff1a; 1&#xff1a;指纹识别技术&#xff1a;光学传感器、半导体传感器或超声波传感器等。 2&#xff1a;指纹容量&#xff1a;智能指纹锁可以存储的指纹数量&#xff0c;通常在几十到几百个指纹之间。 3&#xff1a;解锁时间&#xff1a;指纹识别和…...

Qt6 QRibbon 一键美化Qt界面

强烈推荐一个 github 项目&#xff1a; https://github.com/gnibuoz/QRibbon 作用&#xff1a; 在几乎不修改任何你自己代码的情况下&#xff0c;一键美化你的 UI 界面。 代码环境&#xff1a;使用 VS2019 编译 Qt6 GUI 程序&#xff0c;继承 QMainWindow 窗口类 一、使用方法 …...

JAVA IO:NIO

1.阻塞 IO 模型 ​ 最传统的一种 IO 模型&#xff0c;即在读写数据过程中会发生阻塞现象。当用户线程发出 IO 请求之后&#xff0c;内核会去查看数据是否就绪&#xff0c;如果没有就绪就会等待数据就绪&#xff0c;而用户线程就会处于阻塞状态&#xff0c;用户线程交出 CPU。当…...

Python 在控制台打印带颜色的信息

#格式&#xff1a;  设置颜色开始 &#xff1a;\033[显示方式;前景色;背景色m #说明&#xff1a; 前景色 背景色 颜色 --------------------------------------- 30 40 黑色 31 41 红色 32 …...

SQL Server 数据库,创建触发器避免数据被更改

5.4触发器 触发器是一种特殊类型的存储过程&#xff0c;当表中的数据发生更新时将自动调用&#xff0c;以响应INSERT、 UPDATE 或DELETE 语句。 5.4.1什么是触发器 1.触发器的概念 触发器是在对表进行插入、更新或删除操作时自动执行的存储过程&#xff0c;触发器通常用于强…...

C语言实现植物大战僵尸(完整版)

实现这个游戏需要Easy_X 这个在我前面一篇C之番外篇爱心代码有程序教你怎么下载&#xff0c;大家可自行查看 然后就是需要植物大战僵尸的素材和音乐&#xff0c;需要的可以在评论区 首先是main.cpp //开发日志 //1导入素材 //2实现最开始的游戏场景 //3实现游戏顶部的工具栏…...

基于YOLOv8深度学习的火焰烟雾检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…...

【C++】手撕string思路梳理

目录 基本思路 代码实现 1.构建框架&#xff1a; 2.构建函数重载 3.迭代器&#xff1a; 4.遍历string 5.resetve 开空间&#xff0c;insert任意位置插入push_back,append,(按顺序依次实现) 6.erase删除&#xff0c;clear清除&#xff0c;resize缩容 7.流插入&#xff0…...

【数据结构和算法】确定两个字符串是否接近

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1操作 1 的本质&#xff1a;字符可以任意排列 2.2操作 2 的本质&#xff1a;出现次数是可以交换的 2.…...

[足式机器人]Part2 Dr. CAN学习笔记-Ch0-1矩阵的导数运算

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-Ch0-1矩阵的导数运算 1. 标量向量方程对向量求导&#xff0c;分母布局&#xff0c;分子布局1.1 标量方程对向量的导数1.2 向量方程对向量的导数 2. 案例分析&#xff0c;线性回归3. 矩阵求导的链…...

如何让软文更具画面感,媒介盒子分享

写软文这种带有销售性质的文案时&#xff0c;总说要有画面感&#xff0c;要有想象空间。只有针对目标用户的感受的设计&#xff0c;要了解用户想的是什么&#xff0c;要用可视化的描述来影响用户的感受&#xff0c;今天媒介盒子就和大家分享&#xff1a;如何让软文更具画面感。…...

Hadoop学习笔记(HDP)-Part.19 安装Kafka

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …...

Arrays类练习 - Java

案例&#xff1a;自定义Book类&#xff0c;里面包含name和price&#xff0c;按price排序(从大到小)。要求使用两种方式排序&#xff0c;有一个 Book[] books 4本书对象。 使用前面学习过的传递实现Comparator接口匿名内部类&#xff0c;也称为定制排序。可以按照price (1)从大到…...

Java多线程:代码不只是在‘Hello World‘

Java线程好书推荐 概述01 多线程对于Java的意义02 为什么Java工程师必须掌握多线程03 Java多线程使用方式04 如何学好Java多线程写在末尾&#xff1a; 主页传送门&#xff1a;&#x1f4c0; 传送 概述 摘要&#xff1a;互联网的每一个角落&#xff0c;无论是大型电商平台的秒杀…...

使用PCSS实现的实时阴影效果

PCSS的技术可以使得阴影呈现出近硬远软的效果&#xff0c;并且能够实时实现。 其核心理念是通过模拟光源的面积来产生更自然、更柔和的阴影边缘。 具体步骤&#xff1a; 1、生成shadowmap 2、在进行阴影的比较时候进行平均&#xff0c;并非之前的shadow map 或者之后完全的阴影…...

用于缓存一些固定名称的小组件

项目中&#xff0c;用于缓存姓名、地名、单位名称等一些较固定名称的id-name小组件。用于减少一些表的关连操作和冗余字段。优化代码结构。扩展也方便&#xff0c;写不同的枚举就行了。 具体用法&#xff1a; {NameCacheUser.USER.getName(userId);NameCacheUser.ACCOUNT.getN…...

Python 读取电子发票PDF 转成Excel

Python 读取电子发票PDF 转成Excel 目录 0.前提 1.python相关的处理PDF的库 2.实际好用的 3.实际代码 4.思考 0.前提 只识别普通电子发票PDF&#xff0c;提取其中某些关键内容到excel中。 1.python相关的处理PDF的库 如下4个库是经常更新维护的&#xff01; pyP…...

我的项目问题

1.一点缩放和旋转就消失&#xff0c;需要再次平移才出现 解决方案&#xff1a;在显示当前图形时&#xff0c;显示已有图形。 2.每次点击平移&#xff0c;图形移动到上次点击的位置。 ho_RegionUnion.Dispose(); ho_RegionUnion ExpTmpOutVar_0;这两段代码放到显示之后的&am…...

【c】杨辉三角

下面介绍两种方法 1.利用上面性质的第五条&#xff0c;我们可以求各行各列的组合数 2.利用上面性质的第7条&#xff0c;我们可以用数组完成 下面附上代码 1. #include<stdio.h> void fact(int n ,int m )//求组合数 {long long int sum11;long long int sum21;int a…...

算法刷题之数组篇

题目一&#xff1a;两数之和 给出一个整型数组 numbers 和一个目标值 target&#xff0c;请在数组中找出两个加起来等于目标值的数的下标&#xff0c;返回的下标按升序排列。 &#xff08;注&#xff1a;返回的数组下标从1开始算起&#xff0c;保证target一定可以由数组里面2…...

TR转发路由器测评—云企业网实现跨地域跨VPC的网络互通测评实战【阿里云产品测评】

文章目录 一.转发路由器 Transit Router 测评1.1 准备阶段1.2 本文测评收获1.3 什么是云企业网实例、转发路由器实例和云数据传输服务 二.使用云企业网实现跨地域跨VPC的网络互通2.2 **测试连通性**2.3 网络拓扑如下&#xff1a; 心得&#xff1a;总结&#xff1a; 声明&#x…...

1.1美术理论基础

一、光影 物体呈现在人们眼前的时候&#xff0c;不同的受光面其明暗变化以及物体的影子。 1.什么是黑白灰 在美术中黑白灰指亮面、灰面、暗面&#xff0c;属于素描的三大面&#xff0c;主要体验一个物体的整体寿光过程。普遍存在于各种艺术和设计领域。黑白灰作品的出现&#x…...

【Java 基础】21 多线程同步与锁

文章目录 1.存在的问题2.使用同步解决问题1) synchronized2) volatile3) 锁 总结 用多线程过程中&#xff0c;有可能出现 多个线程同时处理&#xff08;获取或修改等&#xff09;同一个数据&#xff0c;这个时候就 会发生数据不同步的问题&#xff0c; 因此出现了同步和锁来…...

Python语言基础知识(一)

文章目录 1、Python内置对象介绍2、标识符与变量3、数据类型—数字4、数据类型—字符串与字节串5、数据类型—列表、元组、字典、集合6、运算符和表达式7、运算符和表达式—算术运算符8、运算符和表达式—关系运算符9.1、运算符和表达式— 成员测试运算符in9.2、运算符和表达式…...