【指纹识别】指纹识别【含GUI Matlab源码 029期】

【老生谈算法】基于matlab的指纹处理和识别算法详解及程序源码——指纹识别算法 基于matlab的指纹处理和识别程序 大家好,今天给大家介绍基于matlab的指纹处理和识别程序项目设计与原理。 文章目录: 基于matlab的指纹处理和识别程序1、项目简介2、难度指数3、运行环境:4、项目详解:5、源码下载: 1、项目简介 文件列表: main.m--------主程序。 imgread.m-----图像读取函数。 imgchg.m------将真彩色图像转换为灰度图像的函数。 imgcut.m------图像分割函数。 imgflt.m------图像去噪滤波。 imgdir.m 阅读详情

💥💥💥💥💥💥💥💥💞💞💞💞💞💞💞💞💞Matlab武动乾坤博客之家💞💞💞💞💞💞💞💞💞💥💥💥💥💥💥💥💥
🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚤🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀
在这里插入图片描述
🔊博主简介:985研究生,Matlab领域科研开发者;

🚅座右铭:行百里者,半于九十。

🏆代码获取方式:
优快云 Matlab武动乾坤—代码获取方式

更多Matlab图像处理仿真内容点击👇
①Matlab图像处理(进阶版)

⛳️关注优快云 Matlab武动乾坤,更多资源等你来!!

⛄一、指纹识别简介

指纹识别技术主要分三个步骤:指纹预处理、特征提取、指纹分类与匹配。
无论是指纹分类还是指纹匹配,都需要提取指纹的有效特征,而特征提取的性能很大程度上要依赖于指纹图像的质量。在实际应用中,由于采集条件和采集设备的因素,采集到的指纹图像质量比较差,容易导致很多问题,影响后续处理的效果。因此,指纹图像的预处理是关系到指纹识别系统性能好坏的一个关键。

1 预处理主要分以下四个步骤:
指纹图像灰度归一化和均衡化
归一化的目的:在于消除指纹采集过程中由于传感器自身的噪声以及因为手指压力不同而造成的灰度差异,将指纹图像的对比度和灰度调整到一个固定的级别上,为后续处理提供一个较为统一的图像规格。均衡化是对图像中像素个数多的灰度级进行展宽,对像素个数少的灰度级进行缩减。

指纹图像分割

其目标就是根据特征提取的需要,把指纹图像中质量很差、在后续处理中很难恢复的图像区域与有效区域分开,使后续处理能够集中在有效区域;能提高特征提取的精确度;能大大减少指纹预处理的时间。

指纹图像二值化

二值化的目的是把灰度指纹图像变成0、1取值的二值图像二值化后处理及细化
由于灰度滤波的不完全性,而且在二值化过程中有时会引入新的噪声,需要对图像进行滤波处理。采用加权中值滤波的方法,根据前景点的不同方向选用不同的权值模板进行滤波,以便于消除纹线上的孔洞和缺口。二值化后的纹线仍然有一定宽度,需要细化为单个像素宽度的骨架。细化算法很多,这里采用骨架提取技术。

⛄二、部分源代码

clc;

close all;

global immagine n_bands h_bands n_arcs h_radius h_lato n_sectors matrice num_disk

%immagine 双精度类型的灰度图

n_bands=4;

h_bands=20;

n_arcs=16;

h_radius=12;

h_lato=h_radius+(n_bandsh_bands2)+16;

if mod(h_lato,2)==0

h_lato=h_lato-1;

end

n_sectors=n_bands*n_arcs;%多少行数据量

matrice=zeros(h_lato);

for ii=1:(h_lato*h_lato)

matrice(ii)=whichsector(ii);

end

num_disk=8;%8个方向

% 1–> add database

% 0–> recognition

% ok=0;

chos=0;

possibility=6;%有6个菜单,分别为’选择图像并加入数据库’,‘指纹识别’,‘删除数据库’,‘可视化指纹图像’,‘可视化Gabor滤波’,‘退出’

