Python+OpenCV裂缝面积识别系统(部署教程&源码)

1.研究背景与意义

随着科技的不断发展,计算机视觉技术在各个领域中得到了广泛的应用。其中,图像处理是计算机视觉中的一个重要分支,它通过对图像进行数字化处理,提取出其中的有用信息,为后续的分析和应用提供支持。而裂缝面积识别系统是图像处理中的一个重要应用,它可以对裂缝进行自动化的检测和识别,为工程领域中的裂缝维护和修复提供帮助。

裂缝是建筑物和基础设施中常见的问题,它们的存在会对结构的稳定性和安全性产生重大影响。因此,及早发现和修复裂缝是非常重要的。然而,传统的裂缝检测方法通常需要人工参与,费时费力且容易出错。因此,开发一种自动化的裂缝面积识别系统具有重要的意义。

Python是一种简单易学且功能强大的编程语言,而OpenCV是一个开源的计算机视觉库,提供了丰富的图像处理和分析功能。将Python和OpenCV结合起来,可以快速开发出高效的图像处理算法,为裂缝面积识别系统的开发提供了便利。

本研究的目标是开发一个基于Python和OpenCV的裂缝面积识别系统,并提供相应的部署教程和源码。该系统将通过图像处理算法自动检测和识别裂缝,并计算出裂缝的面积。通过该系统,用户可以快速准确地获取裂缝的面积信息,为后续的维护和修复工作提供参考。

本研究的意义主要体现在以下几个方面:

  1. 提高工作效率:传统的裂缝检测方法需要人工参与,费时费力且容易出错。而基于Python和OpenCV的裂缝面积识别系统可以实现自动化的裂缝检测和识别,大大提高了工作效率。

  2. 提高准确性:人工参与的裂缝检测容易受到主观因素的影响,结果的准确性无法保证。而基于图像处理算法的裂缝面积识别系统可以准确地计算出裂缝的面积,提高了结果的准确性。

  3. 降低成本:传统的裂缝检测方法需要大量的人力和时间投入,成本较高。而基于Python和OpenCV的裂缝面积识别系统可以实现自动化的裂缝检测和识别,降低了成本。

  4. 推动技术发展:本研究将Python和OpenCV应用于裂缝面积识别系统的开发,为相关领域的技术发展提供了一个实践案例。同时,提供部署教程和源码,可以为其他研究者和开发者提供参考和借鉴。

综上所述,基于Python和OpenCV的裂缝面积识别系统具有重要的研究意义和实际应用价值。通过该系统的开发和推广应用,可以提高工作效率、准确性和降低成本,推动相关领域的技术发展。

2.图片演示

2.png

3.png

4.png

3.视频演示

Python+OpenCV裂缝面积识别系统(部署教程&源码)_哔哩哔哩_bilibili

4.系统流程图

本文通过计算机视觉技术处理图像,期望达到人工检测的效果,满足实际需求,并且避免人工检测存在的效率低、危险及易受人为主观因素影响等不足。路面裂缝检测主要有以下三个方面功能需求:
(1)对一幅路面图像无需人为肉眼辨别,可自动检测有无裂缝并标出裂缝所在区域。(2)对存在裂缝的图像提取出裂缝。
(3)自动识别裂缝类型,并计算相应参数。
因此采用的计算机视觉技术具体流程如图所示。
image.png
得到图像后首先要对图像预处理以提高图像质量。灰度化减少图像数据量、提高处理速度;为增强裂缝与背景的对比度,本文对直方图均衡化、分段线性法和 gamma校正处理的效果做了对比,最后选用gamma校正做对比度增强处理;为减少路面非裂缝区的噪声干扰,本文对均值滤波、中值滤波、高斯滤波和双边滤波处理图像的效果做了对比,最后结合路面噪声特性以及各类滤波算法的特性,通过先做中值滤波再做双边滤波完成去噪,降低检测裂缝有无及裂缝提取工作的难度。
预处理后检测图像中有无裂缝,标记有裂缝的区域。训练一个机器学习分类模型,用这个机器学习模型检测图像中是否存在裂缝,实现自动检测功能。通过将图像分成多个小块,检测每个小块中是否存在裂缝,如果存在裂缝,则对这个小块做标记,如果不存在则不做标记,完成裂缝定位工作。
对于存在裂缝的图像,要提取裂缝、识别裂缝类型并计算其相应的参数。通过局部自适应阈值分割算法将裂缝及灰度与裂缝相近的图像块分割出,然后提取图像中连通域轮廓,计算连通域轮廓参数,筛选出裂缝连通域去除噪声连通域。提取出裂缝后识别裂缝类型,本文对投影法识别裂缝类型的方式做了改进,引入面积特征,利用投影特征识别出横向、纵向裂缝,对非横、纵向裂缝图像以一个较大的结构做形态学闭运算后,以此时的裂缝面积作为识别标准识别出斜向、网状裂缝。对线性裂缝计算长度和最大宽度,将裂缝细化提取骨架,统计裂缝骨架上的像素数作为长度,每次腐蚀会剥离裂缝最外面一层,统计完全去除裂缝需要的腐蚀次数,将其乘上2得到裂缝的最大宽度;对网状裂缝计算其分布面积,通过求裂缝凸包面积来近似裂缝分布面积,这种方式优于传统求外接矩形面积来近似裂缝面积的方式。

