体感开发学习总结

从Kinect和Leap Motion谈体感的开发



【编者按】本文作者David Cardinal,David具有20余年的科技行业技术从业经验。他是DigitalPro for Windows的合作开发者,后者是Windows上首个专业的图像管理解决方案。本文是其结合今年Build大会上微软的开发经验,对Kinect和Leap Motion的体感开发所做的

理解。
当年Leap Motion的CTO David Holz第一次告诉我不要将太多的精力放在他们的硬件上,理由是大部分的诀窍都在软件——我半信半疑。而后来在微软的Build大会上,Kinect开发的负责人Alisson Sol详细描述了第一代Kinect是如何演变到今天时,我终于信服了。

体感开发的重点在于软件。硬件当然要够用,但不需要拔尖。从拆解的Leap来看,它带有的仅仅是3个现成的LED以及2个普通价格的摄像头。开发团队大部分的辛苦工作都在于如何让算法精确地识别出用户的动作。微软在Kinect上的抓握动作识别是研究体感开发很好的案例。


机器学习

在过去多年里,码农们花了大量的精力用预先架构的精妙算法来节省计算资源。而机器学习在一定程度上把这事揽了过去。通过机器学习,现在我们可以将大量的数据丢给电脑让它自行计算,同时只占用很低的CPU和GPU。当然,真正做起来比这复杂很多,并且做好了不

容易。但其结果将适用于一大类的识别——包括体感。

在开始机器学习之前,你首先要做的是收集大量的高质量数据。放在Kinect的例子就是数GB的深度标记的视频,视频中会有多名测试人员做出各种各样的手势、动作。然后这些视频片段需要进行人工标记来说明哪个节点上测试人员做了什么动作,这个过程其实类似传统
的科研数据收集过程。最后这些人肉标记的数据被称为“底层事实”——也就是识别过程所依照的标准。

同时你还要注意的一个问题是明确方向。微软的团队过去在做抓握动作识别时采用的是判断手掌的形状是开放的还是闭合的,但很长时间没有什么进展;而Sol的团队采用的方式是直接判断抓握和松手的动作——这才是他们改善抓握动作界面的关键。

从Kinect和Leap Motion谈体感的开发

把数据变成特性


一旦你有了足够多的标记数据,那下一步该是决定用数据的那些属性(或者特性)来判断一个手势。这点做起来不仅是技术,而且是艺术——确实不容易把握。你用来做判断的这些特性还要易于计算,比如Windows的Kinect团队只有2毫秒的时间用于识别抓握的动作。

在这个动作的识别上,团队最先采用的是计算距离掌心的像素数量(由骨架检测子系统采集)作为机器学习算法的主要特性。但后来他们发现了比较麻烦的一点,手的位置不够稳定所以这一特性很难准确地捕捉到。为此他们不得不为此开发了辅助算法——考虑了多种手

的位置以及识别过程中的位移。可惜这个方法收效平平。

最后,Sol改用深度标志数据中,抓握或松手时图像帧与帧之间的像素差异来判断这一动作,也就是每个像素点较前一帧的变化都会参与共同决定动作的发生。

从Kinect和Leap Motion谈体感的开发

让你的输出自己来完成代码

跟常见的面向结果的编程方式不同,机器学习系统——比如Kinect中的系统依赖于一组原始的理想输出(也就是最初标记的数据)来生成识别器(机器生成的代码)。而生成的识别器可以在实际应用中识别目标手势。

同时,你很快就会发现要计算上一步中选定的特性会变成一个大数据问题。30帧每秒的测试视频每小时的帧数超过10万,而每帧的像素数大约是30万个(新版Kinect还要多)。

即使你只是关注手部周围128×128的目标区域,那么每只手上要分析的像素点也超过1.6万个——也就是每帧6.4万个(出现了4只手)。尔后你将提取出来的特性输入到机器学习系统(应该叫众多的开放系统的变体)中。

Sol没有跟我们纠结各种机器学习算法间的区别,只是简单说明只要有足够的数据不同算法也会得到相近的结果(这点很容易理解)。在他们的项目中,他们采用的是ID3算法来创建决策树。ID3算法计算每个属性的信息增益,并选取具有最高增益的属性作为给定集合的测

试属性。

