ISP图像调优(支持工业相机)

ISP图像质量调节介绍 ISP(Image Signal Processor),即图像处理,主要作用是对前端图像传感器输出的信号做后期处理,主要功能有线性纠正、噪 声去除、坏点去除、内插、白平衡、自动曝光控制等,依赖于ISP才能在不同的光学条件下都能较好的还原现场细节,ISP技术在很 大程度上决定了摄像机的成像质量。它分为独立与集成两种形式。         一般情况下,配备独立ISP的手机,在图像处理方面 阅读详情

关于一些音视频编解码的ISP相关的

目前比较熟悉海思系列的主控ISP,如果有这块的疑问,可以留言,给出一些想法,看看能否突破下, 只涉及相关主控ISP API调用和思路,不涉及到OpenCV或DSP图像算法的(因为我也不太熟悉)

关于线阵相机相关的

这块刚调完海康的线阵相机,效果还是不错的,仅提供相关的思路和API接口相关的,结构设计,补光设计, 装配等可讨论互相学习,如下为分辨率2048*1024的调试效果(某康型号MV-CL022-40GC, 2K网口线阵,彩色):
原始数据bmp比较大,有18M, 无法上传,截图如下:

*海康系列

链接: 海康线阵相机调试指导

*度申系列

在这里插入图片描述
相机参数:
在这里插入图片描述

代码块:

#include "rob_mvs_feature_tree.h"

/**
 *属性树
		备注:note部分依工具为主,xls中确认未更新。
 **/