5.核心代码讲解

5.1 CrackDetection.py

下面是封装为类后的代码:


class CrackDetector:
    def __init__(self, input_image_path, output_image_path):
        self.input_image_path = input_image_path
        self.output_image_path = output_image_path

    def detect_cracks(self):
        # Read input image
        img = cv2.imread(self.input_image_path)

        # Convert into gray scale
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

        # Image processing (smoothing)
        blur = cv2.blur(gray, (3, 3))

        # Apply logarithmic transform
        img_log = (np.log(blur + 1) / (np.log(1 + np.max(blur)))) * 255
        img_log = np.array(img_log, dtype=np.uint8)

        # Image smoothing: bilateral filter
        bilateral = cv2.bilateralFilter(img_log, 5, 75, 75)

        # Canny Edge Detection
        edges = cv2.Canny(bilateral, 100, 200)

        # Morphological Closing Operator
        kernel = np.ones((5, 5), np.uint8)
        closing = cv2.morphologyEx(edges, cv2.MORPH_CLOSE, kernel)

        # Create feature detecting method
        orb = cv2.ORB_create(nfeatures=1500)
        ......

这个类封装了图像裂缝检测的功能,通过调用detect_cracks方法可以进行裂缝检测并保存结果图像。

这个程序文件名为CrackDetection.py,主要功能是对裂纹图像进行裂纹检测。

程序首先导入了必要的库,包括numpy、cv2和matplotlib.pyplot。

然后,程序读取了一个裂纹样本图像,将其转换为灰度图像。

接下来,程序对图像进行了一系列的图像处理操作。首先进行了平滑处理,使用了均值滤波器进行图像平滑。然后,应用了对数变换,将图像进行了对数变换,增强了图像的对比度。接着,使用双边滤波器对图像进行了平滑处理。然后,使用Canny边缘检测算法对图像进行了边缘检测。最后,使用形态学闭运算算子对边缘图像进行了形态学闭运算。

接下来,程序创建了一个特征检测方法,使用了ORB算法进行特征检测。然后,程序使用ORB算法检测并计算了图像的关键点和描述符,并绘制了关键点的特征图像。

最后,程序将输出的特征图像保存为文件,并使用plot函数显示原始图像和输出图像。

5.2 crack_detect_opencv.py

class CrackDetector:
    def __init__(self, image_path):
        self.image_path = image_path
        self.with_nmsup = True
        self.fudgefactor = 1.8
        self.sigma = 21
        self.kernel = 2 * math.ceil(2 * self.sigma) + 1

    def orientated_non_max_suppression(self, mag, ang):
        ang_quant = np.round(ang / (np.pi/4)) % 4
        winE = np.array([[0, 0, 0],[1, 1, 1], [0, 0, 0]])
        winSE = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]])
        winS = np.array([[0, 1, 0], [0, 1, 0], [0, 1, 0]])
        winSW = np.array([[0, 0, 1], [0, 1, 0], [1, 0, 0]])

        magE = self.non_max_suppression(mag, winE)
        magSE = self.non_max_suppression(mag, winSE)
        magS = self.non_max_suppression(mag, winS)
        magSW = self.non_max_suppression(mag, winSW)

        mag[ang_quant == 0] = magE[ang_quant == 0]
        mag[ang_quant == 1] = magSE[ang_quant == 1]
        mag[ang_quant == 2] = magS[ang_quant == 2]
        mag[ang_quant == 3] = magSW[ang_quant == 3]
        return mag

    def non_max_suppression(self, data, win):
        data_max = scipy.ndimage.filters.maximum_filter(data, footprint=win, mode='constant')
        data_max[data != data_max] = 0
        return data_max

    def detect_cracks(self):
        gray_image = cv2.imread(self.image_path, 0)

        gray_image = gray_image / 255.0
        blur = cv2.GaussianBlur(gray_image, (self.kernel, self.kernel), self.sigma)
        gray_image = cv2.subtract(gray_image, blur)

        sobelx = cv2.Sobel(gray_image, cv2.CV_64F, 1, 0, ksize=3)
        sobely = cv2.Sobel(gray_image, cv2.CV_64F, 0, 1, ksize=3)
        mag = np.hypot(sobelx, sobely)
        ang = np.arctan2(sobely, sobelx)

        threshold = 4 * self.fudgefactor * np.mean(mag)
        mag[mag < threshold] = 0
        ......

