基于点云数据的道路面自动化提取——生长算法

MLS点云道路标线自动化处理:基于PCL/OpenCV实现95%提取精度的全流程实战 本文详细介绍了基于PCL/OpenCV实现MLS点云道路标线自动化处理的全流程实战,包括点云预处理、地面分割、标线提取、对象分类和矢量化输出等关键步骤。通过改进的自适应地面分割算法和融合多特征的地理参考图像生成技术,实现了95%的提取精度。文章还提供了性能优化策略和典型场景参数配置,为高精地图制作和自动驾驶环境感知提供了实用解决方案。 阅读详情
AI摘要

本文探讨了如何利用三维实景数据采集技术,特别是点云数据,通过地面分离和路面提取算法,结合生长算法,实现道路路面的自动化标记和分类。着重介绍了地面平面滤波和区域生长算法在道路基础设施数字化中的应用,以提升数据处理效率和准确性。,

基于点云数据的道路面自动化提取——生长算法

摘要

  为了信息化管理和维护在役的道路基础设施,同时为高精度地图的制作和城市规划管理提供数据支撑,行业内开始探索“三维实景数据采集技术”在道路基础设施数字化中的应用。三维实景数据采集技术,一般狭义上指代激光雷达扫描技术,可对物理世界中道路场景的三维坐标、颜色和和反射率等信息进行采集,并可实现计算机内道路环境的三维重构,为道路信息的提取提供了数字化平台。

  在采集数据中,道路路面是道路基础设施的骨架信息,道路标志、标线、平整度等信息的提取都需要在路面提取的基础上开展。但是计算机和采集设备无法自行对数据进行标记分类,而且由于采集数据量极为庞大,单个数据特征不明显,采用人工筛选的办法极为耗时,且成本高昂。 如何快速和高精度的对数据进行标记分类,从中提取出道路的路面区域,已经是当前道路基础设施数字化领域面对的重要问题。

  本文提取道路路面可以分为两个部分,第一部分,地面分离,使地面与非地面两部分点云数据实现分离。第二部分,路面提取,从地面点云当中分离出路面点云。

准备工作

点云数据

  首先,你需要准备一份点云数据,数据量不要太大,100万以内,python算得有点慢,其次点云的密度尽量高一些。本人准备的数据包含201001个点,道路场景如下:

​image​

运行环境

  本文使用Python,版本为3.10.10,矩阵计算使用的库为numpy,版本为1.24.2,点云处理的库为opend3d,版本为0.17.0。

具体过程

读取数据

  首先导入所用到的数据库,使用open3d库读取点云数据。

import numpy as np
import open3d as o3d
from abc import ABC, abstractmethod

class ReadDatas:

    def __init__(self, path: str) -> None:
        self.path: str = path
        self.pcd = self.read_point_cloud()
        self.pcd_np = np.asarray(self.pcd.points)
        self.pcd_hmax = self.pcd.get_max_bound()[2]
        self.pcd_hmin = self.pcd.get_min_bound()[2]
        self.pcd_num = len(self.pcd_np)
        self.theta_threshold = 20
        self.cosine_threshold = np.cos(np.deg2rad(self.theta_threshold))
        self.curvature_threshold = 0.035
      

    def read_point_cloud(self):
        '''读取点云文件'''
        pcd = o3d.io.read_point_cloud(self.path)
        return pcd

    def np_to_o3d(self, points):
        name = ''
        name = o3d.geometry.PointCloud()
        name.points = o3d.utility.Vector3dVector(points)
        name.estimate_normals()

创建基础算法

  在地面分离和路面提取当中,会用到一些共同算法,本文把这些基础算法都封装到同一个类中。

class BaseAlgorithm(ABC):

    def __init__(self) -> None:
        self.data = None

    def set_data(self, data) -> None:
        self.data = data

    def fit_plane(self, points):
        ''' 利用svd奇异值求解,拟合平面'''
        centroid = np.mean(points, axis=0)
        centered = points - centroid
        u, _, _ = np.linalg.svd(centered.T, full_matrices=False, compute_uv=True)
        normal = u[:, -1]
        intercept = -np.dot(normal, centroid)
        return normal, intercept

    def seed_select(self, cloud):
        vis = o3d.visualization.VisualizerWithEditing()
        vis.create_window(window_name='种子点选取', visible=True)
        vis.add_geometry(cloud)
        vis.run()
        seed = vis.get_picked_points()
        vis.destroy_window()
        return seed

