opencv 图像预处理
图像预处理
在计算机视觉和图像处理领域,图像预处理是一个重要的步骤,它能够提高后续处理(如特征提取、目标检测等)的准确性和效率。OpenCV 提供了许多图像预处理的函数和方法,以下是一些常见的图像预处理操作:
- 图像空间转换
- 图像大小调整
- 图像仿射变换
- 图像翻转
- 图像裁剪
- 图像二值化处理
- 图像去噪
- 边缘检测
- 图像平滑处理
- 图像形态学
图像翻转
cv2.flip
是 OpenCV 库中的一个函数,用于翻转图像。翻转可以是水平翻转、垂直翻转或同时水平和垂直翻转。这个函数接受两个参数:要翻转的图像和一个指定翻转类型的标志。
函数签名
cv2.flip(src, flipCode[, dst]) -> dst
参数说明
-
src:输入图像,可以是任意类型和深度的多通道图像。
-
flipCode
:指定翻转类型的整数标志:
0
:沿 X 轴翻转(垂直翻转)1
:沿 Y 轴翻转(水平翻转)-1
:沿 X 轴和 Y 轴翻转(同时水平和垂直翻转)
-
dst:可选参数,输出图像。如果未提供,输出图像将与输入图像具有相同的尺寸和类型。
示例
以下是一些使用 cv2.flip
的示例代码:
import cv2img = cv2.imread('../images/car.png')# 翻转
# 0:垂直翻转
# 1:水平翻转
# -1:水平垂直翻转
flip_img = cv2.flip(img, -1)
cv2.imshow('img', img)
cv2.imshow('flip_img', flip_img)
cv2.waitKey()
cv2.destroyAllWindows()
图像仿射变换
仿射变换(Affine Transformation)是一种线性变换,它保持了点之间的相对距离不变,即平行线在变换后仍然保持平行。在图像处理中,仿射变换常用于旋转、缩放、平移和剪切等操作。
图像旋转
旋转操作可以将图像绕着某个点旋转一定的角度
实例代码
def cv_affinetransformation():img = cv2.imread('../images/car.png')if img is None:print("Error: Image not found.")return# 获取图像大小(height, width) = img.shape[:2]# 定义旋转中心点center = (width // 2, height // 2)# 旋转角度angle = 60# 计算旋转矩阵m = cv2.getRotationMatrix2D(center, angle, 1.0)# 图像旋转affine = cv2.warpAffine(img, m, (width, height))cv2.imshow('Rotated Image', affine)cv2.waitKey(0)cv2.destroyAllWindows()
cv2.getRotationMatrix2D
是 OpenCV 库中的一个函数,用于获取旋转矩阵。这个函数主要用于图像的旋转变换。旋转矩阵是一个 2x3 的矩阵,可以用来将图像围绕指定的中心点旋转指定的角度,并且可以选择是否进行缩放。
函数签名
cv2.getRotationMatrix2D(center, angle, scale) -> M
参数说明
- center:旋转中心点的坐标,格式为
(x, y)
。 - angle:旋转角度,单位为度。正角度表示逆时针旋转,负角度表示顺时针旋转。
- scale:缩放比例。如果设置为 1,则不进行缩放。
返回值
- M:2x3 的旋转矩阵。
示例
以下是一个使用 cv2.getRotationMatrix2D
的示例代码,
cv2.warpAffine 函数
仿射变换 函数
cv2.warpAffine(src, M, dsize, dst) →
- src: 输入图像。
- M: 2x3 的变换矩阵,类型为
np.float32
。 - dsize: 输出图像的尺寸,形式为
(width, height)
。 - dst (可选): 输出图像。如果未提供,则会自动创建一个新的图像。
图像平移
平移操作可以将图像中的每个点沿着某个方向移动一定的距离
def cv_warpaffine():img = cv2.imread('../images/car.png')if img is None:print("Error: Image not found.")return# 获取图像大小(height, width) = img.shape[:2]# 定义水平和垂直移动的距离tx, ty = 50, 100# 定义平移矩阵t_img = np.float32([[1, 0, tx], [0, 1, ty]])# 应用平移变换w_img = cv2.warpAffine(img, t_img, (width, height))cv2.imshow('Translated Image', w_img)cv2.waitKey(0)cv2.destroyAllWindows()
其中,tx 和 ty 分别表示在x轴和y轴方向上的平移距离。
图像缩放
缩放操作可以改变图像的大小
import cv2
import numpy as np# 读取图像
img = cv2.imread("images/car5.png")
h, w, channels = img.shape
# 定义缩放因子
sx, sy = 1.5, 1.5
M = np.float32([[sx, 0, 0], [0, sy, 0]])
# 应用缩放变换
scaled = cv2.warpAffine(img, M, (int(w * sx), int(h* sy)))
# 显示结果
cv2.imshow('Scaled Image', scaled)
cv2.waitKey(0)
cv2.destroyAllWindows()
sx 和 sy 分别表示在x轴和y轴方向上的缩放因子。
图像剪切
剪切操作可以改变图像的形状,使其在某个方向上倾斜
import cv2
import numpy as np# 读取图像
img = cv2.imread("images/car5.png")
rows, cols, _ = img.shape
# 定义剪切因子
shx, shy = 0.2, 0.2
M = np.float32([[1, shx, 0], [shy, 1, 0]])
# 应用剪切变换
sheared = cv2.warpAffine(img, M, (cols, rows))# 显示结果
cv2.imshow('Sheared Image', sheared)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像色彩空间转换
OpenCV中的色彩空间转换是将图像从一种颜色表示形式转换为另一种颜色表示形式的过程。常见的颜色空间包括RGB、HSV、YUV等。
色彩空间转换有几个重要的作用:
- 方便图像处理:在不同的颜色空间中,对应的通道代表了不同的属性,例如在RGB空间中,红、绿、蓝三个通道分别代表了颜色的强度,而在HSV空间中,H(色相)代表了颜色的种类,S(饱和度)代表了颜色的深浅,V(亮度)代表了颜色的明暗。因此,对于不同的处理需求,选择不同的颜色空间进行处理可以更加方便。
- 提高图像处理效果:在某些情况下,使用某些特定的颜色空间可以提高图像处理的效果。例如,在HSV空间中,可以通过调整S(饱和度)和V(亮度)来提高图像的对比度并去除噪点。
- 节省计算资源:在某些情况下,使用特定的颜色空间可以帮助我们节省计算资源。例如,在RGB空间中,每个像素需要3个通道来表示,而在灰度空间中,每个像素只需要一个通道就可以表示。因此,如果我们只需要处理亮度信息而不需要颜色信息时,将图像转换为灰度空间可以节省计算资源。
总之,色彩空间转换在图像处理中是一项非常重要的技术,它可以方便我们对图像进行处理,并提高图像处理的效果和节省计算资源。
cv2.cvtColor()
是OpenCV中的一个函数,用于图像颜色空间的转换。它可以将一个图像从一个颜色空间转换为另一个颜色空间,比如从RGB到灰度图像的转换,或者从BGR到HSV的转换等。
函数的语法如下:
cv2.cvtColor(src, code)
参数说明:
src
:输入图像,可以是一个NumPy数组或者一个OpenCV的Mat对象。code
:指定转换的类型,可以使用预定义的转换代码,例如cv2.COLOR_BGR2GRAY
表示从BGR到灰度图像的转换。
RGB 转 Gray(灰度)
RGB 转 Gray(灰度),将彩色图像转换为灰度图像,可以减少数据量并简化算法。
def cv_color():img = cv2.imread('../images/p1.png')# 图像色彩空间转换gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 灰度图像# gray = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # HSV颜色空间cv2.imshow('img', img)cv2.imshow('gray', gray)cv2.waitKey(0)cv2.destroyAllWindows()if __name__ == '__main__':cv_color()
RGB 转 HSV
RGB 转 HSV,HSV(Hue, Saturation, Value)色彩空间在颜色分割和颜色识别中非常有用。
def cv_color():img = cv2.imread('../images/p1.png')# 图像色彩空间转换# gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 灰度图像gray = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # HSV颜色空间cv2.imshow('img', img)cv2.imshow('gray', gray)cv2.waitKey(0)cv2.destroyAllWindows()
图像二值化处理
案例:
def binaryzation():img = cv2.imread('../images/p1.png')g_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 二值化# ret:实际应用阈值# binary:二值化后的图像ret, binary = cv2.threshold(g_img, 150, 230, cv2.THRESH_BINARY)cv2.imshow('binary', binary)cv2.waitKey(0)cv2.destroyAllWindows()if __name__ == '__main__':binaryzation()
cv2.threshold
是 OpenCV 中用于图像二值化的函数。它通过设置阈值将图像分为前景和背景,常用于图像处理和分析。以下是该函数的主要功能和用法简介:
功能
cv2.threshold
将灰度图像转换为二值图像,根据指定的阈值将像素值分为两类:高于阈值的像素设为一个值(通常是255),低于阈值的像素设为另一个值(通常是0)。
语法
retval, dst = cv2.threshold(src, thresh, maxval, type)
参数
-
src: 输入的灰度图像。
-
thresh: 阈值,决定分割的界限。
-
maxval: 当像素值超过阈值时,赋予的最大值(通常为255)。
-
- type
- 阈值类型,常用的有:
cv2.THRESH_BINARY
: 超过阈值的像素设为最大值,其余设为0。cv2.THRESH_BINARY_INV
: 超过阈值的像素设为0,其余设为最大值。cv2.THRESH_TRUNC
: 超过阈值的像素设为阈值,其余不变。cv2.THRESH_TOZERO
: 超过阈值的像素不变,其余设为0。cv2.THRESH_TOZERO_INV
: 超过阈值的像素设为0,其余不变。
返回值
- retval: 实际使用的阈值(可能与输入值不同)。
- dst: 输出的二值图像。
图像掩模
它通常用于创建掩模,以便从图像中提取特定颜色的区域。
函数原型
cv2.inRange(src, lowerb, upperb)
参数
- src: 输入的图像,可以是彩色图像或灰度图像。
- lowerb: 颜色范围的下界(数组或元组),指定了要提取的颜色的最小值。
- upperb: 颜色范围的上界(数组或元组),指定了要提取的颜色的最大值。
返回值
- 返回一个二值图像,白色部分表示在指定颜色范围内的区域,黑色部分表示不在范围内的区域
图像位与操作
cv2.bitwise_and()
是 OpenCV 库中的一个函数,用于对两个图像进行按位与操作。这个操作会逐个像素地对两个输入图像进行比较,只有在两个像素均为 255(白色)时,输出的像素才会为 255(白色),否则输出为 0(黑色)。这个函数在图像处理中的应用非常广泛,尤其是在掩膜和图像分割等任务中
函数原型
dst = cv2.bitwise_and(src1, src2, mask=None)
参数说明
src1
: 第一个输入图像。src2
: 第二个输入图像。两幅图像应具有相同的尺寸和类型。mask
: 可选参数,用于指定一个掩膜。如果提供,只有在掩膜的相应位置为非零时,才会计算输出。
返回值
- 返回按位与操作后的图像(
dst
)。
图像检测轮廓
cv2.findContours
函数可以在二值图像中找到轮廓,并返回轮廓的点集。轮廓可以用来表示物体的边界,常用于物体检测、分割和形状分析。
语法
contours, hierarchy = cv2.findContours(image, mode, method)
参数
-
image: 输入的二值图像。通常在调用该函数之前需要将图像转换为灰度图像并进行二值化处理(如使用
cv2.threshold
或cv2.Canny
)。 -
- mode
- 轮廓检索模式:
cv2.RETR_EXTERNAL
: 只检索外部轮廓。cv2.RETR_LIST
: 检索所有轮廓,并将其放入列表中。cv2.RETR_TREE
: 检索所有轮廓,并建立层级关系。
-
- method
- 轮廓逼近方法:
cv2.CHAIN_APPROX_SIMPLE
: 压缩轮廓,仅保留端点。cv2.CHAIN_APPROX_NONE
: 保留所有轮廓点。
返回值
- contours: 一个 Python 列表,其中每个元素是一个轮廓(即一组点),轮廓的点以 NumPy 数组的形式存储。
- hierarchy: 轮廓的层级信息,包含轮廓之间的关系。
cv2.boundingRect 函数介绍
cv2.boundingRect
是 OpenCV 中用于计算轮廓的最小外接矩形的函数。这个函数可以返回一个包含轮廓的最小矩形的边界框,通常用于对象检测、图像分割等任务中。最小外接矩形是一个完全包围轮廓的矩形,其边与图像的坐标轴平行。
案例
import cv2
import numpy as np
import paddlehub as hubqie_img = Nonedef find_contours():global qie_imgimg = cv2.imread("../images/car.png")hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)# HSV颜色空间中,蓝色对应的颜色范围lower_blue = np.array([100, 100, 100])upper_blue = np.array([140, 255, 255])# 创建掩膜# 在HSV空间中,将颜色范围限定在lower_blue和upper_blue之间mask = cv2.inRange(hsv, lower_blue, upper_blue)# # 转换成灰度图像# gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 二值化处理ret, binary = cv2.threshold(mask, 120, 255, cv2.THRESH_BINARY)# 获取图片轮廓contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# num = len(contours)# print("轮廓数量:", num)for i in contours:x, y, w, h = cv2.boundingRect(i)# 画矩形if w > 100 and h > 45:cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2)qie_img = img[y:y + h, x:x + w]cv2.imshow("qie_img", qie_img)# 识别车牌信息# 加载模型ocr = hub.Module(name="chinese_ocr_db_crnn_server")# 识别文本result = ocr.recognize_text(images=[qie_img])for i in result:data = i['data']for j in data:print('车牌号是:', j['text'])cv2.waitKey(0)cv2.destroyAllWindows()if __name__ == '__main__':find_contours()"""
根据识别到的车牌,将车牌识别出来
"""

相关文章:

opencv 图像预处理
图像预处理 在计算机视觉和图像处理领域,图像预处理是一个重要的步骤,它能够提高后续处理(如特征提取、目标检测等)的准确性和效率。OpenCV 提供了许多图像预处理的函数和方法,以下是一些常见的图像预处理操作&…...

SAP B1 功能模块字段介绍 - 价格清单(下)
目录 背景 五、业务伙伴的特殊价格 1. 单据逻辑功能 2. 部分字段解释 3. 操作流程 3.1 时间相关 3.2 数量相关 4. 实例 六、复制特殊价格到选择标准 1. 单据逻辑功能 2. 部分字段解释 七、全局更新特殊价格 编辑 1. 单据逻辑功能 2. 部分字段解释 八、价格更…...

传智杯 第六届-复赛-D
题目描述: 小红定义两个字符串同构,当且仅当对于i∈[1,n],b[i]−a[i]i∈[1,n],b[i]-a[i]i∈[1,n],b[i]−a[i]是定值。例如,"bacd"和"edfg"是同构的。 现在小红拿到了一个长度为n的字符串a,她想知道&a…...

Java - 数组实现大顶堆
题目描述 实现思路 要实现一个堆,我们首先要了解堆的概念。 堆是一种完全二叉树,分为大顶堆和小顶堆。 大顶堆:每个节点的值都大于或等于其子节点的值。 小顶堆:每个节点的值都小于或等于其子节点的值。 完全二叉树ÿ…...

ifuse挂载后,在python代码中访问iOS沙盒目录获取app日志
上一次使用pymobiledevice3,在python代码中访问app的沙盒目录并分析业务日志,在使用过程中发现,在获取app日志的时候速度很慢,执行时间很长,需要30-61秒,所以这次尝试使用libimobiledevic和ifuse࿰…...

Windows WSL环境下安装 pytorch +ROCM 支持AMD显卡
官方文档:Install PyTorch for ROCm — Use ROCm on Radeon GPUs 一、操作系统及驱动 windows 下安装WSL 环境( windows subsystem for Linux), 安装ubuntu 22.04环境。 安装 rocm 软件包: sudo apt update wget https://repo.radeon.com/amdgpu-insta…...

uniapp中skymap.html(8100端口)提示未登录的排查与解决方法
问题: 目前账号已经登录,uniapp的其他端口均可以访问到数据,唯独skymap.html中的8100会提示未登录。(8100是后端网关gateway端口) 分析: 在 skymap.html 中遇到未登录提示的问题,通常是由于该…...

训练模型时梯度出现NAN或者INF(禁用amp的不同level)
判断参数梯度位nan或inf的代码: for name, param in model.named_parameters():if param.grad is not None:if torch.isnan(param.grad).any() or torch.isinf(param.grad).any():print(f"grad layer [{name}] is NaN or Inf") 首先来说可能得原因&…...

Maven核心概念
一、项目对象模型(POM) 1. 定义 POM(Project Object Model)是 Maven 项目的核心配置文件,它以 XML 格式描述了项目的基本信息、项目依赖、构建配置等。可以说,POM 是 Maven 理解和处理项目的基础。 2. 基…...

Sonatype Nexus 部署手册
文章目录 一、前言二、软件环境2.1 版本变更:2.1.1 变更存储的原因2.2.2 H2作为存储的注意点 三、资源配置四、开始部署4.1 部署jdk174.2 离线部署nexus4.2.1 下载4.2.2 部署1. 上传到服务器2. 解压3. 添加用户4. 修改启动参数5. 迁移sonatype-work ,并授…...

TLV320AIC3104IRHBR 数据手册 一款低功耗立体声音频编解码器 立体声耳机放大器芯片麦克风
TLV320AIC3104 是一款低功耗立体声音频编解码器,具有立体声耳机放大器以及在单端或全差分配置下可编程的多个输入和输出。该器件包括基于寄存器的全面电源控制,可实现立体声 48kHz DAC 回放,在 3.3V 模拟电源电压下的功耗低至 14mW࿰…...

(8)结构体、共用体和枚举类型数据
1. 结构体、共用体的定义及区别,typedef 定义别名 结构体的定义 结构体是一种用户自定义的数据类型,它可以将不同类型的数据组合在一起。例如,定义一个表示学生信息的结构体: // 定义结构体类型 struct Student struct Student {char name[20];int age;float score; };共…...

Jedis操作和springboot整合redis
Jedis-springboot整合redis Jedis 引入jedis依赖 注意事项 测试相关数据类型 Key String List set hash zset 案例 spring boot整合redis 引入相关依赖 在application.properties中配置redis 配置 创建redis配置类 创建测试类 Jedis 引入jedis依赖 <depen…...

基于AI大模型的复杂扫描件PDF信息提取与规整
前言 场景大致是会上传一个几十页的扫描件PDF,让AI在当中找出我需要的字段,本文会隐去具体行业信息和具体的AI提示词内容,只分享技术相关内容,请见谅。 AI模型选择 针对我们行业的使用场景,我主要测试了GPT、Claude以…...

为什么https先非对称加密,然后对称加密?
HTTPS之所以先使用非对称加密,然后在对称加密,主要是基于两者在加密效率与安全性方面的特性考虑。 首先,非对称加密具有极高的安全性,因为它使用了公钥和私钥这一对密钥。公钥是公开的,任何人都可以使用它来加密数据&…...

【Coroutines】Full Understanding of Kotlinx.Corutines Framework
文章目录 What is CorutinesDifference between Corutine and ThreadFast UsageSuspend FunctionAdvanced Usage of CoroutineCoroutine EssentialsCoroutineContextCoroutineScopePredefined CoroutineScopePredefined DispatchersPredefined CoroutineStartJobCreate a Corou…...

Python面向对象,实现图片处理案例,支持:高斯模糊、Canny边缘检测、反转边缘图像、生成手绘效果、调亮度......等等
实验图片如下: 命名为img1.jpg, 放在项目下新建文件夹images下 项目构造如下: app.py源码如下 import cv2 import os from matplotlib import pyplot as plt import numpy as npclass ImageProcessor:def __init__(self, image_path):self.image cv…...

SOLID - 依赖倒置原则(Dependency Inversion Principle)
SOLID - 依赖倒置原则(Dependency Inversion Principle) 定义 依赖倒置原则(Dependency Inversion Principle,DIP)是面向对象设计中的五大基本原则之一,通常缩写为SOLID中的D。DIP由Robert C. Martin提出&…...

【.NET 8 实战--孢子记账--从单体到微服务】--需求拆分与规划
在上一篇文章中我们收集了需求,并对需求进行了简单的分析和规划,但是对于开发人员来说,上一篇文章的需求还不够详细,并且没有形成计划。因此本篇文章将带领大家来拆分需求并规划开发里程碑。 一、详细需求列表 项目组进行了多次…...

在macOS的多任务处理环境中,如何平衡应用的性能与用户体验?这是否是一个复杂的优化问题?如何优化用户体验|多任务处理|用户体验|应用设计
目录 一 多任务处理与应用性能 1. macOS中的多任务处理机制 2. 性能优化的基本策略 二 用户体验的关键要素 1. 响应速度 2. 界面友好性 3. 功能的直观性 三 平衡性能与用户体验的策略 1. 资源管理 2. 优化数据加载 3. 使用合适的线程模型 4. 实时监测和调整 四 使…...

Vscode配置CC++编程环境的使用体验优化和补充说明
文章目录 快速编译运行👺code runner插件方案Code Runner Configuration 直接配置 相关指令和快捷键默认task配置和取消默认 配置文件补充介绍(可选 推荐阅读)😊使用vscode预置变量和环境变量环境变量的使用使用环境变量的好处环境变量可能引起的问题 检…...

十个方法杜绝CAD图纸泄密风险!2024年图纸防泄密指南!「必看」
随着信息技术的发展,CAD图纸的应用日益普遍,然而随之而来的图纸泄密风险也愈加严重。企业在提升效率的同时,更需重视信息安全。为此,本文将介绍十个有效的方法,帮助企业杜绝CAD图纸泄密风险,保障商业机密。…...

技术干货|HyperMesh CFD功能详解:虚拟风洞 Part 1
虚拟风洞VWT 从2023版本开始,虚拟风洞VWT(Virtual Wind Tunnel)模块合并到HyperMesh CFD中。 用户在VWT模块中完成LBM求解器ultraFluidX的前处理设置,导出参数文件XML和模型文件STL,并在GPU服务器上提交计算。 VWT目前…...

022集——统计多条线的总长度(CAD—C#二次开发入门)
如下图所示,选择多条线并统计长度: c#中不包含直接获取curve曲线长度 属性,需用如下方法:curve.GetDistanceAtParameter(item.EndParam) 附部分代码如下: using Autodesk.AutoCAD.ApplicationServices; using Autode…...

大模型重要技术系列三:高效推理
接上一篇高效训练,这一篇汇总下高效推理的方法。高效推理的两个主要优化目标是低延迟(快速得到推理结果)和高吞吐量(能同时处理很多请求),同时还要尽可能地少用资源(算力、存储、网络带宽&#…...

Android 刘海屏适配指南
如果您不希望您的内容与刘海区域重叠, 以确保您的内容不会与状态栏及 导航栏。如果您要呈现在刘海区域中,请使用 WindowInsetsCompat.getDisplayCutout() 检索 DisplayCutout 对象 包含每个刘海屏的安全边衬区和边界框。借助这些 API 您需要检查视频内容…...

微信小程序服务通知
项目中用到了小程序的服务消息通知,通知订单状态信息,下边就是整理的一下代码,放到项目中,把项目的小程序appid和小程序的secret写进去,直接运行即可 提前申请好小程序服务信息通知短信模板,代码需要用到模…...

Ubuntu使用Qt虚拟键盘,支持中英文切换
前言 最近领导给了个需求,希望将web嵌入到客户端里面,做一个客户端外壳,可以控制程序的启动、停止、重启,并且可以调出键盘在触摸屏上使用(我们的程序虽然是BS架构,但程序还是运行在本地工控机上的),我…...

泰州农商行
该文章用于测试,暴露面检测服务 1595116111115951161112159511611131595116111415951161115159511611161595116111715951161118159511611191595116112015951161121159511611221595116112315951161124159511611251595116112615951161127159511611281595116112915951…...

扫雷(C语言)
目录 前言 一、前提知识 二、扫雷游戏编写 2.2 test文件基本逻辑 2.2.1菜单编写 2.2.2game函数的逻辑 2.2.2.1定义两个数组 2.2.2.2两个数组数组的初始化 2.2.2.3打印棋盘 2.2.2.4布置雷 2.2.2.5排查雷 2.2.2.6获取坐标附近雷的数量 2.2.2.7什么时候…...