如果最初选定的特性足以完成一个动作识别的判断,那么系统生成的代码就会在更多的“底层事实”上跑过。反之,你就要撤回到特性选择的这一步。

不要急于测试,先分析

许多关于机器学习的研究论文最后都以“手指朝上,手指场下”这样的测试方法草草收尾。但对于Kinect这样的消费级产品,Sol表示这远远不够。为了达到推向市场的高标准,微软采用了数千种测试条目并且开发了配套工具来分析不同类型的错误,从而回过头来改善算

法。他用了手的速率举例:很显然当手部快速移动时,捕捉到的手的位置信息会有比较大的偏差——所以抓握动作的识别算法还需要将这一点考虑进去。

在测试中,因为要分析大量的帧数,所以即使是识别正确率达到99.9%,测试的结果还是会在每小时内大量出错。每次针对这些小故障的更新都需要对识别器(也就是用于动作识别的代码)进行几处改动。

Sol提到其中的一项更新就是区别左右手的图像识别,两者不能被当成镜像对应,因为左右手的光线和阴影是不对称的。

从Kinect和Leap Motion谈体感的开发

从Kinect和Leap Motion谈体感的开发

你可以想象得到运行这些测试计算需要很长的时间,Sol表示即使用80核的设备测试一个抓握识别器每次也需要一周的时间。

最后,Kinect团队还罗列了Microsoft Research在提升识别器速度上的帮助。其最终的结果是Kinect在Windows SDK 1.7中能提供抓握动作的控制;对开发者来说,这是非常有用并且有借鉴意义的功能。相类似的,虽然Leap在其开发流程上并没有像Kinect一样直白,但很

显然其软件实现同样将一堆现成的元件变成了当前市面上最强大的体感设备之一。
========

Kinect结合Unity3D引擎开发体感游戏(一)



最近公司项目需要做科技馆的体感游戏,以前也没接触过游戏,虽然以前自己也是想做游戏,我想大部分都是学编程出来来做游戏,哈哈(请允许我淫笑一下,终于可以做这方面)。虽然以前没接触过体感游戏,看到的体验也是大部分看到的视频,幸好现在网络还是比

较发达,上网大概了体感游戏开发,目前比较好的是Unity3D和Kinect结合交互进行开发。现在心里的感觉用句话说:哥现在也走在世界技术最前言,TMD碉堡了! 9月7号开始查阅网上的资料,一直没有找到详尽而又简单的方案。网上目前我看到就三种方法,说是三种方

法说白了就一种:中间件。形散而神不散--散文的最高境界(其实我语文不好,对不起祖国气我的期望,呜呜、、、)三种方法如下: 1.卡耐基梅隆的kinectWrapper.unitypackage; 2.OpenNI官方提供的OpenNI_Unity_Toolkit-0.9.7.4.unitypackage(现在官方不提供

更新与支持了,支持的版本unity3.4,在往上版本会出现很多问题,需要修改很多地方,比较麻烦); 3.自己写的交互的中间件,我在网上看见高手自己的写的中间件,封装为DLL,现在通过这段时间动手实现,发现自己写一个这样的中间件其实也不难,后期也自己准

备写一个。 我在采用的第一种方法,原因上面三点大概说来了,第二点以后考虑支持的版本和官方的态度,所以暂时不考虑;第三种目前自己还没写,目前来说也不太现实,也暂时不考虑考虑。所以目前情况就暂时考虑第一种; 废话说了那么多,相信各位机油们早就

寂寞难耐了,现在就切入正题: 一、Unity和Kinect交互的环境配置 我目前所使用的Unity3D的版本是Unity3.5; 使用的Kinect SDK版本是SDK1.6; Kinect和Unity交互的卡耐基梅隆的kinectWrapper.unitypackage方法是使用CMU的封装,这个方法支持的Kinect SDK版

本是SDK1.0,要想使用1.6版本以上的kinect SDK,就要做一些相应的修改。完整的方案如下(这个也为什么上面说后期打算自己封装一个类似这样组件DLL): 1、安装Uinty3D我使用的Unity3D版本是3.5,上官网下载(需要注册,才能用,我推荐大家去付点钱,我是自

己找的破解码,声明不支持这样的行为,大家懂就好)。 2、安装Kinect SDK我使用的SDK版本是1.6,可以在Kinect for Windows官方网站上下载。 3、在Unity3D工程中,如果需要使用和kinect交互,那么就需要在这个工程中导入卡耐基梅隆的