地面分离

  从点云数据中使地面与非路面分离,有效的降低了数据量的大小,排除了非地面点云数据对后面路面提取步骤的干扰,提升了路面的提取速度与效率。

  地面分割其难度主要体现在以下几个方面:

  • 地面形状的多样性:地面在不同场景下的形状和高程特征往往各异,如平坦地面、山地地面、道路地面等,这就要求地面分割算法能够适应不同形状的地面,并能准确地划分地面点和非地面点。
  • 点云噪声的干扰:点云数据通常会受到各种噪声和干扰,如传感器误差、大气光学、光线衍射等,这些噪声和干扰会影响地面分割的准确性和可靠性。
  • 非地面目标的复杂性:点云中除了地面外,还包含着各种非地面目标,如建筑物、树木、车辆等,这些目标的形状和高程特征也各异,有些与地面接近甚至重叠,这就要求地面分割算法能够准确地区分出这些非地面目标。
  • 数据量的大:点云数据通常非常庞大,因此地面分割算法需要具备高效的处理能力和大规模数据的处理能力。

  地面分离采用的事故地平面滤波算法。地平面滤波算法是一种改进的 RANSAC 算法,主要用于从点云数据中提取地面平面。该算法由 Dimitris Zermas 在2017年提出,其主要思想是利用先验知识来消除典型平面拟合技术中的随机选择,从而提高拟合效率。

  在道路场景中,地面往往是相对平坦的,而且最低高度值的点很有可能属于地面。因此,该算法利用这一先验知识来确定种子点。假设这一批种子点为最低点。该算法通常会将点云数据按照车辆行进方向等距划分成不同的片段,以处理道路上的起伏情况。对于每个点云片段,执行如下操作。

  1. 确定一组具有低高度值的种子点。
  2. 使用SVD算法并用于估计种子点构成地平面。
  3. 计算点云数据中其余点到估计平面的距离h,距离小于设置阈值ground_h的点加入到种子点中。
  4. 重复这个步骤iterations次,最后所有的种子点即为所求的地面。

  当然,本人认为高度最低的点不一点使种子点,可能使某些干扰点,所以对算法进行了修改,设点云数据中高度最低的nlrp个点云高度的平均值加上thseeds的和为A,高度值小于A的值都为地面点。

  算法代码如下:

class GpfGroundExtractor(BaseAlgorithm):

    def _process_data(self, nlrp: int = 1000, thseeds: float = 0.1, ground_h: float = 0.15, iterations: int = 10):
        xyz = self.data.pcd_np
        xyz = xyz[np.lexsort(xyz.T)]
        elevation_nlrp_min_mean: float = np.average(xyz[:nlrp, 2])
        seed = xyz[xyz[:, 2] < thseeds + elevation_nlrp_min_mean]

        for i in range(iterations):
            normal, intercept = self.fit_plane(seed)
            h = (xyz[:, 0] * normal[0] + xyz[:, 1] * normal[1] + xyz[:, 2] * normal[2] + intercept) / np.linalg.norm(
                normal)
            seed = xyz[np.abs(h) < ground_h]

        self.data.ground = seed
        self.data.no_ground = xyz[np.abs(h) >= ground_h]
        self.data.ground_num = len(self.data.ground)

  运行以下代码:

if __name__ == '__main__':
    path = '你的点云数据的路径'
    pcd =  ReadDatas(path)
    gpf = GpfGroundExtractor()
    gpf.set_data(pcd)
    gpf._process_data()
	ground_o3d = self.gpf.np_to_o3d(self.pcd.ground)
	o3d.visualization.draw_geometries([ground_o3d])

  你就可以看到提取出来的地面了。

​image​

