EmguCV学习笔记 VB.Net 6.6 图像的矩

news2024/11/16 13:56:02

 版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。

教程VB.net版本请访问:EmguCV学习笔记 VB.Net 目录-CSDN博客

教程C#版本请访问:EmguCV学习笔记 C# 目录-CSDN博客

笔者的博客网址:https://blog.csdn.net/uruseibest

教程配套文件及相关说明以及如何获得pdf教程和代码,请移步:EmguCV学习笔记

学习VB.Net知识,请移步: vb.net 教程 目录_vb中如何用datagridview-CSDN博客

 学习C#知识,请移步:C# 教程 目录_c#教程目录-CSDN博客

6.6 图像的矩

在图像处理中,矩(moment)是一种用于描述图像形状和空间分布特征的特征描述子。图像的矩可以用于描述图像的重心、面积、方向、边界等特征,从而用于图像处理任务,如图像分割、边缘检测、形状识别等。

1、零阶矩(M00):表示图像上所有非0的像素值的和,也就是目标区域面积。

2、一阶矩(M01和M10):分别为图像关于x轴和y轴的矩,可以用来确定目标区域的质心。质心坐标可表示为:X0=M10/M00,Y0=M01/M00。

3、二阶矩(M20、M02和M11):二阶矩可以用来计算图像的方向和轮廓。其中,M20和M02分别表示目标区域在水平和垂直方向上的伸展均衡度,M20大于0表示目标区域下部的水平伸展度比上部大,小于0表示上部的水平伸展度比下部大;M02大于0表示图像右边的垂直伸展比左边大,小于0则正相反。M11表示目标区域的倾斜度,M11大于0表示图像向左上倾斜,小于0表示图像向右上倾斜。通过组合它们可以确定几个重要的特性,例如主轴比和方向、离心率、圆形度等等。

4、三阶矩(M30、M03):三阶矩可以用来描述图像的偏态特征,常用的三阶矩包括M30和M03。其中,M30表示图像x轴方向的偏态,M30大于0表示重心偏左,小于0表示重心偏右;M03表示图像y轴方向的偏态,M03大于0表示重心向上偏移小于0表示重心向下偏移。

5、四阶矩(M40、M04、M22):四阶矩可以用来描述图像的峰态特征,常用的四阶矩包括M40、M04和M22。其中,M40和M04分别表示图像x轴和y轴方向的峰态,用于计算图像的平峰或尖峰程度;M22表示图像的斜峰程度。当峰度系数为0时,表示高斯分布;当峰度系数小于0时,表示平坦的少峰分布;当峰度系数大于0时,表示狭窄的多峰分布。

上述图像矩只为普通矩,其值随目标区域的旋转、平移、尺度变化而改变,在实际应用中,为了提高图像矩的适用能力,需要将普通矩转换为具有旋转、平移和尺度不变性的Hu矩。

6.6.1 矩  Moments        

CvInvoke.Moments方法用于计算给定图像的几何矩。它的声明如下:

Public Shared Function Moments(arr As Emgu.CV.IInputArray, Optional binaryImage As Boolean = False) As Emgu.CV.Moments

参数说明:

  1. arr:要计算几何矩的图像。
  2. binaryImage:可选参数,表示图像是否为二值图像,默认为False。

返回值:

返回一个Moments类型的对象,表示计算得到的几何矩。

【代码位置:frmChapter6】Button22_Click

    ' Moments

    Private Sub Button22_Click(sender As Object, e As EventArgs) Handles Button22.Click

        Dim msrc As New Mat("C:\learnEmgucv\shape.jpg", ImreadModes.AnyColor)

        ImageBox1.Image = msrc

        Dim gray As New Mat

        CvInvoke.CvtColor(msrc, gray, ColorConversion.Bgr2Gray)

        Dim mb As New Mat

        CvInvoke.Threshold(gray, mb, 220, 255, ThresholdType.BinaryInv)

        ImageBox2.Image = mb

        Dim contours As New VectorOfVectorOfPoint

        '这里不需要获得 hierarchy,设置为nothing

        CvInvoke.FindContours(mb, contours, Nothing, RetrType.List, ChainApproxMethod.ChainApproxNone)

        Dim mdst As New Mat

        mdst = gray.Clone

        CvInvoke.CvtColor(mdst, mdst, ColorConversion.Gray2Bgr)

        For i As Integer = 0 To contours.Size - 1

            '绘制轮廓

            CvInvoke.DrawContours(mdst, contours, i, New MCvScalar(0, 0, 255), 2)

            '获得轮廓的矩

            Dim mo As New Moments

            mo = CvInvoke.Moments(contours(i))

            Dim m00 As Double = mo.M00

            Dim m10 As Double = mo.M10

            Dim m01 As Double = mo.M01

            'M10M00计算图像的x轴重心位置

            Dim x As Double = m10 / m00

            'M01M00计算图像的y轴重心位置

            Dim y As Double = m01 / m00

            '标明轮廓的重心

            CvInvoke.Circle(mdst, New Point(CInt(x), CInt(y)), 4, New MCvScalar(0, 255, 0), -1)

        Next

        ImageBox3.Image = mdst