messaggio=‘Insert the number of set: each set determins a class. This set should include a number of images for each person, with some variations in expression and in the lighting.’;

while chos~=possibility,

chos=menu('指纹识别系统','选择图像并加入数据库','指纹识别','删除数据库','可视化指纹图像','可视化Gabor滤波','退出');

%--------------------------------------------------------------------------

%--------------------------------------------------------------------------

%--------------------------------------------------------------------------

% 计算指纹编码并添加到数据库

if chos==1

    clc;

    close all;

    selezionato=0;%选择标志

    while selezionato==0

        [namefile,pathname]=uigetfile({'*.bmp;*.tif;*.tiff;*.jpg;*.jpeg;*.gif','IMAGE Files (*.bmp,*.tif,*.tiff,*.jpg,*.jpeg,*.gif)'},'选在灰度图');%打开一个灰度图

        if namefile~=0 %文件存在

            [img,map]=imread(strcat(pathname,namefile));%读取文件

            selezionato=1;

        else

            disp('选择灰度图');

        end

        if (any(namefile~=0) && (~isgray(img)))%文件不存在或不是灰度图

            disp('选择灰度图');

            selezionato=0;

        end

    end

    

    immagine=double(img);

    

    if isa(img,'uint8')%如果img是uint8

        graylevmax=2^8-1;%计算大小

    end

    if isa(img,'uint16')

        graylevmax=2^16-1;

    end

    if isa(img,'uint32')

        graylevmax=2^32-1;

    end

    fingerprint = immagine;

    

    N=h_lato;

    

    [BinarizedPrint,XofCenter,YofCenter]=centralizing(fingerprint,0);%二值化图像,计算中心点

    [CroppedPrint]=Cropping(XofCenter,YofCenter,fingerprint);%图像修剪

    [NormalizedPrint,vector]=sector_norm(CroppedPrint,0);%扇形,归一化输入图像        

    

    for (angle=0:1:num_disk-1)    

        gabor=gabor2d_sub(angle,num_disk);%Gabor滤波

        ComponentPrint=conv2fft(NormalizedPrint,gabor,'same');

        [disk,vector]=sector_norm(ComponentPrint,1);    

        finger_code1{angle+1}=vector(1:n_sectors);

    end       

    

    img=imrotate(img,180/(num_disk*2));%以一定角度对图像进行旋转

    fingerprint=double(img);

    

    [BinarizedPrint,XofCenter,YofCenter]=centralizing(fingerprint,0);

    [CroppedPrint]=Cropping(XofCenter,YofCenter,fingerprint);

    [NormalizedPrint,vector]=sector_norm(CroppedPrint,0);

    

    for (angle=0:1:num_disk-1)    

        gabor=gabor2d_sub(angle,num_disk);

        ComponentPrint=conv2fft(NormalizedPrint,gabor,'same');

        [disk,vector]=sector_norm(ComponentPrint,1);    

        finger_code2{angle+1}=vector(1:n_sectors);

    end

    % 增加指纹编号到数据库

    if (exist('database.dat')==2)

        load('database.dat','-mat');

        fingerprint_number=fingerprint_number+1;

        data{fingerprint_number,1}=finger_code1;

        data{fingerprint_number,2}=finger_code2;

        save('database.dat','data','fingerprint_number','-append');

    else

        fingerprint_number=1;

        data{fingerprint_number,1}=finger_code1;

        data{fingerprint_number,2}=finger_code2;

        save('database.dat','data','fingerprint_number');

    end

    

    message=strcat('指纹增加成功。编号:',num2str(fingerprint_number));

    msgbox(message,'指纹编数据库','信息');

end % chos 1

%--------------------------------------------------------------------------

%--------------------------------------------------------------------------

%--------------------------------------------------------------------------

% 指纹识别