kinectWrapper.unitypackage。百度怎么用大家都懂吧(需要用kinect SDK版本是1.6以上版本(1,7以上版本还没试过替换是否可以,理论上应该也可以),就要下载KinectWrapperPackage替换文件并替换导入包中的KinectInterop.cs和KinectSensor.cs这两个文件即可

) 好啦!目前准备工作都ok了! 二、简单Kinect Wrapper Package for Unity3D包含了所有我们开发unity+kinect需要用到的脚本。 1.导入包之后,所有我们需要的资源都会出现在project面板中,具体来说是以下的一些资源: ![在此输入图片描述][1] 2.Scenes 

KinectExample - 示例场景,这个例子向你展示了如何通过在每一个kinect 可以追踪的骨骼点上放置小球来产生骨骼运动。 Prefabs Kinect_Prefab- 包含了我们开发unity+kinect程序所必需的所有脚本。但是它并没有包含你需要的用于控制模型的控制器(controller)

。 KinectPointMan - KinectPointController这个控制器(controller)是怎样使用的。 Kinect KinectModelControllerV2 - 需要将这个脚本拖放到你想要应用kinect控制的模型上。为了让模型能够跟上人的节奏,你需要将模型上控制模型动作的关键骨骼拖放到这个脚

本暴漏的合适的变量中 ,也就是将模型中的骨骼与kincet识别到的人的骨骼绑定起来。另外这个脚本暴漏的变量中,还有一个变量时标识模型是受哪个玩家控制。 KinectPointController - 需要将这个脚本拖放到场景中的游戏物体上。但是这个游戏物体不是模型,而

是由一系列分别代表头部、肩部、手等人体部位的点组成。你需要将游戏物体中的这些关键点都拖放到这个脚本暴漏的外部变量中。这样就可以使用kinect控制游戏物体了 DisplayDepth - 得到深度图像。 DisplayColor - 得到RGB图像。 KinectRecorder - 用于记录你

的动作,并为kinect模拟器(emulator)产生回放文件。 KinectEmulator - 模拟kinect设备.和KinectRecorder产生的回放文件一起工作。 KinectSensor - 从Kinect设备中取得数据。需要替换这个文件使用特用版本的SDK. DeviceOrEmulator - 设置使用kinect物理设备

还是kinect模拟设备. SkeletonWrapper - 脚本抓取骨骼数据. DepthWrapper - 脚本抓取深度图像数据. KinectInterop - 从Microsoft Kinect SDK中抓取数据. 三、使用KinectWrapperPackage包要想在自己的工程中 首先需要用unity3D创建一个空工程,然后将

kinectWrapper.unitypackage导入这个包到unity中,然后经过下面的步骤完成交互。 1、设置Kinect_Prefab前面提到过了,如果在Unity中和Kinect交互,Kinect_Prefab这个游戏物体是必不可少的。 这个物体需要存在于你的场景中的某处。所以当你切换场景时,它仍

旧存在着,因此你不必在每个场景中都实例一个Kinect_Prefab。 在Unity3D中,找到project面板中的Kinect_Prefab直接拖拽到Hierarchy面板就可以了。 2、控制游戏中的角色为了控制场景中的角色的移动,你需要将KinectModelControllerV2这个脚本拖拽到场景中的

模型上,并绑定骨骼; 当然你为了控制一系列的游戏物体,你需要将KinectPointController拖拽这些物体上。 下面分别说明这个脚本的使用(这两个脚本需要自己更具情况去定制)。 控制器:KinectPointController: 在场景中创建一个空物体对象,作为你想要控制

的容器。 将其他的物体拖拽到刚刚创建的空物体中,并放置到相同的位置。使刚才创建的空物体成为这些物体的父节点。 拖拽KinectPointController脚本到这些物体的父节点上。 选中父节点,在Inspector面板中暴漏的变量中,找到Sw变量 (该变量表示Skeleton 

Wrapper).拖拽当前场景中Kinect_Prefab赋给这个变量。 拖拽你想利用Kinect控制的每一个物体到Inspector面板对应的合适的变量中。 设置Player变量(代表玩家)和Mask变量(代表哪些骨骼收到监控). ![在此输入图片描述][2] 控制器:KinectModelControllerV2: 

