opencv基础49-图像轮廓02-矩特征cv2.moments()->(形状分析、物体检测、图像识别、匹配)
矩特征(Moments Features)是用于图像分析和模式识别的一种特征表示方法,用来描述图像的形状、几何特征和统计信息。矩特征可以用于识别图像中的对象、检测形状以及进行图像分类等任务。
矩特征通过计算图像像素的高阶矩来提取特征。这些矩可以表示图像的中心、尺度、旋转和形状等属性。以下是一些常见的图像矩特征:
-
零阶矩(Zeroth-Order Moments):描述图像的总体亮度或面积,通常表示为图像的像素数。
-
一阶矩(First-Order Moments):描述图像的质心、平均位置和分布。它们用于计算图像的中心位置。
-
中心矩(Central Moments):描述图像区域相对于质心的分布。中心矩能够捕获图像的旋转和平移特性。
-
标准化矩(Normalized Moments):将矩标准化以获得尺度和旋转不变性。标准化矩可以用于匹配和识别。
-
**Hu不变矩(Hu Moments):**基于七个基本矩构建,具有旋转、平移和尺度不变性。Hu不变矩用于图像匹配和模式识别。
什么是图像的质心?
图像的质心(Centroid)是一个表示图像几何中心的概念。在二维平面上,图像的质心是指图像中所有像素的平均位置,即图像的重心或几何中心。
对于二值图像(黑白图像),质心可以通过以下方式计算:
将图像中的每个像素视为一个点,其坐标为 (x, y)。 对于每个像素点,计算其 x 坐标的总和和 y 坐标的总和。
用总和除以图像中像素的总数,得到 x 和 y 坐标的平均值,即为质心的坐标。
质心的坐标表示图像在水平和垂直方向上的平均位置。在实际应用中,质心通常被用于描述图像的位置信息,例如目标的位置、形状的中心等。对于多通道彩色图像,可以分别计算每个通道的质心。
矩特征应用场景
矩特征在图像处理和模式识别领域有许多应用场景,可以用于描述图像的形状、几何属性和分布情况。以下是一些常见的矩特征应用场景:
-
物体识别和分类:矩特征可以用于提取图像中物体的形状和几何特征,从而进行物体的识别和分类。通过比较矩特征,可以判断物体是否属于某个类别。
-
目标检测:在计算机视觉中,目标检测是指在图像中找到特定物体的位置。矩特征可以用于检测物体的形状和轮廓,从而帮助确定物体的位置。
-
图像匹配:矩特征可以用于图像的匹配和对准,通过比较两幅图像的矩特征,可以找到它们之间的相似性和变换关系。
-
图像压缩和编码:矩特征可以用于图像的压缩和编码,通过提取图像的主要几何信息,可以减少图像数据的存储空间。
-
图像分割:图像分割是将图像分成不同的区域,矩特征可以用于描述不同区域的形状和几何属性,从而帮助分割图像。
-
医学图像分析:在医学领域,矩特征可以用于分析医学图像中的组织、器官和病变,从而提取形状和几何特征。
-
指纹识别:矩特征可以用于指纹识别,通过提取指纹图像的几何特征,实现指纹的识别和比对。
-
遥感图像分析:在遥感图像中,矩特征可以用于提取地物的形状和分布,从而实现土地利用、环境监测等应用。
矩的计算:moments函数
OpenCV 提供了函数 cv2.moments()来获取图像的 moments 特征。通常情况下,我们将使用函数 cv2.moments()获取的轮廓特征称为“轮廓矩”。轮廓矩描述了一个轮廓的重要特征,使用轮廓矩可以方便地比较两个轮廓。
函数 cv2.moments()的语法格式为:
retval = cv2.moments( array[, binaryImage] )
- array:可以是点集,也可以是灰度图像或者二值图像。当 array 是点集时,函数会把这些点集当成轮廓中的顶点,把整个点集作为一条轮廓,而不是把它们当成独立的点来看待。
- binaryImage:该参数为 True 时,array 内所有的非零值都被处理为 1。该参数仅在参数array 为图像时有效。
该函数的返回值 retval 是矩特征,主要包括:
(1)空间矩
- 零阶矩:m00
- 一阶矩:m10, m01
- 二阶矩:m20, m11, m02
- 三阶矩:m30, m21, m12, m03
(2)中心矩 - 二阶中心矩:mu20, mu11, mu02
- 三阶中心矩:mu30, mu21, mu12, mu03
(3)归一化中心矩 - 二阶 Hu 矩:nu20, nu11, nu02
- 三阶 Hu 矩:nu30, nu21, nu12, nu03
上述矩都是根据公式计算得到的,大多数矩比较抽象。但是很明显,如果两个轮廓的矩一致,那么这两个轮廓就是一致的。虽然大多数矩都是通过数学公式计算得到的抽象特征,但是
零阶矩“m00”的含义比较直观,它表示一个轮廓的面积。
矩特征函数 cv2.moments()所返回的特征值,能够用来比较两个轮廓是否相似。例如,有两个轮廓,不管它们出现在图像的哪个位置,我们都可以通过函数 cv2.moments()的 m00 矩判断其面积是否一致。
在位置发生变化时,虽然轮廓的面积、周长等特征不变,但是更高阶的特征会随着位置的变化而发生变化。在很多情况下,我们希望比较不同位置的两个对象的一致性。解决这一问题的方法是引入中心矩。中心矩通过减去均值而获取平移不变性,因而能够比较不同位置的两个对象是否一致。很明显,中心矩具有的平移不变性,使它能够忽略两个对象的位置关系,帮助我们比较不同位置上两个对象的一致性。
除了考虑平移不变性外,我们还会考虑经过缩放后大小不一致的对象的一致性。也就是说,我们希望图像在缩放前后能够拥有一个稳定的特征值。也就是说,让图像在缩放前后具有同样的特征值。显然,中心矩不具有这个属性。例如,两个形状一致、大小不一的对象,其中心矩是有差异的。
归一化中心矩通过除以物体总尺寸而获得缩放不变性。它通过上述计算提取对象的归一化中心矩属性值,该属性值不仅具有平移不变性,还具有缩放不变性。
在 OpenCV 中,函数 cv2.moments()会同时计算上述空间矩、中心矩和归一化中心距。
示例:使用函数 cv2.moments()提取一幅图像的特征。
代码如下:
import cv2
import numpy as np
o = cv2.imread('moments.bmp')
cv2.imshow("original",o)
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
n=len(contours)
contoursImg=[]
for i in range(n):temp=np.zeros(o.shape,np.uint8)contoursImg.append(temp)contoursImg[i]=cv2.drawContours(contoursImg[i],contours,i,255,3)cv2.imshow("contours[" + str(i)+"]",contoursImg[i])
print("观察各个轮廓的矩(moments):")
for i in range(n):print("轮廓"+str(i)+"的矩:\n",cv2.moments(contours[i]))
print("观察各个轮廓的面积:")
for i in range(n):print("轮廓"+str(i)+"的面积:%d" %cv2.moments(contours[i])['m00'])
cv2.waitKey()
cv2.destroyAllWindows()
本例中,首先使用函数 cv2.moments()提取各个轮廓的特征;接下来,通过语句
cv2.moments(contours[i])[‘m00’])提取各个轮廓矩的面积信息。
运行结果如下:
观察各个轮廓的矩(moments):
轮廓0的矩:{'m00': 14900.0, 'm10': 1996600.0, 'm01': 7800150.0, 'm20': 279961066.6666666, 'm11': 1045220100.0, 'm02': 4110944766.6666665, 'm30': 40842449600.0, 'm21': 146559618400.0, 'm12': 550866598733.3334, 'm03': 2180941440375.0, 'mu20': 12416666.666666627, 'mu11': 0.0, 'mu02': 27566241.666666508, 'mu30': 1.52587890625e-05, 'mu21': 2.09808349609375e-05, 'mu12': 6.198883056640625e-05, 'mu03': 0.000244140625, 'nu20': 0.05592841163310942, 'nu11': 0.0, 'nu02': 0.12416666666666591, 'nu30': 5.630596400372416e-16, 'nu21': 7.742070050512072e-16, 'nu12': 2.2874297876512943e-15, 'nu03': 9.008954240595866e-15}
轮廓1的矩:{'m00': 34314.0, 'm10': 13313832.0, 'm01': 9728019.0, 'm20': 5356106574.0, 'm11': 3774471372.0, 'm02': 2808475082.0, 'm30': 2225873002920.0, 'm21': 1518456213729.0, 'm12': 1089688331816.0, 'm03': 824882507095.5, 'mu20': 190339758.0, 'mu11': 0.0, 'mu02': 50581695.5, 'mu30': 0.0, 'mu21': 0.0, 'mu12': 0.0, 'mu03': 0.0, 'nu20': 0.16165413533834588, 'nu11': 0.0, 'nu02': 0.042958656330749356, 'nu30': 0.0, 'nu21': 0.0, 'nu12': 0.0, 'nu03': 0.0}
轮廓2的矩:{'m00': 3900.0, 'm10': 2696850.0, 'm01': 273000.0, 'm20': 1866699900.0, 'm11': 188779500.0, 'm02': 19988800.0, 'm30': 1293351277725.0, 'm21': 130668993000.0, 'm12': 13822255200.0, 'm03': 1522248000.0, 'mu20': 1828125.0, 'mu11': 0.0, 'mu02': 878800.0, 'mu30': 0.0, 'mu21': 0.0, 'mu12': 0.0, 'mu03': 0.0, 'nu20': 0.1201923076923077, 'nu11': 0.0, 'nu02': 0.05777777777777778, 'nu30': 0.0, 'nu21': 0.0, 'nu12': 0.0, 'nu03': 0.0}
观察各个轮廓的面积:
轮廓0的面积:14900
轮廓1的面积:34314
轮廓2的面积:3900

