Intel RealSense 相机传感器控制C++ API总结(二)

一.realsense API中关键的几个类

rs2::context类

  1. 继承关系
    在这里插入图片描述
  2. 函数
    返回值函数原型详细说明
    context ()构造
    device_listquery_devices () const在呼叫时创建所有连接设备的静态快照
    device_listquery_devices (int mask) const在呼叫时创建所有连接设备的静态快照
    std::vector< sensor >query_all_sensors () const从所有RealSense设备生成所有可用传感器的列表
    deviceget_sensor_parent (const sensor &s) const获取传感器所属的父设备
    template voidset_devices_changed_callback (T callback)注册设备更改回调
    playbackload_device (const std::string &file)从RealSense文件创建设备,成功加载后,设备将被附加到上下文中,并触发devices_changed事件
    voidunload_device (const std::string &file)
    voidunload_tracking_module ()
    context (std::shared_ptr< rs2_context > ctx)
    operator std::shared_ptr< rs2_context > ()

主要使用query_devices()函数去枚举连接到当前计算机下的intel realsense设备,以及利用set_devices_changed_callback (T callback)函数设置计算机上连接的intel realsense设备变化时的回调函数

#include <iostream>
#include <librealsense2\rs.hpp>

using namespace std;

void device_changed_callback(rs2::event_information info)
{
    rs2::device_list devices = info.get_new_devices();
    cout << "detected " <<  devices.size() << " connected!" << endl;
}

int main()
{
    // 首先, 创建rs2::context对象. context表示与所连接设备相关的当前平台
    rs2::context ctx;

    // 利用context设置设备变化时的回调函数
    ctx.set_devices_changed_callback(device_changed_callback);

    // 使用context可以获取到所有连接到当前平台的设备
    rs2::device_list devices = ctx.query_devices();

    while(1)
    {

    }
}

在这里插入图片描述

rs2::device类

  1. 继承关系
    在这里插入图片描述

  2. 函数

    返回值函数原型详细说明
    std::vector< sensor >query_sensors () const列出设备底下的所有传感器
    template Tfirst () const
    boolsupports (rs2_camera_info info) const检查是否支持特定的摄像头信息
    const char *get_info (rs2_camera_info info) const检索特定于相机的信息,如各种内部组件的版本
    voidhardware_reset ()向设备发送硬件重置请求
    device &operator= (const std::shared_ptr< rs2_device > dev)
    device &operator= (const device &dev)
    device ()构造函数
    operator bool () const
    const std::shared_ptr< rs2_device > &get () const
    template boolis () const
    template Tas () const
    virtual~device ()析构函数
    operator std::shared_ptr< rs2_device > ()
    device (std::shared_ptr< rs2_device > dev)

主要使用supports (rs2_camera_info info)get_info (rs2_camera_info info) 函数来检查和获取设备的相关信息,以及query_sensors () 函数来获取设备底下的传感器。其中,设备的信息枚举体rs2_camera_info内容如下:

rs2_camera_info中的枚举值详细说明
RS2_CAMERA_INFO_NAME设备名称
RS2_CAMERA_INFO_SERIAL_NUMBER设备序列号
RS2_CAMERA_INFO_FIRMWARE_VERSION主要固件版本
RS2_CAMERA_INFO_RECOMMENDED_FIRMWARE_VERSION建议的固件版本
RS2_CAMERA_INFO_PHYSICAL_PORT设备连接到的端口的唯一标识符(特定于平台)
RS2_CAMERA_INFO_DEBUG_OP_CODE如果设备支持固件日志记录,这是发送以从固件获取日志的命令
RS2_CAMERA_INFO_ADVANCED_MODE如果设备处于高级模式,则为True
RS2_CAMERA_INFO_PRODUCT_IDUSB描述符中报告的产品ID
RS2_CAMERA_INFO_CAMERA_LOCKED如果EEPROM被锁定,则为True
RS2_CAMERA_INFO_USB_TYPE_DESCRIPTOR指定USB规格:USB2/USB3
RS2_CAMERA_INFO_PRODUCT_LINE设备产品线D400/SR300/L500/T200
RS2_CAMERA_INFO_ASIC_SERIAL_NUMBERASIC序列号
RS2_CAMERA_INFO_FIRMWARE_UPDATE_ID固件更新ID
RS2_CAMERA_INFO_IP_ADDRESS远程摄像机的IP地址。
RS2_CAMERA_INFO_COUNT枚举值的数量。无效输入:用于for-loop。
#include <iostream>
#include <iomanip>
#include <librealsense2\rs.hpp>