if chos==2

    clc;

    close all;

    selezionato=0;

    while selezionato==0

        [namefile,pathname]=uigetfile({'*.bmp;*.tif;*.tiff;*.jpg;*.jpeg;*.gif','IMAGE Files (*.bmp,*.tif,*.tiff,*.jpg,*.jpeg,*.gif)'},'选择灰度图');

        if namefile~=0

            [img,map]=imread(strcat(pathname,namefile));

            selezionato=1;

        else

            disp('选择灰度图');

        end

        if (any(namefile~=0) && (~isgray(img)))

            disp('选择灰度图');

            selezionato=0;

        end

    end

    

    immagine=double(img);

    

    if isa(img,'uint8')

        graylevmax=2^8-1;

    end

    if isa(img,'uint16')

        graylevmax=2^16-1;

    end

    if isa(img,'uint32')

        graylevmax=2^32-1;

    end

    fingerprint = immagine;

    

    N=h_lato;

    

    [BinarizedPrint,XofCenter,YofCenter]=centralizing(fingerprint,0);%二值化

    [CroppedPrint]=Cropping(XofCenter,YofCenter,fingerprint);%裁剪

    [NormalizedPrint,vector]=sector_norm(CroppedPrint,0);%归一化

    

    % 存储每个特征向量d的入口

    vettore_in=zeros(num_disk*n_sectors,1);

    for (angle=0:1:num_disk-1)    

        gabor=gabor2d_sub(angle,num_disk);

        ComponentPrint=conv2fft(NormalizedPrint,gabor,'same');

        [disk,vector]=sector_norm(ComponentPrint,1);    

        finger_code{angle+1}=vector(1:n_sectors);

        vettore_in(angle*n_sectors+1:(angle+1)*n_sectors)=finger_code{angle+1};

    end     

   

    % 计算输入值文编号

    % 检查数据库

    if (exist('database.dat')==2)

        load('database.dat','-mat');

        %---- 分配内存 -----------------------------------

        %...

        vettore_a=zeros(num_disk*n_sectors,1);

        vettore_b=zeros(num_disk*n_sectors,1);

        best_matching=zeros(fingerprint_number,1);

        valori_rotazione=zeros(n_arcs,1);

        % 开始检查 ---------------------------------------

        for scanning=1:fingerprint_number

            fcode1=data{scanning,1};

            fcode2=data{scanning,2};

            for rotazione=0:(n_arcs-1)

                p1=fcode1;

                p2=fcode2;

                % ruoto i valori dentro disco

                for conta_disco=1:num_disk%取出每列数据

                    disco1=p1{conta_disco};

                    disco2=p2{conta_disco};

                    for old_pos=1:n_arcs

                        new_pos=mod(old_pos+rotazione,n_arcs);

                        if new_pos==0

                            new_pos=n_arcs;

                        end

                        for conta_bande=0:1:(n_bands-1)%取该列每行

                            disco1r(new_pos+conta_bande*n_arcs)=disco1(old_pos+conta_bande*n_arcs);

                            disco2r(new_pos+conta_bande*n_arcs)=disco2(old_pos+conta_bande*n_arcs);

                        end

                    end

                    p1{conta_disco}=disco1r;

                    p2{conta_disco}=disco2r;

                end

                % ruoto i dischi circolarmente

                for old_disk=1:num_disk

                    new_disk=mod(old_disk+rotazione,num_disk);

                    if new_disk==0

                        new_disk=num_disk;

                    end

                    pos=old_disk-1;

                    vettore_a(pos*n_sectors+1:(pos+1)*n_sectors)=p1{new_disk};

                    vettore_b(pos*n_sectors+1:(pos+1)*n_sectors)=p2{new_disk};                    

                end

                d1=norm(vettore_a-vettore_in);

                d2=norm(vettore_b-vettore_in);

                if d1<d2

                    val_minimo=d1;

                else

                    val_minimo=d2;

                end

                valori_rotazione(rotazione+1)=val_minimo;

            end

            [minimo,posizione_minimo]=min(valori_rotazione);

            best_matching(scanning)=minimo;

        end

        [distanza_minima,posizione_minimo]=min(best_matching);

        beep;

        message=strcat('与数据库中最相似的指纹是 : ',num2str(posizione_minimo)');% 具有',num2str(distanza_minima),'个实例');

        msgbox(message,'数据库信息','信息');            

    else

        message='数据库为空. 不能匹配.';

        msgbox(message,'指纹编号数据库错误','错误');    

    end

    