这个程序文件是用于检测裂缝的,文件名为crack_detect_opencv.py。它使用了OpenCV库来进行图像处理和计算。主要的功能包括:

  1. 导入所需的库和模块。
  2. 定义了一个函数orientated_non_max_suppression,用于进行方向非极大值抑制。
  3. 定义了一个函数non_max_suppression,用于进行非极大值抑制。
  4. 读取灰度图像。
  5. 对图像进行预处理,包括应用高斯模糊、减去模糊图像、计算Sobel响应等。
  6. 对Sobel响应进行阈值处理。
  7. 根据是否应用非极大值抑制,进行不同的处理。
  8. 显示处理结果。

整个程序的目的是检测图像中的裂缝,并将结果显示出来。

6.系统整体结构

整体功能和构架概括:

这个工程是一个裂缝面积识别系统,主要用于检测和分析图像中的裂缝。它包含了多个程序文件,每个文件负责不同的功能。其中,CrackDetection.py文件用于裂缝检测,crack_detect_opencv.py文件用于裂缝检测和处理,main.py文件用于处理和分析图片中的裂缝,ui.py文件是一个基于PyQt5的图形用户界面程序,用于运行目标检测模型。

下表整理了每个文件的功能:

文件名功能
CrackDetection.py对裂缝图像进行裂缝检测的程序,包括图像处理和特征检测
crack_detect_opencv.py检测裂缝的程序,使用OpenCV库进行图像处理和计算
main.py处理和分析图片中的裂缝的程序,包括图像处理、轮廓提取和面积计算
ui.py基于PyQt5的图形用户界面程序,用于运行裂缝检测模型

以上是对每个文件的简要功能概述,每个文件的具体实现可能还包含其他细节和辅助函数。

7.图像预处理流程

