图像拼接之APAP算法代码详解

[图像拼接]APAP算法及相关问题研究 目录APAP算法思路几个问题SVD在最小二乘中的应用DLT求单应性矩阵HMoving DLT求局部单应性矩阵实现的小细节文献 图像拼接首先通过一些手段(标定、SIFT等特征点、其他传感器等)获取图像间的对应关系(2D-2D)。 这个对应关系可以用单应性矩阵HHH(也称透视变换)描述 [x′y′w′]=[h00h01h02h10h11h12h20h21h22][xyw]=H[xyw](1)\begin{aligned}\left[\begin{matrix}x'\\y'\\w'\end{matrix}\ri 阅读详情
AI摘要

本文详细介绍APAP算法的具体步骤,包括SIFT关键点检测与匹配、关键点坐标齐次化及归一化、RANSAC算法剔除外点、全局单应矩阵求解与局部单应矩阵的Moving DLT算法,以及图像融合等过程。

apap 算法:mdlt

matlab 很多内置函数都是对列操作,如mean()

1. VLFEAT库 检测和匹配 SIFT 关键点 kp1,kp2,matches
2. 关键点坐标齐次化:(x,y,1)
3. 归一化:normalise2dpts

Function translates and normalises a set of 2D homogeneous points so that their centroid is at the origin and their mean distance from the origin is sqrt(2). 将2d 齐次点的中心点坐标转移到原点,2d 齐次点和原点的平均距离为2\sqrt{2}2​ 。

% 例如:
a = [1,2,3;
	 1,2,3;
	 1,1,1];
[a1,t1]=normalise2dpts(a); 
% a1 =
%   -1.5000         0    1.5000
%   -1.5000         0    1.5000
%    1.0000    1.0000    1.0000
% 函数返回的a1 中心点为原点,且三个点距离原点的距离的平均值为 $\sqrt{2}$ 
% 可以验证:
dist = sqrt(a1(1,:).^2+a1(2,:).^2); % 2.1213 0 2.1213
meandist = mean(dist,2); % 1.4142

求normalise矩阵和新坐标 方法如下:

  • 求中心点坐标

    • c = mean(pts(1:2, : )’ )’,先转置变成2长列求完平均点坐标再转置

    • 或者可以mean(pts(1:2,finiteind),2) 即对行操作

  • 所有点坐标减去中心点坐标,求平方和,然后得到平方和的平均值meandist

    scale = sqrt(2)/meandist; 
    
    T = [scale   0   -scale*c(1)
         0     scale -scale*c(2)
         0       0      1      ];
         
    newpts = T*pts; % 归一化后的新关键点坐标
    
4. ransac 算法:对匹配对剔除外点,multigsSampling 得到500组残差 3040(sift匹配对数)*500
  • 得到小于Ransac阈值数量最多的一组残差,找到内点的索引

  • 在图中画出匹配关系图(内点)

5. 求全局单应矩阵, DLT

vgg_H_from_x_lin( xs1, xs2 ) 这里的 xs1和 xs2 都是 经过归一化的内点齐次坐标

  • condition points:

    • 先调用 C1 = vgg_conditioner_from_pts(xs1),normalizes Pts to have 均值 0 and 样本标准偏差为 2\sqrt {2}2​ 的变换矩阵C

      其中,样本标准偏差计算公式:在这里插入图片描述

      返回3*3 矩阵 C1,其中第三行是[0 0 1]

    • 再调用vgg_condition_2d,得到 xs1 = C1* xs1,xs2 = C2* xs2 ,新得到的 xs1,xs2 中的关键点坐标均值为0,std 为 2​\sqrt{2} ​2​​

      % 再次使用上面的例子
      % a1 =
      %   -1.5000         0    1.5000
      %   -1.5000         0    1.5000
      %    1.0000    1.0000    1.0000
      % 得到的a2 = C * a1
      a2  =
         -1.4142         0    1.4142
         -1.4142         0    1.4142
          1.0000    1.0000    1.0000
      % 可以验证:
      mean(a2(1:2,:),2); % ans = 0 0 
      std(a2(1:2,:)');   % ans = 1.4142 1.4142
      
  • svd 分解:
    min⁡h∥Ah∥,s.t.∥h∥=1A=[000−p1Tp2y∗p1Tp1T000−p2x∗p1T−p2y∗p1Tp2x∗p1T000] \min_h \left\| \mathrm Ah \right\|,s.t.\left\| \mathrm h \right\|=1 \\ \mathrm A = \begin {bmatrix} 0 & 0& 0& -p1^T & p2_y*p1^T\\ p1^T &0&0&0& -p2_x*p1^T \\ -p2_y*p1^T & p2_x*p1^T &0&0&0 \end {bmatrix} hmin​∥Ah∥,s.t.∥h∥=1A=⎣⎡​0p1T−p2y​∗p1T​00p2x​∗p1T​000​−p1T00​p2y​∗p1T−p2x​∗p1T0​⎦⎤​

    • A 中任取两行代入一个关键点坐标,得到两个方程,N个关键点,得到的A为2N*9

    • 取A 的svd分解中最小特征值对应的 v 向量,即 将9*9的V矩阵的最后一列作为 h向量

    • H = reshape(h,3,3)' ,matlab 中将h向量 按列重新排列成矩阵,所以需要转置

    • 由于代入A 中计算的特征点是 condition points,即此处的 H*(C1 * xs1) = C2 * xs2,所以 decondition 后的H为 C2−1∗H∗C1C2^{-1}*H*C1C2−1∗H∗C1 ,代码表示为:H = C2\H*C1; \ 表示对 C2 求逆

    • H = H/H(3,3) H(3,3) 归一化为1

  • Denormalise:

    由于之前使用 normalise2dpts 对原始关键点坐标做了处理,现在恢复H:

    H = T2\H*T1     % 类似deconditon
    
6. 得到拼接画布的尺寸大小
  • Map four corners of the right image. 采用的是左图保持原状,右图进行单应变换。

    由于求得的H 是将左图映射到右图,即 H*x_left = x_right,所以 x_left = inv(H) * x_right.

    取右图的四个顶点的齐次坐标 分别作为 x_right 的值,得到新的四个顶点坐标:TL, BL, TR, BR

    %% 例如求左顶点
    TL = Hg\[1;1;1]; % 即 inv(Hg)*[1;1;1], 得到非齐次形式
    TL = round([ TL(1)/TL(3) ; TL(2)/TL(3) ]);  % 齐次化!
    
  • 确定画布的尺寸(cw, ch)

    cw = max([1 size(img1,2) TL(1) BL(1) TR(1) BR(1)]) - min([1 size(img1,2) TL(1) BL(1) TR(1) BR(1)]) + 1;  % 投影面的 宽,通过最大的x(列)-最小的x(列)+1
    
    ch = max([1 size(img1,1) TL(2) BL(2) TR(2) BR(2)]) - min([1 size(img1,1) TL(2) BL(2) TR(2) BR(2)]) + 1;  % 投影面的 高
    
  • 确定左图的偏移量off,即左图img1 左顶点 在画布坐标系中的 坐标 (在下图中有体现)

    off = [ 1 - min([1 size(img1,2) TL(1) BL(1) TR(1) BR(1)]) + 1 ; 1 - min([1 size(img1,1) TL(2) BL(2) TR(2) BR(2)]) + 1 ];
    
7. 使用全局单应矩阵 映射源图像
  • 在空画布warped_img1 (ch, cw )中 根据偏移量off 确定 左图img1 的映射位置

  • 调用imagewarping.cpp,将matlab 中的变量传入c++ 函数,二维数组变成按列排列的一维数组指针,三维数组(如rgb 图像)变成二维数组指针(M* ( N * 3) ),不过在取像素值时也是变成一维数组按列索引

    void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
        // nlhs 代表输出参数个数,nrhs 代表输入参数个数
    {
        // 使用DLT,则输入参数为: 
        // double(ch),double(cw),double(img2),Hg,double(off)
    }
    
  • 上一步得到的TL, BL, TR, BR四个顶点坐标,是以img1 的左顶点为坐标原点.

    而在 imagewarping.cpp 中,需要以画布的左顶点为坐标原点.(在下图中有体现)

    例如:img2的原左顶点(1;1;1),经过 H−1∗(1;1;1)​H^{-1}*(1;1;1)​H−1∗(1;1;1)​ ,得到TL = (906; -141),此时的坐标系是img1。

    在以画布(3315*1844)为坐标系时,img2对应的TL = (906; 203),所以需要先减去 偏移量off (1;345)再加(1;1),得到(906; -141),再用 H * (906; -141; 1),再齐次化,即可大概得到 (1;1)。
    单应变换:x~′=Hx~x=[x,y]T,x~=[x,y,1]T计算得到的x~′=[x′,y′,z′],后续使用需要齐次形式,即x′=[x′/z′,y′/z′]. 单应变换:\widetilde{\mathrm x}'= \mathrm H \widetilde{\mathrm x} \\ \mathrm x = [x,y]^T,\widetilde{\mathrm x}=[x,y,1]^T\\ 计算得到的 \widetilde{\mathrm x}' =[x',y',z'],后续使用需要齐次形式,即\mathrm x'=[x'/z',y'/z'].\\ 单应变换:x′=Hxx=[x,y]T,x=[x,y,1]T计算得到的x′=[x′,y′,z′],后续使用需要齐次形式,即x′=[x′/z′,y′/z′].

    % 验证结果:
    Hg*[906;-141;1]= [1.2193;1.4887;0.9824];
    % 齐次化后的坐标: [1.2411; 1.5153] ≈ [1; 2]
    

    img2 映射

    /* For each pixel in the target image... */    // H * canv = img2
            for(i=0;i<canvm;i++)
            {
                for(j=0;j<canvn;j++)
                {
                    /* Get projective transformation for current source point (i,j). */   // 将source image(canv) 映射到 target image(img2) 的坐标为(posa, posb)
                    posa = round(((H[(Hm*0)+0] * (j-off[0]+1)) + (H[(Hm*1)+0] * (i-off[1]+1)) + H[(Hm*2)+0]) / ((H[(Hm*0)+2] * (j-off[0]+1)) + (H[(Hm*1)+2] * (i-off[1]+1)) + H[(Hm*2)+2]));
                    posb = round(((H[(Hm*0)+1] * (j-off[0]+1)) + (H[(Hm*1)+1] * (i-off[1]+1)) + H[(Hm*2)+1]) / ((H[(Hm*0)+2] * (j-off[0]+1)) + (H[(Hm*1)+2] * (i-off[1]+1)) + H[(Hm*2)+2]));
                    /* Find if the current pixel/point in the (warped) source image falls inside canvas. */
                    if ((posa > 1)&&(posa < img2n)&&(posb>1)&&(posb<img2m))
                    { // 如果映射后的点在img2 中,则进行像素赋值
                        /* If the current pixel in the source image hits the target (i.e., is inside the canvas) 
                         * we get its corresponding position in the 2D array. */
                        cidx = ((j-1)*canvm)+(i-1); 
                        sidx = ((posa-1)*img2m)+(posb-1);
                        
                        /* Warping pixel in source image to canvas. */  
                        if (cidx+ch1canv >= 0 && cidx+ch3canv < canvm*canvn*3 && sidx+ch1img2 >= 0 && sidx+ch3img2 < img2m*img2n*3)
                        {   // 像素点 赋值是按照数组指针,同一个点的rgb通道依次赋值 
                            warped_img2[cidx+ch1canv] = img2[sidx+ch1img2];
                            warped_img2[cidx+ch2canv] = img2[sidx+ch2img2];
                            warped_img2[cidx+ch3canv] = img2[sidx+ch3img2];
                        }
                    }
                }
            }
    
8. 线性加权融合 Blending images by simple average (linear blending)

上一步得到的warped_img1是左图所在位置,warped_img2是右图所在位置,都是ch*cw 的尺寸

调用imageblending(warped_img1, warped_img2):

  • 二值化 imfill(img, 'holes')

  • 将二值化的值 作为左右图在每个像素点的权重,简单加权:(img1* w1+ img2* w2) / (w1+w2)

9. APAP,Moving DLT (projective)
  • 左图img1 的内点的原始坐标Kp​\mathrm{Kp}​Kp​,以左图左顶点为参考

  • 将画布划分成99*99个网格,记录网格所有顶点的坐标:则 X, Y 维度都是100 *100,以画布左顶点为参考

    变换画布顶点的坐标,则Mv = [X(:)-off(1), Y(:)-off(2)]; 此时以左图左顶点为参考

  • 对每一个网格顶点,计算其与 img1 中所有内点的高斯权重 Gki :Gki = exp(-pdist2(Mv(i,:),Kp)./sigma^2);

    算法理论:

w∗i=exp⁡(−∥x∗−xi∥2/σ2)这里的x∗是网格的顶点坐标,xi是经过RANSAC算法筛选后的匹配对(xi,xi′)中的左图关键点坐标!写成矩阵形式:h∗=arg⁡min⁡h  ∥W∗Ah∥2,这是一个WSVD问题,其解为W∗A对应的最小特征值的右奇异特征向量!其中,权重矩阵W∗=diag([w∗1w∗1⋯w∗Nw∗N])∈R2N×2N w_*^i=\exp(-\left\|\mathrm x_*-\mathrm x_i\right\|^2/\sigma^2) \\ 这里的 \mathrm x_*是网格的顶点坐标,\mathrm x_i 是经过\mathrm{RANSAC}算法筛选后的匹配对(\mathrm x_i,\mathrm x_i')中的左图关键点坐标! \\ 写成矩阵形式:\\ \mathrm h_*= \mathop{\arg\min}_{\mathrm h} \ \ \| \mathrm{W_*Ah}\|^2,这是一个\mathrm {WSVD}问题,其解为\mathrm{W_*A}对应的最小特征值的右奇异特征向量! \\其中,权重矩阵 \mathrm W_*=\mathrm{diag}([w_*^1 w_*^1\cdots w_*^N w_*^N])\in \mathbb{R}^{2N×2N} w∗i​=exp(−∥x∗​−xi​∥2/σ2)这里的x∗​是网格的顶点坐标,xi​是经过RANSAC算法筛选后的匹配对(xi​,xi′​)中的左图关键点坐标!写成矩阵形式:h∗​=argminh​  ∥W∗​Ah∥2,这是一个WSVD问题,其解为W∗​A对应的最小特征值的右奇异特征向量!其中,权重矩阵W∗​=diag([w∗1​w∗1​⋯w∗N​w∗N​])∈R2N×2N

  • 为了避免数值问题,将权重过于接近0的数以一个小量 γ\gammaγ 来代替:Wi = max(gamma,Gki);

  • 进行 wsvd 分解,调用wsvd.cpp 得到各个网格顶点对应的 局部单应矩阵

  • 同样地,进行De-condition 和 De-normalize 处理 !

10. Warping images with Moving DLT 映射左右图到画布

imagewarping 函数传入的参数有:double(ch),double(cw),double(img2),Hmdlt,double(off),X(1,:),Y(:,1)'

其中,Hmdlt 矩阵的每一行是网格顶点的局部单应矩阵 按列排列后的结果

  • 在空画布warped_img1 (ch, cw )中 根据偏移量off 确定 左图img1 的映射位置

  • 确定空画布warped_img2 (ch, cw )中 每一点使用哪一个局部单应矩阵

    /* Get grid point for current pixel(i,j) */   
    for(xinx=0; xinx < xn && j >= X[xinx]; xinx++);  // xn =100,yn=100
    for(yinx=0; yinx < yn && i >= Y[yinx]; yinx++);
    
    inx = yinx + xinx*yn;
    
  • 将该点映射到img2 中,如果在范围内,则进行颜色通道间的像素赋值

11. 线性加权融合 (方法同 DLT)

That’s all ! Byebye.​{\color{Green} Byebye.}​Byebye.​

  • 遗留问题:

    • 将关键点匹配对内点代入A 矩阵时,符号有点问题 (vgg_H_from_x_lin.m)
图像拼接CVPR2013文章——APAP算法代码详解 APAP算法代码详解 阅读详情

相关推荐

计算机视觉--图像拼接

文章目录1. 图像拼接介绍1.1 图像拼接步骤1.2 图像拼接算法1.2.1 单应性矩阵1.2.2 APAP算法1.2.3 最小割和最大流最小割最大流2. 实验内容与结果2.1 固定点位拍摄多张图片进行拼接2.2 针对同一场景,更换拍摄位置3.总结 1. 图像拼接介绍 图像拼接在实际的应用场景很广,小到我们手机的全景图片,大到航天领域和地理图像领域,都会用到推向拼接,图像拼接的结果好坏会直接影响接...

weixin_43998483的博客 1492

图像拼接算法APAP源代码

matlab语言编写 图像拼接论文精读专栏:https://blog.youkuaiyun.com/qq_36584673/category_11076501.html 图像拼接论文源码专栏:https://blog.youkuaiyun.com/qq_36584673/category_11691339.html

利用python语言实现多张图像拼接

目录图像映射与全景拼接图像拼接基本原理图像拼接基本流程图像拼接代码测试结果分析 图像映射与全景拼接 图像拼接基本原理 图像拼接基本流程 图像拼接代码测试 结果分析

qq_44818951的博客 1万+

图像拼接——APAP算法

一、图像拼接技术 1、基本介绍 图像拼接是将同一场景的多个重叠图像拼接成较大的图像的一种方法,在医学成像、计算机视觉、卫星数据、军事目标自动识别等领域具有重要意义。图像拼接的输出是两个输入图像的并集。通常用到五个步骤: 二、APAP算法 1、 ...

DeerDolphin的博客 1万+

apap图像全景拼接

文章目录基本原理图像配准关于最小割关于最大流apap的实现流程代码实现实验场景场景一场景二遇到的问题 基本原理 图像配准 图像配准(apap)是将两张场景相关的图像进行映射,寻找其中的关系,多用在医学图像配准、图像拼接、不同摄像机的几何标定等方面,其研究也较为成熟。OpenCv中的stitching类就是使用了2007年的一篇论文(Automatic panoramic image stitchi...

monetvan的博客 3270

图像拼接步骤及算法

三种图像拼接方法:APAP方法、SPHP方法、PT方法 图像拼接步骤 图像配准、图像对齐与光束法平以及图像后处理 下面介绍图像拼接的有关算法: 图像配准是图像拼接中的至关重要的一步,在图像配准中,特征提取与匹配是最关键的一个步骤。 普通检测方法检测的高相应值的特征点通常分布于纹理明显的区域,在相对平滑的区域,特征点分布较为稀疏。 特征提取 特征提取主要分为:特征检测与特征描述 经典局部特征提取方法 SIFT SURF ORB 通过FAST检测器来检测特征点,以BRIEF描述方式来获取描述符向量,加入了方向信

qq_42383076的博客 1万+

APAP算法详解和VS代码实现

前段时间由于学习需要好好研究了一下APAP,由于对Matlab不熟悉,并且没有Matlab和C++混合编程的经验,因此看到原作者的代码的时候真的是头疼,我只能一点点的去测试语句,这里很感谢这位博主的详尽文章思路分析,可能有些人看这个就懂了。 https://blog.youkuaiyun.com/chentianting/article/details/88869872 这里也要感谢一下这位博主,我们的交流让...

guet_gjl的博客 6351

Python 图像拼接

Python 图像拼接图像拼接1.1 基本介绍1.2 基本原理1.2.1 解决“鬼影”:APAP算法1.2.2 寻找最佳拼接缝1.2.3 图像融合1.3 实验过程1.3.1 实验代码1.3.2 实验结果1.3.3 结果分析 图像拼接 1.1 基本介绍   图像拼接技术就是将数张有重叠部分的图像(可能是不同时间、不同视角或者不同传感器获得的)拼成一幅无缝的全景图或高分辨率图像的技术。图像拼接在医学成像、计算机视觉、卫星数据、军事目标自动识别等领域具有重要意义。   图像配准(image alignment)和

weixin_44438112的博客 5235

VideoStitching APAP视频拼接算法

APAP视频拼接算法,可以实现多路视频的同步拼接。

【计算机视觉学习03】全景图像拼接

文章目录一、基本原理1.1 图像拼接的几何原理1.2 直线,圆,复杂曲线方程拟合1.3 RANSAC算法1.4 APAP算法1.5 寻找最佳拼接缝(Seam Finding)1.5.1 最大流问题1.5.2 最大流问题的增广链算法1.5.3 最大流最小割定理二、 图像拼接具体实现2.1 代码2.2 运行结果 一、基本原理 将两幅或多幅具有重叠区域的图像,通过特征匹配将具有相同的特征点(SIFT特征点)的图像拼接在一起,将来自多个不同视角拍摄的图像变换到同一视角下,拼接成一张宽视野图像。 图像拼接基础流程

一个正在努力学习的iter 7787

计算机视觉-全景图像拼接

文章目录1. 全景图像拼接1.1 基本介绍1.2 图像拼接整体流程1.3 基本原理1.3.1 特征匹配算法1.3.1 RANSAC算法1.3.1.1 RANSAC算法基本思想1.3.1.2 RANSAC 求解单应矩阵1.3.2 APAP算法1.3.2.1算法流程:1.3.3 寻找最佳拼接缝(Seam Finding)1.3.3.1 使用最大流最小割算法寻找拼接缝1.3.4 根据multi-band bleing策略实现图像融合2. 实验过程2.1 实验代码2.2 实验结果及分析 1. 全景图像拼接 1.1

weixin_43890415的博客 1万+

图像拼接 之 APAP

图像拼接 之 APAP

牛牛博士博客 1351

5分钟搞懂APAP图像拼接:从单应性矩阵到Moving DLT实战

本文深入解析了APAP图像拼接算法,针对传统全局单应性矩阵在处理视差场景时的局限性,详细阐述了其核心Moving DLT技术。通过结合SVD与加权DLT,APAP能为图像不同区域计算局部单应性变换,从而有效减少拼接鬼影和扭曲。文章提供了从原理到代码实现的完整指南,并指出了实战中的关键步骤与常见陷阱。

threejs5artist的博客 1108

基于APAP算法的图像和视频拼接

APAP算法是一种先进的图像拼接技术,通过结合3D投影和局部单应性优化实现高质量拼接。其核心步骤包括:1)柱面/球面投影矫正解决畸变问题;2)SIFT特征提取与匹配;3)全局单应性计算;4)基于网格划分的局部单应性优化(使用能量函数平衡全局一致性和局部对齐);5)图像变形与多频段融合。算法采用2D平面进行3D数据计算而非3D建模,降低了实现复杂度。数学推导上,将单应性矩阵展开为9维向量,构建稀疏线性系统并通过共轭梯度法求解,最终实现精确的图像对齐与无缝拼接。