using namespace std;

int main()
{
    // 首先, 创建rs2::context对象. context表示与所连接设备相关的当前平台
    rs2::context ctx;

    // 使用context可以获取到所有连接到当前平台的设备
    rs2::device_list devices = ctx.query_devices();

    rs2::device selected_device; //用来接收要控制的设备
    if (devices.size() == 0)
    {
        cerr << "No device connected, please connect a RealSense device" << endl;

        //用来解决设备插入前等待的过程
        rs2::device_hub device_hub(ctx);

        //device_hub会阻塞程序,直到设备插入
        selected_device = device_hub.wait_for_device();
    }
    else
    {
        cout << "Found the following devices:" << endl;

        // 通过循环遍历接入平台的设备,打印设备名称
        int index = 0;
        for (rs2::device device : devices)
        {
            // 每个设备都提供了一些关于自身的信息,例如名称:
            string name = "Unknown Device";
            if (device.supports(RS2_CAMERA_INFO_NAME))
            {
                name = device.get_info(RS2_CAMERA_INFO_NAME);
            }

            // 以及设备的序列号:
            string sn = "########";
            if (device.supports(RS2_CAMERA_INFO_SERIAL_NUMBER))
            {
                sn = string("#") + device.get_info(RS2_CAMERA_INFO_SERIAL_NUMBER);
            }

            cout << "  " << index++ << " : " << name << " " << sn << endl;
        }


        // 选择一个设备
        selected_device = devices[0];

        // 每个设备都提供一些关于自身的信息
        // 使用“RS2_CAMERA_INFO_*”枚举表示不同类型的可用信息
        cout << "Device information: " << endl;

        // 以下代码显示了如何枚举所有RS2_CAMERA_INFO
        // 请注意,SDK中的所有枚举类型都以零值开始,以“*_COUNT”值结束
        for (int i = 0; i < static_cast<int>(RS2_CAMERA_INFO_COUNT); i++)
        {
            rs2_camera_info info_type = static_cast<rs2_camera_info>(i);

            // 可以以流的方式处理SDK枚举类型,以获取表示它们的字符串
            cout << "  " << left << setw(20) << info_type << " : ";

            //设备可能不支持所有类型的RS2_CAMERA_INFO。
            //为了防止从“get_info”方法引发异常,我们首先检查设备是否支持这种类型的信息
            if (selected_device.supports(info_type))
                cout << selected_device.get_info(info_type) << endl;
            else
                cout << "N/A" << endl;
        }
    }
}

在这里插入图片描述

rs2::sensor类

  1. 继承关系
    在这里插入图片描述

  2. 函数

    返回值函数原型详细说明
    voidopen (const stream_profile &profile) const通过提交配置,打开传感器进行独占访问
    boolsupports (rs2_camera_info info) const检查是否支持特定的摄像头信息
    const char *get_info (rs2_camera_info info) const检索特定于相机的信息,如各种内部组件的版本
    voidopen (const std::vector< stream_profile > &profiles) const开放传感器进行独占访问,通过提交复合配置,指定一个或多个流配置文件,这种方法应该用于必须一起配置的相互依赖的流,如深度和红外
    voidclose () const关闭传感器进行独占访问此方法应用于释放传感器资源
    template voidstart (T callback) const开始将帧传递到用户提供的回调中
    voidstop () const停止将帧传递到用户提供的回调中
    template voidset_notifications_callback (T callback) const注册通知回调
    std::vector< stream_profile >get_stream_profiles () const检索传感器支持的流配置文件列表。
    std::vector< stream_profile >get_active_streams () const检索当前在传感器上进行流式传输的流配置文件列表。
    std::vector< filter >get_recommended_filters () const获取传感器推荐的过滤器列表
    sensor &operator= (const std::shared_ptr< rs2_sensor > other)
    sensor &operator= (const sensor &other)
    sensor ()构造函数
    operator bool () const
    const std::shared_ptr< rs2_sensor > &get () const
    template boolis () const
    template Tas () const
    sensor (std::shared_ptr< rs2_sensor > dev)
    operator std::shared_ptr< rs2_sensor > ()
    boolsupports (rs2_option option) const检查是否支持特定选项