拖拽脚本资源KinectModelControllerV2到场景中的模型中。 选择场景中的模型。找到模型中的暴漏变量Sw(它代表Skeleton Wrapper). 并将当前场景中的Kinect_Prefab拖拽给Sw这个变量。 详细展开你的模型,让模型的每一块骨骼在hierarchy面板中可见。 一个接一

个地把模型中的骨骼拖拽到脚本中暴漏的对应的变量中.确保每一个骨骼都对应到了正确的变量上。 当模型中所有的骨骼都放置好了之后,改变暴漏的Player变量的值,这个变量表明该模型是受哪个玩家控制, 0代表第一个玩家,1 代表第二个玩家。 接下来要设置暴漏

的Mask变量的值。设置合适的值,以决定是所有的骨骼都受Kinect控制,还是仅仅一部分骨骼受Kinect控制.如果这些受Kinect控制的骨骼都不是你想要的,你可以自己写一个控制模型的脚本来代替KinectModelControllerV2。 当游戏玩家在控制模型时,如果你想要该模

型同时播放自带的动画,那么你需要在暴漏的变量中选中animated选项,并设置BlendWeight变量的值,来决定模型受自带模型动画和Kinect驱动动作的最终混合效果。该变量取值范围为0到1之间。 ![在此输入图片描述][3] 四、运行KinectWrapperPackage包中事例 保

证Kinect设备连接成功指示灯为绿色,上面安装包安装配置好,最后运行事例 ![在此输入图片描述][4] 注意图片的左下角的数字,证明连接成功 ,连接成功的时候Kinect设备还会自己调整角度(最左边的指示灯会有红色)并且模型会随着你动而动 欢迎大家期待第二

篇,将写一个3D人物模型,随着身体指示,产生转身和前进与跑步 先上一张图(第二篇会上相关的脚本代码,由于unity脚本主要是c#和js,所以我采用c#写的脚本,9月7号才接触到unity和kinect,原来工作一直用c/c++,c#都是现学现买所以有不当之处,还请大家使

劲拍砖): ![在此输入图片描述][5] 在此感谢欢乐OSC群 感谢那些机油的鼓励 @铂金小猪 @铂金小狼 等
========

体感开发之XTion设备方法和原理



体感作为一个新兴的技术,其发展过程中融合了多种技术,但是这些技术的基础都是建立在体感设备之上的。

XTion其主要功能是获得所需空间的深度数据,并在此基础上集合了彩色数据,声音数据功能,从而使得体感开发更加多元化。

工具/原料
计算机一台
XTion Pro体感设备一个
方法/步骤
1
XTion设备:
XTion设备的核心是由红外线激光发射器、红外线激光接收器、处理芯片PS1080这三个部分组成。除此之外,还有一些附加的功能设备,如麦克风以及RGB摄像头等。
2
XTion设备的功能;
XTion体感设备最基本的功能是获取空间深度数据,并计算出其余数据,比如深度影像,人物影像,人物骨架等。设备还可以附加声音影像和彩色影像,用以摄像、彩色图像识别、语音识别、语音控制等,这些信息的加入。使得体感操控更加人性化。
3
硬件设备的软件支持OpenNI;
通常以体感设备为基础的体感应用开发软件包名为OpenNI,本质上是一种
API(应用程序编程接口)。
OpenNI可以将人体的空间深度信息从背景中剥离出来,并且演化出更丰富的人体空间位置信息,让抽象的视觉信息转化为具体的数字信息,从而使得计算机以及开发者可以去识别并使用这些数字信息。
4
深度感应器的工作原理:
XTion设备中3D深度感应模块所使用的技术称为光编码技术(Light Coding),这是一种光学式技术。其本质就是一张红外线激光编码图。
透过红外线投影机打到空间中去,也就是用红外线发出射线前经过编码后、肉眼不可见的红外线散斑,打到空间中,使得空间中被加上标记,由于散斑具有高度的随机性,因此空间中任何两处的散斑都会是不同的图案。接收器在截取空间的红外线影像后,把影像交给