计算轮廓的面积:contourArea函数
opencv 中也有单独计算轮廓面积的函数 contourArea函数
函数 cv2.contourArea()用于计算轮廓的面积。该函数的语法格式为:
retval =cv2.contourArea(contour [, oriented] ))
式中的返回值 retval 是面积值。
式中有两个参数:
- contour 是轮廓。
- oriented 是布尔型值。当它为 True 时,返回的值包含正/负号,用来表示轮廓是顺时针还是逆时针的。该参数的默认值是 False,表示返回的 retval 是一个绝对值。
代码示例:使用函数 cv2.contourArea()计算各个轮廓的面积。
import cv2
import numpy as np
o = cv2.imread('moments.bmp')
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
cv2.imshow("original",o)
n=len(contours)
contoursImg=[]
for i in range(n):print("moments["+str(i)+"]面积=",cv2.contourArea(contours[i]))temp=np.zeros(o.shape,np.uint8)contoursImg.append(temp)contoursImg[i]=cv2.drawContours(contoursImg[i],contours,i,(255,255,255),3)cv2.imshow("moments[" + str(i)+"]",contoursImg[i])
cv2.waitKey()
cv2.destroyAllWindows()
运行结果:
moments[0]面积= 14900.0
moments[1]面积= 34314.0
moments[2]面积= 3900.0
可以看到跟上面m00 拿到的是一样的,图显也一样