每个图像都可以视为一个矩阵,图像中的像素就是矩阵中的数,图像中包含了大量的数据。对图像处理需要对矩阵中所有数据处理,计算量非常大,而且图像中目标信息往往比较少,存在大量的无用信息。为了方便后续的裂缝检测提取工作,首先要对采集到的图像做预处理,以提高图像质量。预处理主要分为以下三个方面:
(⑴图像灰度化,将三通道图像变为单通道图像,灰度图保留了彩色图相同的像素亮度信息,且只有单个通道,处理灰度图计算量会大大减少,同时保留了大部分的图像信息,因此本文先对图像灰度化后再做后续处理。
(2)对比度增强,因图像采集设备和采集环境等因素,最初采集到的图像裂缝和背景的对比度较低,要增强对比度。
(3)去噪,路面本身就存在各种不规则的噪声,摄像机获取图像过程中又会引入一些新的噪声,大量的噪声极大的增加了检测提取裂缝的难度,要通过滤波算法减少图像中的噪声干扰。
如图所示是路面图像的预处理流程图。
image.png

8.直方图均衡化

直方图均衡化就是调整图像中像素灰度直方图中灰度的分布范围,改变原来图像中像素灰度集中在某个区域的现象,让所有像系仕0度值的汜团内均习力,心到本小N图像对比度增强的效果[7]。直方图均衡化本质上就是对原始图像像素分布直方图做非线性拉伸,增大像素的分布范围,属于对图像的一种空域处理方式可以将直方图均衡化对图像的操作做这样的归纳:设f(xy)是点(t,y)处图像的灰度值,g(xy)是处理后的图像的灰度值,像素的范围是О到L-1,这样的一个变化可以通过映射函数得到,这个映射函数必须满足这样两个条件:
(1)当0≤f(x,y)≤L-1时,映射函数是单调函数,保证灰度级的顺序不变,原来怎样的顺序变化后还是这个顺序。
(2)当0≤f(x, y)≤L-1时,满足0≤g(x,y)≤L-1,保证变化后图像像素的范围与之前一样。对原始图做直方图均衡化处理的过程如公式所示。
image.png
image.png

比较图可以看出,原图像的直方图有明显的峰值,均衡化处理后峰值变得不明显像素分布也变得比较均匀。一幅路面图像其原始图和对其做直方图均衡化的效果如图所示。
image.png

9.轮廓跟踪与筛选

经局部自适应阈值分割处理后得到一个二值图像,图像中不仅存在裂缝区域,还存在不少噪声块,这些噪声块和裂缝区域一样也属于局部灰度极值点。这些噪声点有的比较大,一般的滤波去噪方式难以去除。本文通过图像中连通域的形状和面积特征筛选出裂缝区域和噪声区域,首先要提取连通域轮廓,然后计算连通域轮廓的圆形度和面积,筛选出裂缝区域。
本文通过OpenCV中提供的 findContours函数提取二值图像中连通域的轮廓,函数findContours的理论依据是文献[54]中提到的算法。文中提到了两种算法对二值图像做拓扑分析,第一种算法用编码的方式确定图像的外层边界、内部孔边界以及内外层边界的层次关系,然后用边界表示原图像。第二种算法基于第一种算法,所求的只是最外层边界。编码的思想是:对不同边界赋不同值,来区别这两个边界及确定层次关系。输入图像是一个二值图像,设f(ij)为图像上像素值,对这个二值图像逐行做扫描当f(ij-1)=0且f(i.j)=1时,把f(i.j)视为外边界的起点,当fi,j)≥1且f(i.j+I)=0时,将f(,y)视为孔边界的起点。将初始边界作为起始位置标记边界像素,当扫描得到一个新的边界点时,为其分配一个标识NBD初始值为1,当遇到fip.q)=l,f(p,q+I)时,将f(p.q)的标识符设为-NBD,这就标志着边界的终止。
用findContours 函数得到轮廓后,将得到的轮廓存储在C++的STL容器Vector中,存储的数据类型是vector型的,因为每一个跟踪得到的轮廓都是一个个像素点组成的,每个像素点存储在vector里面。得到了这些轮廓之后就要设定一些参数来区分裂缝和噪声,从而筛选出裂缝去掉噪声,设定的参数有:
⑴连通域面积:A
通过opencv中提供的cvContourArea函数可求得连通域轮廓的面积。
(2)圆形度:R
圆形度本质上表示的当前目标形状与圆的相似程度,一般来说越是复杂的边界其圆形度就会越小,圆形度表达式如公式所示。
image.png
公式中A表示连通域轮廓的面积,L表示这个连通域轮廓的周长,利用OpenCV
中提供的cvContourPerimeter函数能得到连通域轮廓的周长。根据上式可以看出,目标越接近圆那么它的圆形度就越大,如果目标为圆形那它的圆形度就是1。
本文通过这两个参数来筛选连通域区分裂缝和噪声,最后将裂缝保留去掉噪声。对于裂缝,它的连通域的轮廓应该满足以下条件:
(1)面积比较大。通过之前的分割处理,留下的噪声点大多数面积会比较小,相对来说裂缝区域面积就比较大。
(2)圆形度较小。裂缝区域连通域的轮廓会比较复杂、不规则,某种程度上会显示出一定的线性特点,圆形度就比较小;而噪声在多数情况下是块状的,这样圆形度就比较大。
最后将删除了噪声后保留下来的轮廓重新绘制到一个新的图像上,用OpenCV中的drawContours 函数绘制轮廓。本文设定的圆形度是0.25,将圆形度大于0.25连通域删去,本文设定的面积参数取的是50个像素,将面积小于50个像素的连通域去掉,最后得到的结果如图所示。
image.png

10.系统整合

下图完整源码&环境部署视频教程&数据集&自定义UI界面
1.png

参考博客《Python+OpenCV裂缝面积识别系统(部署教程&源码)》

11.参考文献


[1]张磊.基于图像处理的公路路面裂缝检测技术研究[J].机械设计与制造工程.2017,(2).DOI:10.3969/j.issn.2095-509X.2017.02.019.