FEATURE_TREE_S ft_info[FEATURE_TREE_OTHERS] = 
{

	{
		/*Feature*/
		"Device Control","设备控制",
			/*	名称					数据类型						访问模式			描述*/
		{
			{	 0, "DeviceType",					"IEnumeration",			"设备类型"},
			{	 1, "DeviceScanType",				"IEnumeration",			"设备sensor的扫描方式,表明是线阵相机还是面阵相机"},
			{	 2, "DeviceVendorName",			"IString",				"设备的制造商名称"},
			{	 3, "DeviceModelName", 			"IString", 				"设备型号"},
			{	 4, "DeviceManufacturerInfo",		"Istring", 				"设备的制造商信息"},
			{	 5, "DeviceVersion",				"IString ",	 			"设备版本"},
			{	 6, "DeviceFirmwareVersion",		"IString", 				"固件版本"},
			{	 7,"DeviceSerialNumber",			"IString", 				"设备序列号"},
			{	 8, "DeviceID",					"Istring", 				"设备ID"},
			{	 9, "DeviceUserID",				"IString", 				"用户自定义的名称"},
			{	10, "DeviceUptime",				"IInteger",				"设备运行时间"},
			{	11, "BoardDeviceType", 			"IInteger",				"设备类型"},
			{	12, "DeviceConnectionSelector",	"IInteger",				"设备连接选择"},
			{	13, "DeviceConnectionSpeed",		"IInteger",				"设备连接速度"},
			{	14, "DeviceConnectionStatus",		"IEnumeration",			"设备连接状态"},
			{	15, "DeviceLinkSelector",			"IInteger",				"设备连接选择"},
			{	16, "DeviceLinkSpeed", 			"IInteger",				"设备连接速度"},
			{	17, "DeviceLinkConnectionCount",	"IInteger",				"设备连接数量"},
			{	18, "DeviceLinkHeartbeatMode", 	"IEnumeration",			"是否需要心跳"},
			{	19, "DeviceLinkHeartbeatTimeout",	"IInteger",				"心跳超时时间"},
			{	20, "DeviceStreamChannelCount",	"IInteger",				"流通道数量"},
			{	21, "DeviceStreamChannelSelector", "IInteger",			"流通道选择"},
			{	22, "DeviceStreamChannelType", 	"IEnumeration",			"流通道类型"},
			{	23, "DeviceStreamChannelLink",	"IInteger",				"流通道连接数量"},
			{	24, "DeviceStreamChannelEndianness","IEnumeration",		"图像数据的字节序"},
			{	25, "DeviceStreamChannelPacketSize","IInteger",			"接收端流数据的包大小"},
			{	26, "DeviceEventChannelCount", 	"IInteger",				"设备支持的"},
			{	27, "DeviceCharacterSet",			"IEnumeration",			"设备寄存器中使用的字符集"},
			{	28, "DeviceReset", 				"ICommand",				"重启设备"},
			{   29, "DeviceTemperatureSelector",	"IEnumeration",			"选择某个部件温度测量"},
			{	30, "DeviceTemperature",			"IFloat",				"选中的设备部件温度"},
			{	31, "FindMe",						"ICommand",				"发现当前设备"},
			{	32, "DeviceMaxThroughput", 		"IInteger",				"设备最大吞吐量(带宽"},
		}
	},




	{
		"ImageFormatControl","图像格式控制",	/**/
		{
			{ 0, "WidthMax",									"IInteger",		"图像最大宽度,binning之后的数据"},
			{ 1, "HeightMax",	
ISP调试——基础概念理解 ISP图像调试 阅读详情

相关推荐

Camera HAL/ISP 专业术语大全

不断更新,建议收藏,快速检索

weixin_36389889的博客 3927

工业相机图像格式终极指南:从BayerRG8原理到海康SDK调优技巧

本文深入解析工业相机BayerRG8图像格式的原理与特性,并重点提供海康工业相机SDK的实战调优技巧。内容涵盖从Bayer阵列物理原理、不同转换算法对比,到曝光、白平衡、触发同步等关键参数设置,旨在帮助工程师解决图像质量、帧率及颜色失真等常见问题,提升机器视觉系统性能。

pz8901234的博客 1022

瑞芯微RK1126实战:如何用HTTP接口搞定ISP参数调优(亮度/饱和度/对比度)

本文详细解析了如何通过HTTP接口实现瑞芯微RK1126芯片的ISP参数动态调优,包括亮度、饱和度和对比度等核心参数的隔离控制。通过构建轻量级HTTP服务层,解决了多进程协作中的稳定性问题,提供了标准化通信协议和低耦合架构,适用于嵌入式视觉系统开发。

weixin_29179311的博客 328

ISP核心模块参数调优实战指南

本文详细介绍了ISP核心模块参数调优的实战指南,涵盖RAW域处理、色彩域转换和YUV域增强等关键阶段。通过具体案例和配置示例,帮助工程师掌握BLS校准、DPC策略、LSC优化等技术,实现低噪声与高细节的平衡。文章还分享了AWB算法适配、CCM校准和Gamma曲线定制化等实用技巧,适用于安防、车载和手机等多个应用场景。

weixin_26821003的博客 115

AI-ISP vs 传统ISP:图像处理范式的代际切换

ISP(图像信号处理器)是将CMOS原始数据转换为可视图像的核心硬件模块,其技术演进正从确定性数学算法迈向数据驱动的端到端学习。AI-ISP通过轻量化神经网络重构传统刚性Pipeline,在RAW域直接建模噪声、坏点与色彩响应的耦合关系,实现降噪、去马赛克与HDR融合的联合优化。相比传统方案依赖查表法和固定时序的滤波逻辑,AI-ISP以统计推断替代物理建模,显著提升弱光细节重建能力与跨温度鲁棒性,已在安防、手机影像与车载视觉等实时视频场景落地。本文聚焦AI-ISP与传统ISP的本质差异、架构重构逻辑及工程验

weixin_29038303的博客 308

告别玄学调参!用RK3588 ISP Tuner工具搞定工业相机图像质量的完整实战

本文详细介绍了如何利用RK3588 ISP Tuner工具精准调校工业相机图像质量,特别针对PCB焊点检测场景。通过科学的调试流程和硬件配置,解决了高对比度细节保留、降噪与缺陷检测的平衡等核心挑战,显著提升检测精度和一致性。

weixin_29192365的博客 430

025、ISP Pipeline模块化设计:让同一套调优参数跨平台复用的架构实践

本文探讨了ISP Pipeline模块化设计的架构实践,旨在解决不同平台间调优参数无法复用的问题。作者提出三层分离架构:硬件抽象层屏蔽寄存器差异,算法模块层定义标准接口,调优参数层通过JSON文件实现参数复用。该设计通过语义化接口和参数映射脚本,使"黄金参数集"能跨平台适配,将调参时间从两周缩短至三天。文中还分享了工业相机平台切换时的HDR适配案例,强调扩展性的重要性。最后指出架构落地的关键在于团队协作规范,包括参数修改权限管理和版本控制。该方案经过一年实践验证,显著提升了新项目开发效率。

zzfmlxs的博客 171

sfrmat3v3.zip:符合ISO 12233的SFR/MTF图像锐度量化工具链

SFR(空间频率响应)是评估成像系统清晰度的核心物理指标,其原理基于边缘扩散函数(ESF)与线扩散函数(LSF)的数学建模,最终通过FFT获得调制传递函数(MTF)曲线,直接反映镜头、传感器与ISP链路对不同空间频率细节的保真能力。该技术具有高可复现性、无需主观评价、支持自动化回归测试等工程价值,广泛应用于工业相机标定、手机影像质量验收及光学模组认证等场景。sfrmat3v3.zip作为NIST发布的开源工具链,严格遵循ISO 12233标准,提供命令行驱动的端到端SFR分析能力,并原生支持亚像素边缘定位与

weixin_36311421的博客 277

SM5964 ISP开发全链路指南:从AD原理图到寄存器级调优

图像信号处理(ISP)是嵌入式视觉系统的核心技术,其性能取决于硬件设计、寄存器配置与算法协同的深度耦合。理解ISP原理需回归数据流时序与芯片级约束,尤其在国产低功耗SoC如SM5964中,ISP并非黑盒模块,而是由MIPI接口、Bayer处理、3A控制及DCT硬件加速器构成的可编程流水线。Altium Designer(AD)中的原理图与PCB设计直接决定ISP稳定性——电源完整性、MIPI阻抗匹配以及时钟抖动控制,均可能引发图像条纹、丢帧或白平衡漂移等典型问题。本文聚焦SM5964平台,解析ISP pip

weixin_30313409的博客 232

DNG实拍图驱动的CCM自动调优工具,含白平衡与色块匹配ISP基础链路

直接运行me_CCM_optimizer.py就能对DNG格式RAW图做颜色矩阵(CCM)自动优化,不用手动调参。内置4张实拍DNG样张(IMG_1312、IMG_1332、IMG_1342、IMG_1548),覆盖不同光照和标准色卡场景,方便本地快速验证效果。整个流程走完ISP基础环节:先做白平衡预处理,再自动识别灰卡区域,接着匹配目标色块位置,最后用最小二乘法算出最优3×3颜色校正矩阵。配套有requirements.txt和README.md,写清了Python依赖(rawpy、numpy、openc

vim8coder的博客 229

ESP32脑机接口开发板:EEG信号采集与应用开发指南

脑机接口(BCI)技术通过采集脑电图(EEG)信号实现人机交互,其核心在于高精度生物电信号采集与实时处理。基于ESP32微控制器的开发平台结合专业级ADS1299 ADC芯片,可构建8通道EEG信号采集系统,支持250SPS采样率与可编程增益。这种嵌入式解决方案在科研教育领域具有显著优势,既能满足信号质量要求,又大幅降低开发门槛。典型应用包括实时脑电波可视化、注意力检测等BCI场景,通过Python生态工具链(如BrainFlow、LSL)可快速实现数据处理。开发时需注意电极阻抗控制(<10kΩ)和50/6

weixin_42518874的博客 343

【实战】ESP32 + LN298N 实现电动推杆的闭环位置伺服控制

本文详细介绍了如何使用ESP32微控制器和LN298N电机驱动模块,为普通电动推杆增加编码器反馈,实现精准的闭环位置伺服控制。文章从硬件选型与接线讲起,深入解析了编码器四倍频计数原理与位置换算,并重点阐述了PID控制算法的核心思想、代码实现及参数整定方法,旨在帮助读者从零构建一个反应迅速、定位精准的智能执行器系统。

weixin_29195615的博客 317

zemax像差参数Ray Fan/Spot Diagram/MTF/....讲解三

zemax像差参数Ray Fan/Spot Diagram/MTF/....讲解三

weixin_72050316的博客 1384

Android面试必考问题:Android性能优化最全面试题及参考答案(8万字长文)

Android 中的 OOM(Out Of Memory,内存溢出)异常是指应用程序在运行过程中,由于申请的内存空间超过了系统所能提供的最大内存限制而导致的错误。在 Android 中,内存泄漏是指应用中的某些对象在不再被使用后,仍然被其他对象持有引用,导致这些对象无法被垃圾回收器回收,从而占用内存空间,随着时间的推移可能会导致应用内存不足,甚至崩溃。在一次开发 Android 应用的过程中,我发现应用在长时间运行后会出现内存占用过高的情况,导致应用变得卡顿,甚至可能会被系统强制关闭。

大模型大数据攻城狮的专栏 2531

使用CloudCompare和CANUPO进行点云分类的编程指南

在本文中,我们将介绍如何使用CloudCompare和CANUPO库进行点云分类的编程。CloudCompare是一款功能强大的开源点云处理软件,而CANUPO是一个用于点云分类和分割的C++库。这只是一个简单的点云分类示例,CANUPO库还提供了其他更高级的功能和算法,以满足各种点云分类需求。该函数接受点云数据、地面点掩码和非地面点掩码作为输入,并将分类结果存储在这两个掩码向量中。完成安装后,我们可以开始编写点云分类的代码。最后,我们遍历点云数据,并根据地面点和非地面点的掩码将结果打印出来。

ByteWhisper的博客 1058

芒果YOLOv8改进72:动态标签分配策略篇之ATSS:自适应训练样本选择Adaptive Training Sample Selection策略

YOLOv8代码实践|ATSS标签分配策略改进🥭

包括YOLOv5、YOLOv7、YOLOv8等模型改进 2907

Unreal5从入门到精通之一文搞懂Unreal的C++代码编译之谜

我们在开发Unreal项目时,如果时蓝图模板的项目,一般问题不大,因为当你修改完蓝图,点击编译Compile+保存Save,就可以继续开发了。这对于开发者来说也非常友好。但是,如果你使用的C++模板开发项目,代码编译一切都变得魔幻起来,IDE(VS/Rider)里面有编译,编辑器里面也有编译,有什么区别呢?我们来列举几个新手常碰到的问题。1.代码我明明新建了,编辑器里怎么看不到?2.昨天我新家的功能运行的好好的,今天怎么感觉还是老逻辑。或者昨天加的新代码,新蓝图不见了。

TxNet 1602

C++多线程 task--std::promise和std::future

本文主要讲解C++11/14/17中所提供的应用于多线程编程中的Task机制。Task可由如下几部分取得而本文主要讲解std::promise和std::future相关的内容。std::promise和std::future通过一个数据管道进行交流,可以将std::promise看作生产者,std::future看作消费者,其两者形成如下的方式交互std::promise本身是一个模版类,通过std::promise可以像数据管道中设置value,异常和相应的通知信息。std::promise提供了如下接

qls315的博客 1818

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

上一篇: 动态库和静态库那些事
下一篇: 时间同步的几种方式和组合
帘下有白绿
博客等级 码龄12年 165粉丝 44原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值