代码示例:在上面的基础上,将面积大于 15 000 的轮廓筛选出来。
代码如下:
import cv2
import numpy as np
o = cv2.imread('moments.bmp')
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
cv2.imshow("original",o)
n=len(contours)
contoursImg=[]
for i in range(n):temp=np.zeros(o.shape,np.uint8)contoursImg.append(temp)contoursImg[i]=cv2.drawContours(contoursImg[i],contours,i,(255,255,255),3)if cv2.contourArea(contours[i]) > 15000:print("moments[" + str(i) + "]面积=", cv2.contourArea(contours[i]))cv2.imshow("moments[" + str(i)+"]",contoursImg[i])
cv2.waitKey()
cv2.destroyAllWindows()
通过语句“if cv2.contourArea(contours[i])>15000:”实现对面积值的筛选,然后对面积值大于 15 000 的轮廓使用语句“cv2.imshow(“contours[” + str(i)+“]”,contoursImg[i])”显示出来。
运行结果:
moments[1]面积= 34314.0

计算轮廓的长度(周长):arcLength函数
函数 cv2.arcLength()用于计算轮廓的长度,其语法格式为:
retval = cv2.arcLength( curve, closed )
式中返回值 retval 是轮廓的长度(周长)。
上式中有两个参数:
- curve 是轮廓。
- closed 是布尔型值,用来表示轮廓是否是封闭的。该值为 True 时,表示轮廓是封闭的
示例:将一幅图像内长度大于平均值的轮廓显示出来。
import cv2
import numpy as np
#--------------读取及显示原始图像--------------------
o = cv2.imread('moments.bmp')#--------------获取轮廓--------------------
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary,cv2.RETR_LIST,
cv2.CHAIN_APPROX_SIMPLE)
#--------------计算各轮廓的长度之和、平均长度--------------------
n=len(contours) # 获取轮廓的个数
cntLen=[] # 存储各轮廓的长度
for i in range(n):cntLen.append(cv2.arcLength(contours[i],True))print("第"+str(i)+"个轮廓的长度:%d"%cntLen[i])
cntLenSum=np.sum(cntLen) # 各轮廓的长度之和
cntLenAvr=cntLenSum/n # 轮廓长度的平均值
print("轮廓的总长度为:%d"%cntLenSum)
print("轮廓的平均长度为:%d"%cntLenAvr)
运行结果:
第0个轮廓的长度:498
第1个轮廓的长度:782
第2个轮廓的长度:254
轮廓的总长度为:1534
轮廓的平均长度为:511
代码示例原图