主要使用supports (rs2_camera_info info)get_info (rs2_camera_info info) 来获取相机传感器的信息,get_option_description (rs2_option option) ,get_option_value_description (rs2_option option, float val),set_option (rs2_option option, float value) 来获取和设置相机传感器的参数。相机的可选参数,如下所示:

rs2_option中的枚举值详细说明
RS2_OPTION_BACKLIGHT_COMPENSATION启用/禁用彩色背光补偿
RS2_OPTION_BRIGHTNESS彩色图像亮度
RS2_OPTION_CONTRAST彩色图像对比度
RS2_OPTION_EXPOSURE控制彩色相机的曝光时间。设置任何值都将禁用自动曝光
RS2_OPTION_GAIN彩色图像增益
RS2_OPTION_GAMMA彩色图像gamma设置
RS2_OPTION_HUE彩色图像色调
RS2_OPTION_SATURATION彩色图像饱和度设置
RS2_OPTION_SHARPNESS彩色图像清晰度设置
RS2_OPTION_WHITE_BALANCE控制彩色图像的白平衡。设置任何值都将禁用自动白平衡
RS2_OPTION_ENABLE_AUTO_EXPOSURE启用/禁用彩色图像自动曝光
RS2_OPTION_ENABLE_AUTO_WHITE_BALANCE启用/禁用彩色图像自动白平衡
RS2_OPTION_VISUAL_PRESET提供对深度相机的多组推荐选项预设的访问
RS2_OPTION_LASER_POWER激光发射器的功率,0表示投影仪关闭
RS2_OPTION_ACCURACY设置每帧投影的图案数。精度值越高,投影的图案越多。增加图案数量有助于实现更好的准确性。请注意,此控件影响深度FPS
RS2_OPTION_MOTION_RANGE运动与范围的权衡,较低的值允许更好的运动灵敏度,较高的值允许更佳的深度范围
RS2_OPTION_FILTER_OPTION设置过滤器以应用于每个深度帧。每个过滤器都根据应用要求进行了优化
RS2_OPTION_CONFIDENCE_THRESHOLD深度算法管道使用的置信度阈值,用于设置像素是获得有效范围还是标记为无效范围
RS2_OPTION_EMITTER_ENABLED发射器选择:0–禁用所有发射器。1–启用激光器。2–启用自动激光器。3–启用LED。
RS2_OPTION_FRAMES_QUEUE_SIZE每个流允许用户保留的帧数。试图保留更多帧将导致帧丢失。
RS2_OPTION_TOTAL_FRAME_DROPS从所有流中检测到的帧丢弃总数
RS2_OPTION_AUTO_EXPOSURE_MODE自动曝光模式:静态、防舔和混合
RS2_OPTION_POWER_LINE_FREQUENCY防闪烁电源线频率控制Off/50Hz/60Hz/Auto
RS2_OPTION_ASIC_TEMPERATURE当前Asic温度
RS2_OPTION_ERROR_POLLING_ENABLED禁用错误处理
RS2_OPTION_PROJECTOR_TEMPERATURE当前投影仪温度
RS2_OPTION_OUTPUT_TRIGGER_ENABLED在每个深度帧上启用/禁用从相机输出到任何外部设备的触发器
RS2_OPTION_MOTION_MODULE_TEMPERATURE电流运动-模块温度
RS2_OPTION_DEPTH_UNITS单个深度单位表示的米数
RS2_OPTION_ENABLE_MOTION_CORRECTION启用/禁用运动数据的自动校正
RS2_OPTION_AUTO_EXPOSURE_PRIORITY允许传感器根据照明条件动态调整帧速率
RS2_OPTION_COLOR_SCHEME数据可视化的颜色方案
RS2_OPTION_HISTOGRAM_EQUALIZATION_ENABLED对深度数据进行直方图均衡化后处理
RS2_OPTION_MIN_DISTANCE与目标的最小距离
RS2_OPTION_MAX_DISTANCE到目标的最大距离
RS2_OPTION_TEXTURE_SOURCE纹理映射流唯一ID
RS2_OPTION_FILTER_MAGNITUDE2D-filter效果。具体解释在过滤器上下文中给出
RS2_OPTION_FILTER_SMOOTH_ALPHA2D-filter参数控制平滑的权重/半径。
RS2_OPTION_FILTER_SMOOTH_DELTA二维滤波器范围/有效性阈值
RS2_OPTION_HOLES_FILL在适当情况下,通过钻孔填充来增强深度数据后处理
RS2_OPTION_STEREO_BASELINE立体测深相机中第一和第二成像仪之间的距离(mm)
RS2_OPTION_AUTO_EXPOSURE_CONVERGE_STEP允许在自动曝光算法中动态调整目标曝光的收敛步长值
RS2_OPTION_INTER_CAM_SYNC_MODE实施Inter-camera硬件同步模式。适用于D400/L500/卷帘SKU
RS2_OPTION_STREAM_FILTER选择要处理的流
RS2_OPTION_STREAM_FORMAT_FILTER选择要处理的流格式
RS2_OPTION_STREAM_INDEX_FILTER选择要处理的流索引
RS2_OPTION_EMITTER_ON_OFF如果支持,此选项将使摄影机在每一帧切换发射器状态。0表示禁用,1表示启用
RS2_OPTION_ZERO_ORDER_POINT_X不推荐!!!-零阶点x
RS2_OPTION_ZERO_ORDER_POINT_Y不推荐!!!-零阶点y
RS2_OPTION_LLD_TEMPERATURELDD温度
RS2_OPTION_MC_TEMPERATUREMC温度
RS2_OPTION_MA_TEMPERATUREMA温度
RS2_OPTION_HARDWARE_PRESET硬件流配置
RS2_OPTION_GLOBAL_TIME_ENABLED禁用全局时间
RS2_OPTION_APD_TEMPERATUREAPD温度
RS2_OPTION_ENABLE_MAPPING启用内部映射
RS2_OPTION_ENABLE_RELOCALIZATION启用基于外观的重新缩放
RS2_OPTION_ENABLE_POSE_JUMPING启用位置跳跃
RS2_OPTION_ENABLE_DYNAMIC_CALIBRATION启用动态校准
RS2_OPTION_DEPTH_OFFSET从传感器到深度原点的偏移(毫米)
RS2_OPTION_LED_POWERLED(发光二极管)的功率,0表示LED关闭
RS2_OPTION_ZERO_ORDER_ENABLED已弃用!-切换零阶模式
RS2_OPTION_ENABLE_MAP_PRESERVATION启动时保留上一个地图
RS2_OPTION_FREEFALL_DETECTION_ENABLED检测到自由下落时启用/禁用传感器关闭(默认为启用)
RS2_OPTION_AVALANCHE_PHOTO_DIODE更改接收器中雪崩光电二极管的曝光时间
RS2_OPTION_POST_PROCESSING_SHARPENING更改后处理图像中的锐化量
RS2_OPTION_PRE_PROCESSING_SHARPENING更改预处理图像中的锐化量
RS2_OPTION_NOISE_FILTERING控制边缘和背景噪音
RS2_OPTION_INVALIDATION_BYPASS启用像素无效
RS2_OPTION_AMBIENT_LIGHT已弃用!-请改用RS2_OPTION_DIGITAL_GAIN。
RS2_OPTION_DIGITAL_GAIN更改深度数字增益值,请参阅rs2_digital_gain
RS2_OPTION_SENSOR_MODE分辨率模式:有关值,请参阅rs2_sensor_mode
RS2_OPTION_EMITTER_ALWAYS_ON持续启用激光器(仅限GS SKU)
RS2_OPTION_THERMAL_COMPENSATION选定D400 SKU的深度热补偿
RS2_OPTION_TRIGGER_CAMERA_ACCURACY_HEALTH自2.46起已弃用!
RS2_OPTION_RESET_CAMERA_ACCURACY_HEALTH自2.46起已弃用!
RS2_OPTION_HOST_PERFORMANCE设置主机性能模式以优化设备设置,使主机能够跟上工作负载,例如,USB事务粒度,将选项设置为低性能主机会导致更大的USB事务大小和减少事务数量,如果主机与工作负载相比较弱,则会提高性能和稳定性
RS2_OPTION_HDR_ENABLED启用/禁用HDR
RS2_OPTION_SEQUENCE_NAMEHDR序列名称
RS2_OPTION_SEQUENCE_SIZEHDR序列大小
RS2_OPTION_SEQUENCE_IDHDR序列ID-0不是HDR;HDR配置的序列ID从1开始
RS2_OPTION_HUMIDITY_TEMPERATURE湿度温度[摄氏度]
RS2_OPTION_ENABLE_MAX_USABLE_RANGE根据场景中环境光的数量,打开/关闭最大可用深度传感器范围
RS2_OPTION_ALTERNATE_IR打开/关闭备用红外,启用备用红外时,红外图像保持深度相关性的振幅。
RS2_OPTION_NOISE_ESTIMATION噪声估计-指示红外图像上的噪声
RS2_OPTION_ENABLE_IR_REFLECTIVITY启用数据收集以计算红外像素反射率
RS2_OPTION_AUTO_EXPOSURE_LIMIT设置并获取以微秒为单位的自动曝光限制。默认值为0,表示完全曝光范围。如果请求的曝光限制大于帧时间,则会在运行时设置为帧时间。设置在下一个流会话之前不会生效。
RS2_OPTION_AUTO_GAIN_LIMIT设置并获取16到248之间的自动增益限制。默认值为0,表示完全增益。如果请求的增益限制小于16,则将其设置为16。如果请求的增益限制大于248,则将其设置为248。设置在下一个流会话之前不会生效。
RS2_OPTION_AUTO_RX_SENSITIVITY根据受接收器增益控制限制的环境光启用接收器灵敏度。
RS2_OPTION_TRANSMITTER_FREQUENCY改变发射机频率,增加有效范围。
RS2_OPTION_VERTICAL_BINNING启用垂直装箱,增加最大感应距离。
RS2_OPTION_RECEIVER_SENSITIVITY控制接收器对投射光和环境光的灵敏度(与L515上的APD相同)。
RS2_OPTION_AUTO_EXPOSURE_LIMIT_TOGGLE启用/禁用彩色图像自动曝光
RS2_OPTION_AUTO_GAIN_LIMIT_TOGGLE启用/禁用彩色图像自动捕获
RS2_OPTION_COUNT枚举值的数量。无效输入:用于for-loop。