end % chos 2

%--------------------------------------------------------------------------

%--------------------------------------------------------------------------

%--------------------------------------------------------------------------

% 删除数据库  

if chos==3

    clc;

    close all;

    if (exist('database.dat')==2)

        button = questdlg('你确定要删除数据库吗?');

        if strcmp(button,'Yes')

            delete('database.dat');

            msgbox('数据库删除成功。','数据库删除','信息');

        end

    else

        warndlg('数据库为空!','警告')

    end

end % chos 3

%--------------------------------------------------------------------------

%--------------------------------------------------------------------------

%--------------------------------------------------------------------------

% 可视化指纹图像    

if chos==4

    clc;

    close all;

    selezionato=0;

    while selezionato==0

        [namefile,pathname]=uigetfile({'*.bmp;*.tif;*.tiff;*.jpg;*.jpeg;*.gif','IMAGE Files (*.bmp,*.tif,*.tiff,*.jpg,*.jpeg,*.gif)'},'Chose GrayScale Image');

        if namefile~=0

            [img,map]=imread(strcat(pathname,namefile));

            selezionato=1;

        else

            disp('选择灰度图');

        end

        if (any(namefile~=0) && (~isgray(img)))

            disp('选择灰度图');

            selezionato=0;

        end

    end

    figure('name','选择图像');

    imshow(img);

end % chos 4

%--------------------------------------------------------------------------

%--------------------------------------------------------------------------

%--------------------------------------------------------------------------

% 可视化Gabor滤波

if chos==5

    clc;

    close all;

    figure('name','Gabor滤波');

    mesh(gabor2d_sub(0,num_disk));

end % chos 5 

end % end while

⛄三、运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

⛄四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1]刘艳华.基于MATLAB/GUI的指纹识别系统设计[J].信息与电脑(理论版). 2021,33(18)

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

🍅 仿真咨询
1 各类智能优化算法改进及应用

生产调度、经济调度、装配线调度、充电优化、车间调度、发车优化、水库调度、三维装箱、物流选址、货位优化、公交排班优化、充电桩布局优化、车间布局优化、集装箱船配载优化、水泵组合优化、解医疗资源分配优化、设施布局优化、可视域基站和无人机选址优化

2 机器学习和深度学习方面
卷积神经网络(CNN)、LSTM、支持向量机(SVM)、最小二乘支持向量机(LSSVM)、极限学习机(ELM)、核极限学习机(KELM)、BP、RBF、宽度学习、DBN、RF、RBF、DELM、XGBOOST、TCN实现风电预测、光伏预测、电池寿命预测、辐射源识别、交通流预测、负荷预测、股价预测、PM2.5浓度预测、电池健康状态预测、水体光学参数反演、NLOS信号识别、地铁停车精准预测、变压器故障诊断

3 图像处理方面
图像识别、图像分割、图像检测、图像隐藏、图像配准、图像拼接、图像融合、图像增强、图像压缩感知

4 路径规划方面
旅行商问题(TSP)、车辆路径问题(VRP、MVRP、CVRP、VRPTW等)、无人机三维路径规划、无人机协同、无人机编队、机器人路径规划、栅格地图路径规划、多式联运运输问题、车辆协同无人机路径规划、天线线性阵列分布优化、车间布局优化

5 无人机应用方面
无人机路径规划、无人机控制、无人机编队、无人机协同、无人机任务分配

6 无线传感器定位及布局方面
传感器部署优化、通信协议优化、路由优化、目标定位优化、Dv-Hop定位优化、Leach协议优化、WSN覆盖优化、组播优化、RSSI定位优化