End Sub

运行后如下图所示:

图6-23 获得每个轮廓的重心

6.6.2 Hu矩

Hu矩(Hu Moments)基于图像的矩的不变性特征,通过对图像的矩进行归一化和变换得到一组具有旋转、平移和尺度不变性的特征值,用于描述图像的形状特征。

Hu矩是一组七个矩,分别为:

1. 第一不变矩:该不变矩表示图像的总体亮度或面积。它可以用于图像的亮度校准和图像的分割。通过比较不同图像的第一不变矩,可以判断它们的亮度或面积差异。

2. 第二不变矩:该不变矩表示图像的形状对称性。它可以用于图像的轴对称性检测和形状匹配。通过比较不同图像的第二不变矩,可以判断它们的形状是否相似或对称。

3. 第三不变矩:该不变矩表示图像的形状的偏斜程度。它可以用于图像的形状识别和形状匹配。通过比较不同图像的第三不变矩,可以判断它们的形状是否存在偏斜。

4. 第四不变矩:该不变矩表示图像的形状的斜率。它可以用于图像的形状识别和形状匹配。通过比较不同图像的第四不变矩,可以判断它们的形状是否具有相似的斜率。

5. 第五不变矩:该不变矩表示图像的形状的膨胀或收缩程度。它可以用于图像的形状识别和形状匹配。通过比较不同图像的第五不变矩,可以判断它们的形状是否存在膨胀或收缩。

6. 第六不变矩:该不变矩表示图像的形状的旋转程度。它可以用于图像的形状识别和形状匹配。通过比较不同图像的第六不变矩,可以判断它们的形状是否存在旋转。

7. 第七不变矩:该不变矩表示图像的形状的轮廓曲率。它可以用于图像的形状识别和形状匹配。通过比较不同图像的第七不变矩,可以判断它们的形状是否具有相似的轮廓曲率。

通过比较不同图像的Hu矩,可以确定它们的形状差异和相似性。这使得Hu矩在图像处理和计算机视觉领域的许多应用中都得到了广泛的应用,例如目标识别、目标跟踪、图像检索等。

在Emgu.CV中,CvInvoke.HuMoments方法用于计算给定图像的Hu矩。Hu矩是一种图像的形状描述子,用于表示图像的不变性特征。它的声明如下:

Public Shared Function HuMoments(m As Emgu.CV.Moments) As Double()

参数说明:

  1. m:要计算Hu矩的几何矩,类型为Moments,值来自于CvInvoke.Moments获得的结果。

返回值:

返回一个Double数组,表示计算得到的7个矩。

【代码位置:frmChapter6】Button23_Click

    'Hu

    Private Sub Button23_Click(sender As Object, e As EventArgs) Handles Button23.Click

        Dim m As New Mat("C:\learnEmgucv\shape.jpg", ImreadModes.AnyColor)

        Dim gray As New Mat

        CvInvoke.CvtColor(m, gray, ColorConversion.Bgr2Gray)

        Dim b As New Mat

        CvInvoke.Threshold(gray, b, 220, 255, ThresholdType.BinaryInv)

        Dim contours As New VectorOfVectorOfPoint

        '这里不需要获得 hierarchy,设置为nothing

        CvInvoke.FindContours(b, contours, Nothing, RetrType.List, ChainApproxMethod.ChainApproxNone)

        Dim m1 As New Mat

        m1 = gray.Clone

        CvInvoke.CvtColor(m1, m1, ColorConversion.Gray2Bgr)

        For i As Integer = 0 To contours.Size - 1

            '获得矩

            Dim mo As New Moments

            mo = CvInvoke.Moments(contours(i))

            '获得Hu

            Dim Hu() As Double

            Hu = CvInvoke.HuMoments(mo)

            '输出Hu矩的每个值

            For j As Integer = 0 To Hu.Length - 1

                Console.WriteLine(" " & i & "个形状的Hu " & j & ":" & Hu(j))

            Next

        Next