这些参数,正好是realsene-viewer软件中所列出的所有参数,例如,要设置相机的参数为预设模式中的高精度(HIGH_ACCURACY),可以通过以下代码实现:

std::vector<rs2::sensor> sensors = device.query_sensors(); //获取设备的传感器
rs2::sensor sensor = sensors[0]; //获取高度传感器
rs2::depth_sensor depth_sensor = rs2::depth_sensor(sensor); //获取高度传感器
depth_sensor.set_option(RS2_OPTION_VISUAL_PRESET, RS2_RS400_VISUAL_PRESET_HIGH_ACCURACY ); //设置预设模式为高精度

在这里插入图片描述

rs2_rs400_visual_preset中的枚举值详细说明
RS2_RS400_VISUAL_PRESET_CUSTOM
RS2_RS400_VISUAL_PRESET_DEFAULT
RS2_RS400_VISUAL_PRESET_HAND
RS2_RS400_VISUAL_PRESET_HIGH_ACCURACY
RS2_RS400_VISUAL_PRESET_HIGH_DENSITY
RS2_RS400_VISUAL_PRESET_MEDIUM_DENSITY
RS2_RS400_VISUAL_PRESET_REMOVE_IR_PATTERN
RS2_RS400_VISUAL_PRESET_COUNT枚举值的数量。无效输入:用于for-loop。
#include <iostream>
#include <iomanip>
#include <librealsense2\rs.hpp>