[2]朱力强,王春薇,王耀东,等.基于特征点集距离描述的裂缝图像匹配算法研究[J].仪器仪表学报.2016,(12).

[3]钱彬,唐振民,沈肖波,等.基于多特征流形学习和矩阵分解的路面裂缝检测[J].仪器仪表学报.2016,(7).DOI:10.3969/j.issn.0254-3087.2016.07.025.

[4]张宏,英红.频域滤波的水泥路面图像降噪增强方法[J].土木建筑与环境工程.2015,(3).DOI:10.11835/j.issn.1674-4764.2015.03.007.

[5]李爱霞,管海燕,钟良,等.基于张量投票的道路表面裂缝检测[J].应用科学学报.2015,(5).DOI:10.3969/j.issn.0255-8297.2015.05.008.

[6]姒绍辉,胡伏原,顾亚军,等.一种基于不规则区域的高斯滤波去噪算法[J].计算机科学.2014,(11).DOI:10.11896/j.issn.1002-137X.2014.11.062.

[7]杨洋,王卫星.基于差分计盒法和数学形态学的路面裂缝分割和提取方法[J].科学技术与工程.2013,(23).DOI:10.3969/j.issn.1671-1815.2013.23.017.

[8]李小红,谢成明,贾易臻,等.基于ORB特征的快速目标检测算法[J].电子测量与仪器学报.2013,(5).DOI:10.3724/SP.J.1187.2013.00455.

[9]XU Xue-jun,ZHANG Xiao-ning.Crack detection of reinforced concrete bridge using video image[J].中南大学学报(英文版).2013,(9).DOI:10.1007/s11771-013-1775-5.

[10]黎蔚,高璐.基于改进的分水岭算法的路面裂缝检测[J].计算机工程与应用.2013,(20).DOI:10.3778/j.issn.1002-8331.1210-0221.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于SSM的校园活动资讯网设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

dolphinscheduler任务莫名重跑

dolphinscheduler运行了一段时间&#xff0c;忽然发现一个流程下某个任务一直在自动重跑&#xff0c;把工作流删了&#xff0c;任务删了&#xff0c;下线等等&#xff0c;都不能阻止他重复的运行&#xff0c;每秒1次&#xff0c;真是见了鬼 1、把zookeeper停掉发现不再重跑了 …

79基于matlab的大米粒中杂质识别

基于matlab的大米粒中杂质识别&#xff0c;数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。 79matlab图像处理杂质识别 (xiaohongshu.com)

动态神经网络时间序列预测

大家好&#xff0c;我是带我去滑雪&#xff01; 神经网络投照是否存在反锁与记忆可以分为静态神经网络与动态神经网络。动态神经网络是指神经网络带有反做与记忆功能&#xff0c;无论是局部反馈还是全局反锁。通过反馈与记忆&#xff0c;神经网络能将前一时刻的数据保留&#x…

C语言经典好题:字符串左旋(详解)

这题还是比较简单的&#xff0c;各位看完有收获吗 #include<stdio.h> #include<string.h> void leftturn(char arr[],int k) {int len strlen(arr);for (int i 0;i <k;i)//左旋k个字符{//创建临时变量char tmp 0;tmp arr[0];//将数组第一个字符存储到临时变…

函数模板(成长版)

与普通函数区别&#xff1a;1.多了个template<class T>;2.某些确定类型变不确定类型T 一&#xff1a;引子&#xff1a; #include<iostream> using namespace std; template<typename T> T Max(T a, T b) {return a > b ? a : b; } int main() {int x, …

计算机毕业设计选题推荐-网上产品商城-Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

云原生Docker系列 | Docker私有镜像仓库公有镜像仓库使用

云原生Docker系列 | Docker私有镜像仓库&公有镜像仓库使用 1. 使用公有云镜像仓库1.1. 阿里云镜像仓库1.2. 华为云镜像仓库1.3. 腾讯云镜像仓库2. 使用Docker Hub镜像仓库3. 使用Harbor构建私有镜像仓库4. 搭建本地Registry镜像仓库1. 使用公有云镜像仓库 1.1. 阿里云镜像…

七、HDFS文件系统的存储原理

1、总结 之所以把总结放在文件开头&#xff0c;是为了让读者对这篇文章有更好的理解&#xff0c;&#xff08;其实是因为我比较懒……&#xff09; 对于整个HDFS文件系统的存储原理&#xff0c;我们可以总结为一句话&#xff0c;那就是&#xff1a; 分块备份 2、存储结构和问题…