End Sub

输出结果如下图所示:

图6-24 获得Hu矩

在实际开发中,理论上可以对比两个轮廓的Hu矩的差来判断相似度,但是实际由于获得的Hu矩的值很小,用来判断很不理想。读者可以自行试验。

6.6.3 形状匹配

CvInvoke.MatchShapes方法用于计算两个轮廓的形状相似性。MatchShapes可以获取两幅图像(或轮廓),并使用Hu矩查找它们之间的距离。使用该方法并不用计算Hu矩,只需要对图像进行二值化。它的声明如下:

Public Shared Function MatchShapes(contour1 As Emgu.CV.IInputArray, contour2 As Emgu.CV.IInputArray, method As Emgu.CV.CvEnum.ContoursMatchType, Optional parameter As Double = 0) As Double

参数说明:

  1. contour1:表示第一个轮廓,类型为VectorOfPoint。
  2. contour2:表示第二个轮廓,类型为VectorOfPoint。
  3. method:计算相似性的方法,类型为ContoursMatchType枚举。常用的方法包括CV_CONTOURS_MATCH_I1、CV_CONTOURS_MATCH_I2和CV_CONTOURS_MATCH_I3。
  4. parameter:计算相似性的参数,类型为Double。目前此参数似乎没什么意义。

返回值:

返回一个Double类型的值,表示两个轮廓的形状相似性程度。返回值越小,表示两个轮廓越相似。

【代码位置:frmChapter6】Button24_Click

    '基于Hu矩的轮廓匹配

    Private Sub Button24_Click(sender As Object, e As EventArgs) Handles Button24.Click

        Dim msrc As New Mat("C:\learnEmgucv\shape.jpg", ImreadModes.Grayscale)

        Dim b As New Mat

        CvInvoke.Threshold(msrc, b, 220, 255, ThresholdType.BinaryInv)

        ImageBox1.Image = b

        Dim contours As New VectorOfVectorOfPoint

        CvInvoke.FindContours(b, contours, Nothing, RetrType.List, ChainApproxMethod.ChainApproxNone)

        Dim mdst1 As New Mat("C:\learnEmgucv\shape_1.jpg", ImreadModes.Grayscale)

        Dim b1 As New Mat

        CvInvoke.Threshold(mdst1, b1, 220, 255, ThresholdType.BinaryInv)

        Dim contours1 As New VectorOfVectorOfPoint

        CvInvoke.FindContours(b1, contours1, Nothing, RetrType.List, ChainApproxMethod.ChainApproxNone)

        Dim contour1 As New VectorOfPoint

        '为了简化说明,这里只有一个轮廓

        contour1 = contours1(0)

        Dim mm1 As New Mat

        mm1 = msrc.Clone

        mm1.SetTo(New MCvScalar(0))

        Dim thecontour As New VectorOfPoint

        For i As Integer = 0 To contours.Size - 1

            Dim returnvalue As Double

            '计算相似性

            returnvalue = CvInvoke.MatchShapes(contour1, contours(i), ContoursMatchType.I1)

            '需要根据实际情况来设置值才能获得满意效果

            If returnvalue < 0.02 Then

                CvInvoke.DrawContours(mm1, contours, i, New MCvScalar(255), -1)

                thecontour = contours(i)

            End If

        Next

        ImageBox2.Image = mm1

        'shape_2shape_1旋转后的图像

        Dim mdst2 As New Mat("C:\learnEmgucv\shape_2.jpg", ImreadModes.Grayscale)

        Dim b2 As New Mat

        CvInvoke.Threshold(mdst2, b2, 220, 255, ThresholdType.BinaryInv)

        Dim contours2 As New VectorOfVectorOfPoint

        CvInvoke.FindContours(b2, contours2, Nothing, RetrType.List, ChainApproxMethod.ChainApproxNone)

        Dim contour2 As New VectorOfPoint

        contour2 = contours2(0)

        'Console.WriteLine("returnvalueB")

        Dim mm2 As New Mat

        mm2 = msrc.Clone

        mm2.SetTo(New MCvScalar(0))

        For i As Integer = 0 To contours.Size - 1

            Dim returnvalue As Double

            returnvalue = CvInvoke.MatchShapes(contour2, contours(i), ContoursMatchType.I3)

            '采用与上面相同的值,匹配了其他轮廓

            '需要更小的值,比如0.015才能过滤不匹配的轮廓

            If returnvalue < 0.02 Then

                CvInvoke.DrawContours(mm2, contours, i, New MCvScalar(255), -1)

            End If

        Next

        ImageBox3.Image = mm2

    End Sub