路面提取

  点云数据经过地面分割后分割成两部分,一部分是非地面点云,通常包括建筑物、汽车和人群等,另一部分是地面点,包括草地、人行道和路面等,路面提取的内容主要是从地面点中提取出属于路面点云。

  • 点云数据经过地面分割后分割成两部分,一部分是非地面点云,通常包括建筑物、汽车和人群等,另一部分是地面点,包括草地、人行道和路面等,路面提取的内容主要是从地面点中提取出属于路面点云。
    路面提取的难点主要体现在下面几点:
  • 杂散点干扰:点云中可能存在一些杂散点,例如噪声点、树木等,这些点可能会干扰路面点的提取。在路面点提取过程中,需要使用一些滤波算法去除这些干扰点,以提高路面点的准确性和可靠性。
  • 车辆遮挡:在车辆行驶过程中,可能会出现车辆遮挡的情况,这可能会影响点云数据的质量和精度,因此需要考虑车辆遮挡的影响,使用合适的算法进行处理。道路起伏程度大:一些路面提取的算法依赖于道路路面平整的假设,如果路面起伏过大容易出现过分割的现象,即将部分属于道路路面的点的部分分割掉。

  区域生长算法是一种常用的图像分割算法,通过选取点云集中的一点或者多点作为种子点,种子点根据一定的生长规则,从自身开始不断向周围进行扩散,直至停止,被扩散到的区域即为提取的区域。

种子点选取

  使用区域生长算法提取道路路面的过程中,种子点的选取十分重要。按照上述原理,必须选择一个在道路上点作为种子点,所以不能采用随机取样的方法。通常业内选择平均曲率或者高程最小的点作为种子点,但在实际过程中,这些点未必在道路上,这导致了最后提取道路路面的失败。在程序中,种子点的选取采用的手动选取的方式,采取方法所示,需要使用者在图形交互页面点击一个点作为种子点,这保证选取的种子点一定是在道路上的点。

​image​

区域分割

  通常种子点的生长规则是把种子点与其各邻域点法向量夹角和各邻域点的曲率值作为约束条件,而这约束生长规则成功提取道路路面点存在前提条件,即道路路面与其周围环境的交界处存在较大曲率与法向量变化。但是在实际的道路环境当中,为了方便轮椅等过街穿行,道路与人行道有一段相对低矮平整的交接处,按照上述的生长规则,种子点可能会随着这段交界处扩散到人行道上,导致提取道路路面失败,在本程序中,可以通过图形化操作界面预先将这一交界处进行分割,排除连接处对提取过程的干扰。

生长算法

  区域生长算法的流程图

​image​

  区域生长算法的具体步骤:

  • 通过可视化的交互界面输入初始种子点。
  • 对道路与人行道这些交界处进行切割。
  • 输入法向量夹角与曲率的阈值。
  • 种子点搜索自身最近的几个邻域点。
  • 计算种子点与最近邻域点之间的法向量夹角,夹角小于法向量夹角阈值的邻域点进入下一步。
  • 邻域点的曲率与曲率的阈值进行比较,小于阈值的点如果不在种子点序列中,加入到种子点当中。
  • 计算下一个种子点,重复4到6步直至再无下一个种子点。

  结果如下:

​image​

  具体代码:

class ReGrowSegment(BaseAlgorithm):

    def __init__(self, data, theta_threshold = 20, curvature_threshold = 0.035) -> None:
        self.data = data
        self.ground_np = self.np_to_o3d(self.data.ground)
        self.seed = self.seed_select(self.ground_np)
        self.no_paves = self.find_no_paves(self.ground_np)
        # np_clouds = np.asarray(clouds)
        self.no_paves = self.find_index(self.data.ground, self.no_paves)
        self.nebor_all = self.find_neighbour_points(self.ground_np)
        self.curvity = self.curvature_calculation(self.ground_np)
        self.paves = np.array(self.seed)
        self.cosine_threshold = np.cos(np.deg2rad(theta_threshold))
        self.curvature_threshold = curvature_threshold
      

    def _process_data(self) -> None:

        while len(self.seed) > 0:
            seed_now = self.seed[0]
            nebor = self.nebor_all[seed_now]
            nebor = np.asarray(nebor)

            nebor_np = nebor[np.isin(nebor, self.paves, invert=True)]
            nebor_new = nebor_np[np.isin(nebor_np, self.seed, invert=True)]
            nebor_new = nebor_new[np.isin(nebor_new, self.no_paves, invert=True)]

            if len(nebor_new) > 0:
                curr_seed_normal = self.ground_np.normals[seed_now]  # 当前种子点的法向量
                seed_nebor_normal = [self.ground_np.normals[int(i)] for i in nebor_new]  # 种子点邻域点的法向量
                dot_normal = np.fabs(np.dot(seed_nebor_normal, curr_seed_normal))
                nebor_new = nebor_new.astype('int64')
                curvity_now = self.curvity[nebor_new]
                a = dot_normal > self.cosine_threshold
                b = curvity_now < self.curvature_threshold
                c = a & b
                paves_new = nebor_new[c]
                self.paves = np.append(self.paves, paves_new)
                self.seed = np.append(self.seed, paves_new)

            self.seed = np.delete(self.seed, [0])

        self.data.paves = self.paves
        self.data.paves_num = len(self.data.paves)

  把上述代码放在同一文件中,运行一下代码:

if __name__ == '__main__':
    path = '你的点云数据的路径'
    pcd =  ReadDatas(path)
    gpf = GpfGroundExtractor()
    gpf.set_data(pcd)
    gpf._process_data()
	reg = ReGrowSegment(pcd)
	reg._process_data()
	paves = ground_o3d.select_by_index(pcd.paves)
	no_paves = ground_o3d.select_by_index(pcd.paves, invert=True)
	no_ground = gpf.np_to_o3d(pcd.no_ground)
	paves.paint_uniform_color([1,0,0])
	o3d.visualization.draw_geometries([no_paves,paves,no_ground])

  ‍

无人机AI道路缺陷检测技术解析与应用 计算机视觉与目标检测技术是智能交通系统的核心支撑,其中YOLO算法因其实时性优势被广泛应用于道路缺陷识别。通过无人机航拍结合深度学习模型,系统能自动检测坑洼、横向裂缝等典型道路病害,准确率可达90%以上。这种技术方案大幅提升了巡检效率,特别适合高速公路、山区道路等复杂场景。关键技术涉及图像采集规范、数据增强策略以及模型量化部署,其中RTK厘米级定位和热成像传感器解决了夜间检测难题。实际应用中,该方案已实现每日120公里自动化巡检,为道路养护决策提供精准数据支持。 阅读详情

相关推荐

从移动激光点云到高精地图:道路标线智能识别与结构化建模全流程解析

本文深入解析了从移动激光点云到高精地图的核心流程,重点阐述了道路标线的智能识别与结构化建模技术。通过地面滤波、特征图像生成与点云回溯实现精准提取,结合规则与模型匹配完成自动化分类,最终通过矢量化建模生成地图要素。该全流程方案能大幅提升高精地图生产效率与精度,为自动驾驶与智慧交通提供关键数据支撑。

weixin_29079671的博客 157

PCL教程-点云分割之区域生长分割算法

Inputs: Point cloud= Point normals= Points curvatures= Neighbour finding function Curvature threshold Angle threshold Initialize: Region list Available points list Algorithm: While is not emptydo Current re...

DayDayUp 2万+

PCDViewer进阶操作:从可视化到高效编辑的实用指南

本文深入探讨PCDViewer的进阶操作技巧,从点云可视化到高效编辑的全流程优化。通过实战案例展示如何利用扩散选点、动态噪声过滤、智能标注等功能提升工作效率,特别适合处理大规模激光雷达数据。文章还揭示了命令行模式、内存管理等隐藏功能,帮助专业用户解锁PCDViewer的全部潜力。

weixin_30675247的博客 482

激光雷达(LiDAR)点云数据知多少?

点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达 本文转自 | 新机器视觉作为一位测绘小白当看到眼前这些密密麻麻的点是否让你感到眼前一黑呢?你能获取...

小白学视觉 1万+

地面点云提取:概述、方法与实现

地面点云提取是点云数据处理中的重要步骤,可以帮助我们从点云数据中提取出地面信息,以实现场景分割和障碍物检测等任务。通过选择合适的方法和参数,我们可以有效地提取出地面点云,并为后续的点云处理任务提供准确的输入。基于形状的方法:另一种常见的地面点云提取方法是基于地面平面的形状特征。该方法在计算每个点与其邻域点的法向量时,通过对比法向量与给定阈值的差异来判断点是否属于地面。基于阈值的方法:最简单的地面点云提取方法是基于高度阈值的筛选。基于统计的方法:统计学方法通过分析点云数据的属性分布来实现地面点云提取。