PS1080芯片进行计算,算出深度图。
5
XTion设备散斑原理及光源标定方法:
所谓散斑就是当相干光从粗糙表面反射或从含有散射物的介质内部向后散射或投射时,会形成不规则的强度分布,出现随机分布的斑点,这些随机分布的斑点就称为散斑。
粗糙表面和介质中散射子可以看作是由不规则分布的大量面元构成,相干光照射时,不同的面元对入射相干光的反射或散射会引起不同的光程差,反射或散射的光波动在空间相遇时会发生干涉现象。当数目很多的面元不规则分布时,可以观察到随机分布的颗粒状结构图

案。
6
无法侦测物体深度:
XTion设备最佳工作范围为0.8~3.5m。
由于一些物体的材质不能形成有效的散斑,所有设备并不能抓取到这些物体的深度数据,比如透明材质和镜面材质,对这两种材质。均不能获取有效的深度数据。
END
注意事项
XTion的作用是获取深度图像
OpenNI本质是API应用程序编程接口
========

Kinect for Windows SDK开发入门(一):开发环境配置

http://www.cnblogs.com/yangecnu/archive/2012/03/30/2425766.html
前几天无意中看到微软发布了Kinect for windows sensor,进去看了一下Kinect应用的例子,发现Kinect除了作为xbox360游戏的外设外还能开发一些很酷的应用,而且微软也发布可针对Kinect开发的Kinect for windows SDK1.0正式版本,原本想买一个Kinect for 

windows sensor来进行开发玩一玩的,可是那个出来没多久,淘宝上只有代购的,而且比Kinect for Xbox360 sensor贵了很多,而且只能进行开发,考虑到以后开发完了,想玩Xbox的话直接就再买个主机,连上这个就可以玩体感游戏了,所以在淘宝上买了一个Kinect 

for Xbox360 sensor,这两个sensor的最大区别是for windows版本的有近景模式,能够进行近景识别。

首先来看一下Kinect设备:

1. Kinect设备
黑色的Kinect设备如下图:基座和感应器之间有一个电动的马达,通过程序能够调整俯仰角度,在上面的感应器中有一个红外投影仪,两个摄像头,四个麦克风和一个风扇。打开外面的盖子可以看到里面的构造:这些感应器用来捕捉RGB和深度数据,面对Kinect,从左往

右看。最左边是红外光源,其次是LED指示灯,再次是彩色摄像头,用来收集RGB数据,最右边是红外摄像头用才采集景深数据。彩色摄像头最大支持1280*960分辨率成像,红外摄像头最大支持640*480成像。

image_thumb3image_thumb5

在感应器的下方是麦克风阵列,他包括四个不同的麦克风,一个在左边的红外发射器下面,另外3个在右边景深摄像头下面。

初步了解了Kinect构造后,接下来看看开发环境的搭建:

2. Kinect for Windows SDK软硬件环境
Kinect for Windows SDK是一些列的类库,他能够使得开发者能够将Kinect作为输入设备开发各种应用程序。就像名字所显示的那样,Kinect for Windows SDK只能运行在32位或者64位的windows7及以上版本的操作系统上。

硬件配置
一台电脑,当然内存越大越好(推荐2G或者以上),处理器频率(2.66GHz及以上)越高越好。
Windows 7操作系统,以及支持Microsoft DirectX9.0c兼容的显卡
Kinect for Xbox360 Sensor(如果单买的话,自带有USB Power Adapter,如果是和Xbox360套装一起捆绑的话,因为Xbox主机能够直接为Kinect外设提供电源,所以没有电源,可能需要另买USB Power Adapter)
使用Visual Studio 2010 Express版本或者专业版进行开发时,需要安装最新版本的Kinect for Windows SDK,SDK中包含有对Kinect的硬件驱动。

软件配置
1. Visual Studio 2010 Express或者Visual Studio 2010专业版或其他版本

2. .NET Framework 4.0

3. Kinect for Windows SDK,最新版本为1.0版本,下载地址:http://www.microsoft.com/en-us/kinectforwindows/develop/overview.aspx

3. 安装步骤
安装SDK之前,需要断开Kinect与电脑的连接,并关闭Visual Studio。安装过程很简单,等SDK安装完成之后,将Kinect电源线插上并连接到电脑上,Win7会自动寻找和安装驱动,安装完成后就可以识别Kinect,这是Kinect上面LED指示灯会变成绿色。