输出结果如下图所示:

 

图6-25 图像轮廓匹配

【代码位置:frmChapter6】Button25_Click

    '基于Hu矩的轮廓匹配

    Private Sub Button25_Click(sender As Object, e As EventArgs) Handles Button25.Click

        Dim m As New Mat("C:\learnEmgucv\shape3.jpg", ImreadModes.Grayscale)

        Dim b As New Mat

        CvInvoke.Threshold(m, b, 220, 255, ThresholdType.BinaryInv)

        ImageBox1.Image = b

        Dim contours As New VectorOfVectorOfPoint

        '只检测外轮廓

        CvInvoke.FindContours(b, contours, Nothing, RetrType.External, ChainApproxMethod.ChainApproxNone)

        'shape3图片中只包含5个图形,contours序号从0-4分别对应

        'B A C 上右A 上左A

        '这里使用上面的两个A与下面对比

        Dim contour1 As New VectorOfPoint

        Dim contour2 As New VectorOfPoint

        '上面的两个不同字体的A

        contour1 = contours(4)

        contour2 = contours(3)

        '下面的ABC轮廓

        Dim contoursa As New VectorOfVectorOfPoint

        contoursa.Push(contours(1))

        contoursa.Push(contours(0))

        contoursa.Push(contours(2))

        Dim mm1 As New Mat

        mm1 = m.Clone

        mm1.SetTo(New MCvScalar(0))

        Dim mm2 As New Mat

        mm2 = m.Clone

        mm2.SetTo(New MCvScalar(0))

        For i As Integer = 0 To 2

            Dim returnvalue1 As Double

            returnvalue1 = CvInvoke.MatchShapes(contour1, contoursa(i), ContoursMatchType.I1)

            Console.WriteLine(returnvalue1)

            '输出结果:

            '0.0931539845093758

            '0.255313921042219

            '0.881725801395845

            If returnvalue1 < 0.1 Then

                CvInvoke.DrawContours(mm1, contoursa, i, New MCvScalar(255), 2)

            End If

            Dim returnvalue2 As Double

            returnvalue2 = CvInvoke.MatchShapes(contour2, contoursa(i), ContoursMatchType.I1)

            Console.WriteLine(returnvalue2)

            '输出结果:

            '0.20659335409303

            '0.509194144738261

            '0.72275679628663

            If returnvalue2 < 0.3 Then

                CvInvoke.DrawContours(mm2, contoursa, i, New MCvScalar(255), 2)

            End If

        Next

        ImageBox2.Image = mm1

        ImageBox3.Image = mm2

    End Sub

输出结果如下图所示:

图6-26 不同字体的A轮廓与ABC轮廓匹配

【代码位置:frmChapter6】Button26_Click

    '基于Hu矩的轮廓匹配

    Private Sub Button26_Click(sender As Object, e As EventArgs) Handles Button26.Click

        Dim m As New Mat("C:\learnEmgucv\shape4.jpg", ImreadModes.Grayscale)

        Dim b As New Mat

        CvInvoke.Threshold(m, b, 220, 255, ThresholdType.BinaryInv)

        ImageBox1.Image = b

        Dim contours As New VectorOfVectorOfPoint

        '只检测外轮廓

        CvInvoke.FindContours(b, contours, Nothing, RetrType.External, ChainApproxMethod.ChainApproxNone)

        'shape3图片中只包含5个图形,contours序号从0-4分别对应

        'B A C 上右B 上左B

        '这里使用上面的两个A与下面对比

        Dim contour1 As New VectorOfPoint

        Dim contour2 As New VectorOfPoint

        contour1 = contours(4)

        contour2 = contours(3)

        Dim contoursa As New VectorOfVectorOfPoint

        contoursa.Push(contours(1))

        contoursa.Push(contours(0))

        contoursa.Push(contours(2))

        Dim mm1 As New Mat

        mm1 = m.Clone

        mm1.SetTo(New MCvScalar(0))

        Dim mm2 As New Mat

        mm2 = m.Clone

        mm2.SetTo(New MCvScalar(0))

        For i As Integer = 0 To 2

            Dim returnvalue1 As Double

            returnvalue1 = CvInvoke.MatchShapes(contour1, contoursa(i), ContoursMatchType.I1)

            Console.WriteLine(returnvalue1)

            '输出结果:

            '0.34031067009289

            '0.0422767968544905

            '0.928506107053343

            If returnvalue1 < 0.1 Then

                CvInvoke.DrawContours(mm1, contoursa, i, New MCvScalar(255), 2)

            End If

            Dim returnvalue2 As Double

            returnvalue2 = CvInvoke.MatchShapes(contour2, contoursa(i), ContoursMatchType.I1)

            Console.WriteLine(returnvalue2)

            '输出结果:

            '0.340619810117041

            '0.0423705106226118

            '0.928412393285222

            If returnvalue2 < 0.1 Then

                CvInvoke.DrawContours(mm2, contoursa, i, New MCvScalar(255), 2)

            End If

        Next

        ImageBox2.Image = mm1

        ImageBox3.Image = mm2

    End Sub