FxRuby的博客 1294

PCL点云处理之基于拟合面的道路点云提取(一百零六)

对于道路点云的提取,是进行后续路面地物点云分割的前提,这里介绍一种基于点云到拟合面距离进行道路点云提取的方法。对于平坦分布的道路点云具有很好的提取效果,通常也是可以用的,因为道路一般都是符合这一条件的,虽然在较长的范围内可能存在起伏,但若是我们提前对道路进行分段,那么使用该方法将达到较好的效果,具体本文方法得到的效果,如下图所示:(红色点云即为道路点)

weixin_44329757的博客 1413

从点云到高德地图:聊聊道路标线自动化处理背后的那些“坑”与最佳实践

本文深入探讨了激光点云技术在道路标线自动化处理中的七大工程挑战与解决方案,包括地面点过滤、标线像素检测、复杂场景分类等关键环节。通过多模态过滤方案、动态区域生长算法和分布式处理框架等创新方法,有效提升了标线矢量化精度与效率,为高精地图和自动驾驶领域提供了实用参考。

weixin_33725722的博客 237

c++ 点云道路要素提取/道路标线提取

c++ 基于自适应阈值Otsu算法提取三维点云要素信息

weixin_43896283的博客 2048

从自动驾驶到数字孪生:聊聊KITTI、Semantic3D这些点云数据集到底怎么用

本文深入探讨了KITTI和Semantic3D点云数据集在自动驾驶和数字孪生领域的实际应用。通过详细的数据处理流程、工具链选择和实战案例,帮助开发者高效利用这些数据集,提升算法性能和工业适配性。特别介绍了点云增强技巧、跨数据集联合训练方法以及常见陷阱规避策略。

weixin_30952535的博客 562

点云分割:从点云数据中分离地面

点云分割是计算机视觉和机器人领域中的重要任务,它的目标是从点云数据中将不同的物体或场景元素进行分离。其中一个常见的应用是分离地面,即从点云数据中提取地面部分的点集。本文将介绍如何使用ROS(机器人操作系统)和PCL(点云库)进行点云分割,实现地面的分离。至此,我们已经完成了使用ROS和PCL进行点云分割,分离地面的过程。接下来,我们将创建一个ROS包,用于处理点云数据。的输入点云数据,并通过简单的阈值滤波将地面点和非地面点进行分离。当节点开始运行时,它将从输入点云数据中分离出地面部分,并通过。

CyberSparkZ的博客 576

点云从入门到精通技术详解100篇-基于深度学习的三维植物点云分割网络

目前,针对植物表型的研究基本已经从二维领域转向三维领域,传统的三 维方法需要大量调参,且普适性不高,因此利用深度学习的方法来对植物表型 进行研究已经逐渐成为主流,三维领域很好地弥补了二维图像所缺失的深度信 息(二维图像存在重叠和遮挡的问题),但是深度学习的方式是需要大量的数据 来进行训练的,由于植物的类型众多和三维植物数据集的缺少,很难找到一种 普适性较高的方法来完成对各种植物表型的分割。因此探索出一个普适性高的 点云分割方法,寻找到包含多种植物的数据集也就成为了我们当前研究的重点。

getusushu的博客 1252

【计算机视觉】点云图像处理技术的应用及图像配准

变换模型估计:根据匹配的特征点,估计雷达点云与图像之间的变换模型。预处理:对雷达点云数据进行预处理,包括去噪、滤波、下采样等,以减少数据量并提高后续处理的效率。特征匹配:使用特征匹配算法,如SIFT、SURF或ORB,将雷达点云的特征点与图像的特征点进行匹配。数据采集:首先,需要同时获取雷达点云数据和相应的图像数据。配准:将雷达点云数据根据估计的变换模型进行配准,使其与图像对齐。自动驾驶汽车:自动驾驶汽车通过激光雷达(LiDAR)传感器获取周围环境的三维点云数据,进行障碍物检测、道路边界识别、车辆跟踪等。

G_redsky的博客 2493

Python点云处理总目录

Python点云处理的方法学习,自定义函数或调用Open3D库

weixin_44329757的博客 721