using namespace std;

int main()
{
    // 首先, 创建rs2::context对象. context表示与所连接设备相关的当前平台
    rs2::context ctx;

    // 使用context可以获取到所有连接到当前平台的设备
    rs2::device_list devices = ctx.query_devices();

    rs2::device selected_device; //用来接收要控制的设备
    if (devices.size() == 0)
    {
        cerr << "No device connected, please connect a RealSense device" << endl;

        //用来解决设备插入前等待的过程
        rs2::device_hub device_hub(ctx);

        //device_hub会阻塞程序,直到设备插入
        selected_device = device_hub.wait_for_device();
    }
    else
    {
        cout << "Found the following devices:" << endl;

        // 通过循环遍历接入平台的设备,打印设备名称
        int index = 0;
        for (rs2::device device : devices)
        {
            // 每个设备都提供了一些关于自身的信息,例如名称:
            string name = "Unknown Device";
            if (device.supports(RS2_CAMERA_INFO_NAME))
            {
                name = device.get_info(RS2_CAMERA_INFO_NAME);
            }

            // 以及设备的序列号:
            string sn = "########";
            if (device.supports(RS2_CAMERA_INFO_SERIAL_NUMBER))
            {
                sn = string("#") + device.get_info(RS2_CAMERA_INFO_SERIAL_NUMBER);
            }

            cout << "  " << index++ << " : " << name << " " << sn << endl;
        }

        // 选择一个设备
        selected_device = devices[0];

        std::vector<rs2::sensor> sensors = selected_device.query_sensors();

        std::cout << "Device consists of " << sensors.size() << " sensors:" << std::endl;

        // 枚举设备底线传感器的名称
        for (rs2::sensor sensor : sensors)
        {
            if (sensor.supports(RS2_CAMERA_INFO_NAME))
            {
                cout << "  " << index++ << " : " << sensor.get_info(RS2_CAMERA_INFO_NAME) << endl;
            }
            else
            {
                cout << "  " << index++ << " : " << "Unknown Sensor" << endl;
            }
        }

        // 枚举设备底线传感器的名称
        for (rs2::sensor sensor : sensors)
        {
            if (sensor.supports(RS2_CAMERA_INFO_NAME))
            {
                cout << sensor.get_info(RS2_CAMERA_INFO_NAME)  << " Sensor supports the following options:" << endl;

                // 打印出传感器所支持的选项
                for (int i = 0; i < static_cast<int>(RS2_OPTION_COUNT); i++)
                {
                    rs2_option option_type = static_cast<rs2_option>(i);
                    //可以对SDK枚举类型进行流式传输,以获得表示它们的字符串
                    std::cout << "  " << i << ": " << option_type;

                    // 要控制一个选项,请使用以下api:

                    // 首先,验证传感器是否真的支持此选项
                    if (sensor.supports(option_type))
                    {
                        std::cout << std::endl;

                        // 获取选项的可读描述
                        const char* description = sensor.get_option_description(option_type);
                        std::cout << "       Description   : " << description << std::endl;

                        // 获取选项的当前值
                        float current_value = sensor.get_option(option_type);
                        std::cout << "       Current Value : " << current_value << std::endl;

                        //要更改选项的值,请执行change_sensor_option()函数
                    }
                    else
                    {
                        std::cout << " is not supported" << std::endl;
                    }
                }
            }
            else
            {
                cout << "  " << index++ << " : " << "Unknown Sensor" << endl;
            }
        }
    }
}

在这里插入图片描述

rs2::option类

  1. 继承关系
    在这里插入图片描述

  2. 函数

    返回值函数原型详细说明
    boolsupports (rs2_option option) const检查是否支持特定选项
    const char *get_option_description (rs2_option option) const获取选项描述
    const char *get_option_name (rs2_option option) const获取选项名称
    const char *get_option_value_description (rs2_option option, float val) const获取选项值描述(在特定选项值具有特殊含义的情况下)
    floatget_option (rs2_option option) const读取选项的值
    option_rangeget_option_range (rs2_option option) const检索受支持选项的可用值范围
    voidset_option (rs2_option option, float value) const将新值写入选项
    boolis_option_read_only (rs2_option option) const检查特定选项是否为只读
    std::vector< rs2_option >get_supported_options ()获取所支持的选项
    options &operator= (const options &other)
    options (const options &other)构造函数
    virtual~options ()=default析构函数
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AoDeLuo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值