O-Star|再相识

暑去秋来&#xff0c;岁月如梭&#xff0c;几名"O-Star"们已经入职一段时间&#xff0c;在这期间他们褪去青涩&#xff0c;逐渐适应了公司的工作环境和文化&#xff0c;迈向沉稳&#xff5e; 为了进一步加深校招生之间的交流与了解&#xff0c;提高校招生的凝聚力和…

易航网址引导系统 v1.9 源码:去除弹窗功能的易航网址引导页管理系统

易航自主开发了一款极其优雅的易航网址引导页管理系统&#xff0c;后台采用全新的光年 v5 模板开发。该系统完全开源&#xff0c;摒弃了后门风险&#xff0c;可以管理无数个引导页主题。数据管理采用易航原创的JsonDb数据包&#xff0c;无需复杂的安装解压过程即可使用。目前系…

第4章 向量、SIMD和GPU体系结构中的数据级并行

4.1 引言 有多少应用程序拥有大量的数据级并行DLP&#xff1f;SIMD分类Flyn被提出后5年。答案不仅包括科学运算中的矩阵运算&#xff0c;还包括面向多媒体的图像和声音处理以及机器学习算法。 由于SIMD可以执行多个数据操作&#xff0c;能效比MIMD要高&#xff0c;使得SIMD对…

小红书全自动加群引流脚本「 软件工具+引流技术教程」

软件介绍&#xff1a; 小红书群聊最新玩法&#xff0c;可自动检测群人数加群&#xff0c;不会加到垃圾群。定时发送广告&#xff0c;红书群聊的引流玩法回来了 功能一、自动搜索关键词加群&#xff0c;比如创业、项目、鞋子、包包、考公、考研… 功能二、自动检测群人数&…

电子学会C/C++编程等级考试2022年09月(一级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:指定顺序输出 依次输入3个整数a、b、c,将他们以c、a、b的顺序输出。 时间限制:1000 内存限制:65536输入 一行3个整数a、b、c,以空格分隔。 0 < a,b,c < 108输出 一行3个整数c、a、b,整数之间以一个空格分隔。样例输入…

03-基于Feign的远程调用,详解Feign的自定义配置和优化,创建Feign模块

Feign远程调用 Feign替代RestTemplate 利用RestTemplate发起远程调用的代码的缺点 代码可读性差编程体验不统一 , 面对参数复杂的URL难以维护 String url "http://user-service/user/" order.getUserId(); User user restTemplate.getForObject(url, User.cla…

【Proteus仿真】【Arduino单片机】多功能数字时钟设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用PCF8574、LCD1602液晶、DS1302温度传感器、DS1302时钟、按键、蜂鸣器等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示当前日期…

【DevOps】Git 图文详解(六):Git 利器 - 分支

Git 利器 - 分支 1.分支 Branch2.分支指令 &#x1f525;3.分支的切换 checkout4.合并 merge & 冲突4.1 &#x1f538; 快速合并&#xff08;Fast forward&#xff09;4.2 &#x1f538; 普通合并4.3 处理冲突 <<<<<<< HEAD 5.变基 rebase 分支是从主…

【C++进阶之路】第十一篇:C++的IO流

文章目录 1. C语言的输入与输出2. 流是什么3. CIO流3.1 C标准IO流3.2 C文件IO流 4.stringstream的简单介绍 1. C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取数据&#xff0c;并将值存放在变量中。prin…

【鸿蒙应用ArkTS开发系列】- 灌水区,鸿蒙ArkTs开发有问题可以在该帖中反馈

大家好, 这是一篇水贴&#xff0c;给大家提供一个交流沟通鸿蒙开发遇到问题的地方。 新增新增这个文章呢&#xff0c;大家在开发使用ArkTS开发鸿蒙应用或者鸿蒙服务的时候&#xff0c;有遇到疑问或者问题&#xff0c;可以在本文章评论区提问&#xff0c;我看到了如果知道怎么…

【内网穿透】在Ubuntu搭建Web小游戏网站,并将其发布到公网访问

目录 前言 1. 本地环境服务搭建 2. 局域网测试访问 3. 内网穿透 3.1 ubuntu本地安装cpolar 3.2 创建隧道 3.3 测试公网访问 4. 配置固定二级子域名 4.1 保留一个二级子域名 4.2 配置二级子域名 4.3 测试访问公网固定二级子域名 前言 网&#xff1a;我们通常说的是互…