看驱动是否安装成功,可以到电脑的设备管理器中查看,如下图:在Microsoft Kinect节点下应该有3个项,分别是Microsoft Kinect Audio Array Control,Microsoft Kinect Camera, 和 Microsoft Kinect Security Control.

查看Kinect麦克风是否安装成功可以在设备管理器的声音视频游戏控制器节点下查看,如下图,Kinect USB Audio 应该在这个节点下面:

image_thumb8image_thumb9

4. 创建第一个Kinect 项目
创建一个Kincet项目通常需要:

1. 创建一个VS项目,一般为了展示通常创建一个wpf项目。

2. 添加Microsoft.Kinect.dll引用,如果是早期版本的SDK,这个名称可能不同。

3. 引入Kinect命名空间。

Kinect支持3中类型的托管应用程序,分别是:控制台应用程序,WPF以及Windows Form应用程序。首先来创建一个Windows 控制台应用程序,然后在Main函数所在的代码中引入Kinect命名控件,代码如下:

using Microsoft.Kinect;
static void Main(string[] args)
{
    //初始化sensor实例
    KinectSensor sensor = KinectSensor.KinectSensors[0];
            
    //初始化照相机
    sensor.DepthStream.Enable();
    sensor.DepthFrameReady += new EventHandler<DepthImageFrameReadyEventArgs>(sensor_DepthFrameReady);
            
    Console.ForegroundColor=ConsoleColor.Green;

    //打开数据流
    sensor.Start();

    while (Console.ReadKey().Key != ConsoleKey.Spacebar)
    { 
            
    }
}

static void sensor_DepthFrameReady(object sender, DepthImageFrameReadyEventArgs e)
{
    using (var depthFrame=e.OpenDepthImageFrame())
    {
        if (depthFrame == null) return;
        short[] bits = new short[depthFrame.PixelDataLength];
        depthFrame.CopyPixelDataTo(bits);
        foreach (var bit in bits)
            Console.Write(bit);
    }
}


在上面的代码中,为了从摄像头中获取数据流,需要初始化KinectSensor对象,然后启动他。为了获取景深数据,我们给sensor的DepthFrameReady注册了时事件。上面的代码中数据通过DepthFrameReady事件触发。在Kinect应用中,这些获取数据的事件有

DepthFrameReady,ColorFrameReady以及SkeletonFrameReady。可以通过这些事件获取丰富的数据来完成各种有趣的应用。在上面的代码中,我们简单的将景深摄像头获取的数据输出打印到控制台上。运行程序,然后站在Kinect前面一段距离,你就会看到控制台上输出的

信息,酷吧。

5.Kinect SDK示例程序
安装完Kinect for Windows SDK后,快捷菜单列表中有一个Kinect SDK Sample Browser,自带有一些示例应用程序,打开后如下图:

image_thumb13

如果安装好了Kinect,就可以直接点击运行了:我试了一下,挺有趣的:

Kinect Explorer:这是一WPF程序,界面分为左右两个图像区域,左边通过彩色摄像头获取图像信息,并通过骨骼追踪将骨骼叠加在图像上,右边图像是通过景深摄像头获取的景深信息,也在图上叠加了骨骼信息,在这两幅图像下面是一些列对成像参数的设置。这个例

子主要是用来展示这几个传感器的应用以及如何获取传感器的信息,还包括获取骨骼数据。

Shape Game:这个一个简单的游戏,界面上的人是通过骨骼追踪绘制出来的,在Kinect前面晃动时,界面上的人也会跟着动,当碰到图形时能够得分。

Kinect Audio Demo:这个是语音识别的例子上面展示的是声音的方向,下面是语音识别的结果,有Red,Green,Blue三个单词,当站在Kinect前面说某个单词时,如果识别正确,横线会显示相应的颜色。试了一下,还是挺灵敏的。后的的例子是针对Kinect for Windows 

sensor设备的例子,我的Kinect for xbox Sensor不能用。

6.结语
本文简要介绍了Kinect传感器的结构,开发所需要的软硬件环境,并通过一个小例子展示了如何从Kinect获取数据,最后简单介绍了Kinect SDK所带的例子,希望本文能帮助你熟悉Kinect for windows SDK。
========
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值