7 信号处理方面
信号识别、信号加密、信号去噪、信号增强、雷达信号处理、信号水印嵌入提取、肌电信号、脑电信号、信号配时优化

8 电力系统方面
微电网优化、无功优化、配电网重构、储能配置

9 元胞自动机方面
交通流 人群疏散 病毒扩散 晶体生长

10 雷达方面
卡尔曼滤波跟踪、航迹关联、航迹融合

指纹识别-(3)指纹图像预处理算法之图像归一化 1、指纹图像归一化 指纹采集器得到的图像可能由于各种原因造成不同区域内的脊线灰度值差距过大,形成强烈的明暗效果。图像归一化是一个像素级操作,其作用是在不改变脊线和谷线结构的清晰度的情况下减少脊谷灰度值的变化,方便后续的处理步骤。对于指纹数据库来说,在进行完图像归一化操作后,图像具有相同的灰度均值和灰度方差,减小图像间灰度场强差异。 图像归一化公式如下: G(x,y)={M0+VAR0(I(x,y)...... 阅读详情

相关推荐

python指纹识别算法(亲测代码可用)

python指纹识别算法

2301_76482796的博客 3079

【指纹识别】基于matlab GUI指纹识别【含Matlab源码 029期】

指纹识别 完整代码,直接运行,适合小白!可提供运行操作视频!

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

指纹解锁:编程实现与示例代码

大多数现代智能手机和平板电脑都内置了指纹传感器,可以用于指纹解锁。此外,你还需要选择一种编程语言和相应的开发工具来实现指纹解锁功能。通过使用适当的编程语言和库,我们可以实现指纹解锁功能。指纹解锁是一种方便且安全的身份验证方式,可以在应用程序或设备中实现。库来访问指纹传感器,包括初始化传感器、获取指纹数量、搜索指纹和删除指纹等操作。如果你选择其他编程语言,你需要查找相应的库或工具来实现指纹解锁功能。下面以Python语言为例,演示如何使用Python编写一个简单的指纹解锁程序。除了搜索指纹,我们还可以使用。

TechInk的博客 654

【指纹识别】指纹识别【含 GUI Matlab源码 029期】

指纹识别 完整代码,直接运行,适合小白!可提供运行操作视频!

Matlab912100926的博客 1148

【指纹识别】基于matlab指纹图像细节特征提取 【含Matlab源码 227期】

指纹图像细节特征提取 完整的代码,方可运行;可提供运行操作视频!适合小白!

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

【Matlab指纹识别】指纹识别【含GUI源码 029期】

一、代码运行视频(哔哩哔哩) 【Matlab指纹识别】指纹识别【含GUI源码 029期】 二、matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020. [2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013. [3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013. [4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015

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

uniApp 指纹识别对应代码

<template> <view> <button type="primary" @tap="fingerprint()" :disabled="disabled">按下开始识别指纹</button> <view style="width: 100%;text-align: center;"> {{result}} </view> </view...

4842

毕设题目:Matlab指纹识别

毕设题目:Matlab指纹识别 完整代码,方可直接运行,适合小白!可提供运行操作视频!

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

用java写一个源代码指纹生成方法

可以使用校验和算法来生成源代码的指纹。一种常见的校验和算法是MD5,它可以将任意长度的数据映射为一个128位的十六进制数字。 以下是Java代码的示例: import java.io.FileInputStream; import java.io.IOException; import java.security.MessageDigest; import java.security.NoSuch...

weixin_42613018的博客 678

指纹识别算法的MATLAB源代码实现

模板匹配算法是一种常用的图像匹配方法,其主要思想是将待匹配图像与已知的模板图像进行比较,寻找最相似的图像区域。总体来说,基于模板匹配算法的指纹识别具有较高的准确性和灵敏度,但仍存在一些问题,如对指纹旋转、变形等情况的适应性不强。2.特征提取:然后从图像中提取特征,这里采用了指纹图像中经典的细节特征——“指纹线”和“指纹孔”,这两类特征都反映了指纹的唯一性。4.匹配:对于新的指纹图像,将其与已有的模板进行匹配,找到最相似的图像区域,进而实现指纹识别。disp(‘指纹匹配成功!%读取待匹配指纹图像。

qq_37934722的博客 479

【指纹识别】基于matlab GUI指纹识别【含Matlab源码 1353期】

指纹识别 完整的代码,方可运行;可提供运行操作视频!适合小白!

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

基于MATLAB的指纹识别算法仿真实现步骤及关键代码

同时,MATLAB也提供了专门用于图像处理和机器学习的相关工具箱,例如Image Processing Toolbox和Statistics and Machine Learning Toolbox,可以帮助开发者更方便地实现指纹识别功能。

722

【图像识别-指纹识别】指纹特征提取附matlab代码

为了除去指纹内部的伪特征点,求两个特征点之间的距离,如果距离小于一个阈值(例如10),则将两个伪特征点都删除。为了加快速度,在细化后的图像中,对每个像素点求八领域的像素和n,如果n=7,说明该像素点是端点,如果n=5,说明该像素点是分叉点。标准化是把图像的平均灰度和方差调整到预定的级别上,以减少脊线上的灰度差异,方便后续处理。为了除去指纹边缘的端点(伪特征点),需要用到图2的掩模,对该掩模做腐蚀处理,见图6。为了达到更好的效果,采用了MATLAB函数bwmorph,细化后的指纹图像见图5。

qq_59747472的博客 3099

指纹识别源代码(1)-图像处理

源码已经上传到github,https://github.com/charlesLucky/FingerRecognitionFromScratch.git 1.缩放处理 f=imread(image);%读取图像到内存 f=imresize(f,[363,312]);%该函数用于对图像做缩放处理。 figure;imshow(f); %用rgb2gray 将彩色图像转换为灰度图像。ma...

MrCharles在优快云 2万+

MATLAB实现指纹识别技术深入解析

本文还有配套的精品资源,点击获取 简介:指纹识别技术是IT领域中用于安全验证和个人身份识别的重要技术。本资料详细介绍了指纹提取、图像融合及指纹识别的实现过程。首先,通过图像增强、二值化和细化等步骤提取清晰的指纹模式。然后,运用图像融合技术提升识别准确性和鲁棒性。指纹识别的核心包括特征提取和匹配,使用距离度量或比对算法来识别最相似的指纹。此外,MATLAB编程被广泛应用于指纹...

weixin_28999139的博客 2055

指纹识别算法源码

C语言指纹识别算法源码,在linux下

指纹识别源代码(2)-特征点提取

源码已经上传到github,https://github.com/charlesLucky/FingerRecognitionFromScratch.git 上图为上一步拿到的图像预处理之后的细化图。在这个基础之上我们进行下一步操作。 指纹特征提取的主要目的是计算指纹核心点(Core)和细节点(Minutia)的特征信息。在提取指纹核心点时,采用的是Poi...

MrCharles在优快云 3万+

SAP SD模块进阶:VA31和VA01底层竟是同一个BAPI?揭秘销售单据创建的统一逻辑

本文深入解析SAP SD模块中VA31和VA01的底层统一架构设计,揭示两者如何通过同一个BAPI `SD_SALESDOCUMENT_CREATE`实现销售单据创建。通过ABAP调试和参数化设计分析,展示了SAP如何利用单据类型(doc_type)等关键字段实现业务逻辑复用,为开发者提供配置化设计的重要启示。

weixin_30561177的博客 244
上一篇: 【图像分割】麻雀算法优化Kmeans图像分割【含Matlab源码 2030期】
下一篇: 【人脸识别】PCA+SVM人脸识别(准确率)【含GUI Matlab源码 823期】
Matlab武动乾坤
博客等级 码龄3年 3万+粉丝 1万+原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值