qianbo042311的博客 1167

APAP算法的图像拼接技术精讲与实战

图像拼接技术作为计算机视觉领域的一个重要分支,在多个方面发挥着关键的作用,如地图制作、全景摄影、虚拟现实等。它通过将多张部分重叠的图像结合起来,生成一张宽视角、高分辨率的全景图像。本章将概述图像拼接的基本概念、技术发展以及应用现状。在图像拼接过程中,需要解决的关键问题包括图像对齐、特征匹配和图像融合。图像对齐是指将不同图像中相对应的点正确对应起来,而特征匹配则是找到不同图像间的共性特征点,为图像对齐提供基础。最终,通过图像融合技术将多张图像无缝拼接成一张全景图像。

weixin_34162851的博客 1153

一种图像拼接算法(APAP算法)

适用于多张图像拼接的方法

Python计算机视觉(三)—图像拼接

图像拼接是计算机视觉中的重要分支,它是将两幅以上的具有部分重叠的图像进行拼接从而得到较高分辨率或宽视角的图像。本文将结合python+opencv实现两幅图像的拼接。1.根据给定图像/集,实现特征匹配2.通过匹配特征计算图像之间的变换结构3.利用图像变换结构,实现图像映射4.针对叠加后的图像,采用APAP之类的算法,对齐特征点5.通过图割方法,自动选取拼接缝6.根据multi-band blending策略实现融合。

summer_524的博客 2万+

qt下的APAP(MDLT)代码

在qt环境中,编写的As-Projective-As-Possible Image Stitching with Moving DLT(apap mdlt)代码,虽然写的有点乱,但还是可以用的

上一篇: 解决 ubuntu 下 MATLAB 中文乱码问题
下一篇: jupyter notebook 高效率使用(快捷键)
小鱼吃虾米_tt
博客等级 码龄10年 35粉丝 15原创
评论 26
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值