输出结果如下图所示:

图6-27 B轮廓与ABC轮廓匹配

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

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

相关文章

【保姆级WebStorm安装!!!】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

记录|Form1中嵌套Form2时的频闪问题解决[不同于常见的三部曲]

目录 前言一、常见的解决方案二、自己创建渐变色组件GradientPanel三、最终效果展示更新时间 前言 参考文章&#xff1a; C#画图解决闪烁问题 [解决winform中重绘时控件闪烁的问题](panel1.GetType().GetProperty(“DoubleBuffered”,System.Reflection.BindingFlags.Instance …

试卷擦除,这几款软件擦得干干净净!

在现代教育中&#xff0c;电子化试卷已经成为一种趋势&#xff0c;然而随之而来的问题是如何有效地擦除试卷上的答案&#xff0c;以便进行反复使用试卷。为了解决这个问题&#xff0c;我们介绍了三款试卷答案清除方法&#xff0c;这些方法不仅简单易用&#xff0c;而且效果显著…

运维团队如何高效使用监控易

监控易作为一款功能强大的运维监控工具&#xff0c;能够为运维团队提供全面、实时的设备运行状态和性能指标。为了高效使用监控易&#xff0c;运维团队应遵循以下步骤和策略&#xff1a; 一、熟悉监控易界面与功能 深入了解监控易的仪表盘界面&#xff0c;包括设备运行状态、…

APP自动化测试思路整理,跟着步骤快速撸码...

前言 1、开发语言选择 通常用于自动化测试的编程语言有&#xff1a;Python、Java、Javascript、Ruby、C#、PHP等。 一般我们会选择自己熟悉的编程语言来编写自动化脚本&#xff0c;但对于编程基础基本为0的童鞋&#xff08;或者专注于做自动化测试的童鞋&#xff09;&#x…

ICT测试探针市场报告:前五大厂商占有大约26.0%的市场份额

ICT测试探针&#xff0c;即在线测试&#xff08;ICT&#xff09;探针&#xff0c;是专门用于电路板&#xff08;特别是PCBA&#xff09;电气测试的重要工具&#xff0c;通过这些探针接触PCB上的测试点&#xff0c;来检测电路板上元器件的连通性和电气性能&#xff0c;从而保证电…

视频超分辨率重建——AnimeSR网络测试教程(详细图文教程)

&#x1f4aa; 专业从事且热爱图像处理&#xff0c;图像处理专栏更新如下&#x1f447;&#xff1a; &#x1f4dd;《图像去噪》 &#x1f4dd;《超分辨率重建》 &#x1f4dd;《语义分割》 &#x1f4dd;《风格迁移》 &#x1f4dd;《目标检测》 &#x1f4dd;《暗光增强》 &a…

2021CCPC网络赛:G - Function HDU - 7106

题意 定义g(x)为x的各数位之和 求该方程: 在给定x范围内的最小值 思路: 一个x对应一个g(x)&#xff0c;一个g(x)对应多个x 由于g(x)最多取到54,所以可以枚举所有的g(x)所以想到当取到g(x)的时候,只取能使原方程f(x)最小的那几个x 当枚举g(x)的时候,g(x)看作一个常数,此时方程…

干货分享:精选四大Win10录屏工具推荐!