基于Matlab的道路缺陷检测系统开发与实践

图像处理技术在智能交通领域具有重要应用价值,其中道路缺陷检测是基础设施维护的关键环节。通过中值滤波、边缘检测等经典算法组合,能有效识别裂缝、坑洞等典型道路缺陷。这类系统相比人工巡检可提升3-5倍效率,准确率达85%以上,特别适合工程现场使用。Matlab平台提供了完整的开发环境,从算法实现到GUI设计都能高效完成。实际部署时需注意树影干扰等误检场景的处理,通过HSV色彩空间过滤等技巧可显著提升系统鲁棒性。随着技术发展,结合YOLOv3等深度学习模型将成为重要升级方向。

weixin_34189116的博客 369

基于无人机与深度学习的叶面积指数自动化提取系统实战

叶面积指数是衡量植被冠层结构和生长状况的关键生物物理参数,在精准农业、生态环境监测等领域具有重要价值。其传统测量方法效率低下且难以实现大面积覆盖。随着无人机遥感与人工智能技术的发展,通过无人机搭载多光谱传感器获取高分辨率影像,并结合深度学习算法进行植被分割与光谱反演,已成为高效、精准获取LAI空间分布信息的主流技术路径。该技术方案的核心在于构建一个集数据采集、处理、分析与应用于一体的自动化流水线,能够实现从海量遥感数据中自动提取有价值的农情信息,为变量施肥、精准灌溉等智慧农业实践提供关键数据支撑,有效推动了

weixin_30932215的博客 361

区域生长算法

区域生长算法的简单实现,人工选取种子,对二值图像的前景进行分割。

【裂缝识别】基于matlab GUI路面裂缝图像处理系统(带面板)【含Matlab源码 14875期】

路面裂缝图像处理系统 完整代码,包运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 645

yolov7模型部署流程

yolov7部署流程

算法的猫 1396

从点云迷雾到精准标注:SUSTechPOINTS如何重塑自动驾驶数据标注范式

当自动驾驶研发团队面对海量3D点云数据时,一个核心挑战摆在面前:如何高效、准确地为这些空间数据打上语义标签?传统的2D图像标注工具在三维空间面前显得力不从心,而专业的三维软件又过于复杂且难以规模化。这正是SUSTechPOINTS诞生的技术背景——一个专为自动驾驶场景设计的3D点云标注平台,旨在解决从原始点云到结构化标注数据的转化难题。 ## 挑战篇:三维标注的复杂性与效率瓶颈 在自动驾驶感知

gitblog_00660的博客 763

【元宵快乐】猜灯谜吃元宵 元气满满闹元宵~(附猜灯谜小游戏)

导语 元宵节,又称上元节、灯节,是春节之后的第一个重要节日。 相传,汉文帝(前179—前157年)为庆祝周勃于正月十五勘平诸吕之乱,每逢此夜,必出宫游玩,与民 同乐,在古代,夜同宵,正月又称元月,汉文帝就将正月十五定为元宵节。 随着社会和时代的变迁,元宵节的风俗习惯在不断变化,但至今仍是中国的传统节日。2008年, 元宵节选入第二批国家级非物质文化遗产。 对我而言,除了吃元宵、看花灯……还有一件最重要的事情…就是… 猜灯谜!猜灯谜!!猜灯谜!!!猜谜事小,展现聪明才智事大哈哈哈.jpg .

顾木子吖的博客 2098

最优化学习笔记1——关于拟牛顿法推导

从2020年3月份到现在,一年的时间里断断续续自学最优化,结合豆瓣读书、知乎等网站上的推荐,翻阅了以下书和课程: Stephen Boyd和Lieven Vandenberghe的《Convex Optimization》,这本书被公认为学习凸优化的必读经典著作,其中大量的篇幅讲应用,讲理论和算法的篇幅稍少一些。在B网站上有Boyd的视频课程,油管上也有,不过只有英文字幕,如果是零基础接触,直接看Boyd的视频稍显费劲,B站上也有凌青老师以《Convex Optimization》为教材的讲解,推荐作为入

xiaofei473的博客 1768
上一篇: Kaggle 泰坦尼克号挑战赛
下一篇: MySQL操作
wiselisx
博客等级 码龄4年 98粉丝 7原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值