相关文章:
opencv基础49-图像轮廓02-矩特征cv2.moments()->(形状分析、物体检测、图像识别、匹配)
矩特征(Moments Features)是用于图像分析和模式识别的一种特征表示方法,用来描述图像的形状、几何特征和统计信息。矩特征可以用于识别图像中的对象、检测形状以及进行图像分类等任务。 矩特征通过计算图像像素的高阶矩来提取特征。这些矩可以…...
什么是CSS Grid布局?什么是Flexbox布局?它们两者有什么不同?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ CSS Grid布局⭐ Flexbox布局⭐ 不同之处⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对Web…...
Centos中pip install mysqlclient失败
pip install mysqlclient 错误详情如下 pip install mysqlclient Looking in indexes: http://mirrors.tencentyun.com/pypi/simple Collecting mysqlclient Using cached http://mirrors.tencentyun.com/pypi/packages/de/9c/b176826e8994551ce826404dab97e305a4bb76c8b0a4e0…...
arcgis更改图层字段名脚本
话不多说,上脚本源码,复制黏贴即可 #-*- coding:utf-8 -*- __author__ lumen import arcpy #输入图层 InputFeature arcpy.GetParameterAsText(0) #原始字段 oldField arcpy.GetParameterAsText(1) # 获取原始字段类型 oldFieldType desc arcpy.…...
Android 13 MTK平台添加自定义按键,以及CTS问题解决
添加自定义按键流程 一般来说上层添加以下几处修改 驱动层的键值上报,让驱动处理好即可 frameworks / base/core/java/android/view/KeyEvent.java public static final int KEYCODE_DEMO_APP_4 = 304;/** add by songhui for fingerprint Key code */+ public static fina…...
深入了解 Postman Test 校验的使用方法
Postman 是一个广泛使用的 API 开发工具,它允许开发人员测试 API 的各个方面,包括请求、响应、身份验证等等,其中最常用的功能之一就是 Test 校验。那今天就一起来看看 Postman 的 Test 校验该如何使用。 Test 校验是什么? Test…...
岛屿的最大面积(力扣)递归 JAVA
给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。 岛屿的面积是岛上值为 1 的…...
MySQL入门学习教程(一)
mysql简介 1、什么是数据库 ? 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅仅…...
【CTF-web】修改请求头(XFF)
题目链接:https://ctf.bugku.com/challenges/detail/id/79.html 随意输入后可以看到需要本地管理员登录,得知这是一道需要修改XFF头的题。 XFF即X-Forwarded-For,该请求标头是一个事实上的用于标识通过代理服务器连接到 web 服务器的客户端的…...
springboot mongodb 配置多数据源
我想要的效果是,一个类统一管理多数据源,我传个参数进去,它就能返回我对应的mongotemplate 但是根据"mongbodb 多数据源"的关键词,找不到我想要的效果。 网上大多都是明确知道自己是几个数据源,然后每个数…...
Python3 安装、环境变量配置、PyCharm新建Python项目
一、安装包下载 Pyhton官网下载>>最新稳定版的安装包: 找到合适的版本进行下载: 如果下载较慢,此处提供一个3.10.11的稳定版本的安装包: 链接:https://pan.baidu.com/s/16GnWjkGFuSfWfaI9UVX8qA?pwd4u5o 提取…...
用python来爬取某鱼的商品信息(2/2)
目录 上一篇文章 本章内容 设置浏览器为运行结束后不关闭(可选) 定位到搜索框的xpath地址 执行动作 获取cookie 保存为json文件 修改cookie的sameSite值并且导入cookie 导入cookie(出错) 导入cookie(修改后&…...
【Fegin技术专题】「原生态」打开Fegin之RPC技术的开端,你会使用原生态的Fegin吗?(上)
前提介绍 Feign是SpringCloud中服务消费端的调用框架,通常与ribbon,hystrix等组合使用。由于遗留原因,某些项目中,整个系统并不是SpringCloud项目,甚至不是Spring项目,而使用者关注的重点仅仅是简化http调…...
React Native Vector Icons的使用
介绍 React Native Vector Icons是一个用于在React Native应用中使用矢量图标的库。它提供了许多常见的图标集,如FontAwesome、Ionicons等。 使用 首先,你需要在你的React Native项目中安装React Native Vector Icons库。可以使用以下命令进行安装&…...
Redis安装和配置(Linux)
一、安装准备 VMware虚拟机准备: https://www.vmware.com/cn/products/workstation-pro.html Centos7.0准备: https://www.centos.org/ 二、安装 安装好VMware以后,进入VMware,然后创建新的虚拟机 创建好虚拟机以后,进行安装C…...
安卓源码分析(10)Lifecycle实现组件生命周期管理
参考: https://developer.android.google.cn/topic/libraries/architecture/lifecycle?hlzh-cn#java https://developer.android.google.cn/reference/androidx/lifecycle/Lifecycle 文章目录 1、概述2、LifeCycle类3、LifecycleOwner类4、LifecycleObserver类 1、…...
IP 多播协议(IP Multicast Protocol)
IP 多播协议(IP Multicast Protocol)是一种在网络中一对多传输数据的通信方式。在传统的单播通信中,数据从一个发送方发送到一个接收方;而在多播通信中,数据可以从一个发送方传输到多个接收方,从而有效地节…...
Jmeter 配置环境变量,简明教程专享
通过给 JMeter 配置环境变量,可以快捷的打开 JMeter: 打开终端。执行 jmeter。 配置环境变量的方法如下。 Mac 和 Linux 系统 在 ~/.bashrc 中加如下内容: export JMETER_HOMEJMeter所在目录 export PATH$JAVA_HOME/bin:$PATH:.:$JMETER…...
WebService—XFire配置笔记
在学习之前,一直以为WebService就是一个工具,在两个服务器之间建立一个通信,帮我们把需要传输的数据组织成规范的XML数据并发送到目的地,实际情况也确实是这样的,不过更高级一点的是,XFire不但可以帮我们生成XML发送,而且可以在接收了xml之后还可以直接返回对象给我们用…...
【LangChain学习】基于PDF文档构建问答知识库(一)前期准备
这系列主要介绍如何使用LangChain大模型,结合ChatGPT3.5,基于PDF文档构建专属的问答知识库。 一、 环境搭建 LangChain 和 OpenAI 本身可支持 Nodejs 和 Python 两个版本,笔者后续的介绍主要用到Python版本,如果有需要Nodejs版本…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...