无论你是制作教程视频、游戏实况分享还是日常办公中的演示记录&#xff0c;一款好的录屏软件都能让你事半功倍。Windows 10作为当下最流行的桌面操作系统之一&#xff0c;本文推荐几款优秀的win10录屏工具 福昕录屏大师 链接&#xff1a;www.foxitsoftware.cn/REC/ 福昕录屏…

石油钻杆对直线度测量的需求

关键字&#xff1a;石油钻杆直线度测量仪&#xff0c;钻杆测量仪&#xff0c;钻杆直线度 石油钻杆对直线度测量的需求主要源于其在石油勘探和开发过程中的关键作用以及严苛的工作环境。以下是对这一需求的详细分析&#xff1a; 一、石油钻杆的功能与重要性 石油钻杆是石油钻探…

十五分钟速通Vue

绑值语法( {{}} ) <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head…

热失控传感器在换电站消防安全解决方案中的应用

随着新能源技术的飞速发展&#xff0c;工程车辆行业正逐步向绿色化、电动化转型&#xff0c;作为这一转型过程中的关键设施&#xff0c;换电站的数量日益增多。作为电池集中储存与交换的核心区域&#xff0c;换电站的消防安全问题成为了不容忽视的重大挑战。特别是电池仓&#…

骑行适合戴的耳机?开放式耳机测评

当我们在享受骑行的乐趣时&#xff0c;音乐往往是不可或缺的伴侣。但选择耳机却是一门学问&#xff0c;尤其是在安全和听觉享受之间找到平衡。今天&#xff0c;我就来和大家探讨一下&#xff0c;在骑行时究竟是选择开放式耳机还是封闭式耳机。 骑行时选择耳机的考量因素 1.安全…

二手电脑配置给你不一样的成就感之三

近期和着了魔一样&#xff0c;一直在搜罗二手乐色&#xff0c;之前说过的推荐配置基本都试了一遍&#xff0c;今天来说下APU系列和E3系列&#xff0c;还是那个选择&#xff0c;主板30以下&#xff0c;cpu二十以下&#xff0c;这次有增加了二手风扇&#xff0c;二手固态&#xf…

vue part 5

生命周期 <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>引出生命周期</title><!-- 引入Vue --><script type"text/javascript" src"https://cdn.jsdelivr.net/npm/vue/dist/vue.js&quo…

filezilla使用教程(window下filezilla使用教程)

filezilla使用教程&#xff08;window下filezilla使用教程&#xff09; 一、安装与配置 首先&#xff0c;你需要从FileZilla的官方网站下载并安装适合你操作系统的版本。安装完成后&#xff0c;打开FileZilla&#xff0c;你将看到一个简洁的用户界面。 在FileZilla中&#x…

day-43 Z 字形变换

思路 只需要依次按照行进行遍历即可 解题过程 第一行位置&#xff1a;0 2*(numRows-1) 4*(numRows-1) 第二行位置&#xff1a;1 2*(numRows-1)-1 2*(numRows-1)1 。。。。。。 注意&#xff1a;当numRows为1时&#xff0c;直接返回s Code class Solution {public String con…

Android 获取安装包的签名,获取签名文件的MD5值

一般情况下通过下面的语句就开业获取MD5值; keytool -list -v -keystore 签名文件.jks -alias 别名也可以直接:keytool -list -v -keystore 签名文件.jks但结果只有SHA1和SHA256,没有MD5值; 是因为升级java JDK以后 keytool 不支持MD5,所以就需要像其他的办法; 解决办…

西门子PLC、倍福PLC如何接入ThingsKit物联网平台?

随着工业4.0的推进&#xff0c;物联网(IoT)技术在智能制造领域的应用日益广泛。本文将探讨如何将西门子PLC和倍福PLC接入ThingsKit物联网平台&#xff0c;实现工业设备的远程监控与管理。 引言 在智能制造和工业自动化中&#xff0c;PLC&#xff08;可编程逻辑控制器&#xf…

[000-01-001].第06节:Shell环境变量深入学习

1、Shell环境变量深入&#xff1a;加载流程原理介绍 本节目标 1.能够说出交互式Shell与非交互式Shell2.能够说出登录Shell与非登录Shell环境 1.1.Shell工作环境介绍 用户进入linux系统就会初始化Shell环境, 这个环境会加载全局配置文件和用户个人配置文件中环境变量.每个脚本文…