OpenCV实战:用傅里叶变换搞定纺织业瑕疵检测(附完整C++代码)

傅里叶变换之工业缺陷检测应用 在工业缺陷检测的场景中,我们经常会遇到一些难以直接通过空域方法进行检测的现象。如图所示,在进行织布赃污的检测时,由于脏污区域与周围像素点的灰度值相差较小,且脏污区域内的像素灰度值变化较大,因此很难选择合适的阈值来进行图像二值化,从而确定脏污区域。此时,我们就要在频域内对图像进行处理。通过频域滤波,滤除掉频率较低的成分(无脏污部分)和频率较高的成分(织布纹理图案部分),即可得到脏污区域的图像。 阅读详情

从频域视角重塑工业质检:OpenCV傅里叶变换实战纺织瑕疵检测

在工业视觉检测领域,面对纹理复杂、背景干扰强的场景,传统的空域图像处理方法常常显得力不从心。想象一下,你站在一台高速运转的纺织机旁,需要实时检测布匹上那些细微的、与背景纹理灰度差异极小的污渍或断纱。直接使用阈值分割?纹理的周期性变化会带来大量噪声。尝试边缘检测?纹理本身的边缘信号可能比缺陷信号更强。这时,我们需要换一个维度思考问题——从“空间域”切换到“频率域”。

傅里叶变换,这个在信号处理领域耳熟能详的工具,为这类问题提供了优雅的解决方案。它不直接盯着图像中每个像素的亮度,而是分析整幅图像中亮度变化的“节奏”与“频率”。对于纺织物这类具有强周期性纹理的图像,其纹理信息在频域中会表现为几个集中的、能量较高的亮点(对应基频和谐波),而随机出现的瑕疵(如污渍、破洞)则表现为相对分散的、特定频带的能量。这种在空域中难以分离的特征,在频域中却可以清晰地被区分和操作。本文将带你深入OpenCV的频域处理核心,用C++代码构建一套可直接部署的纺织瑕疵检测流程,从原理理解、代码实现到参数调优,一站式解决工业落地中的实际问题。

1. 理解核心:为什么频域是纹理瑕疵检测的利器

要驾驭傅里叶变换这个工具,首先得跳出像素点的思维定式。一幅数字图像,可以看作是一个二维离散信号。空间域(我们平常看到的图像)描述的是每个坐标点(x, y)上的信号强度(灰度值)。而频率域描述的,是构成这幅图像的各种“正弦波”成分的幅度和相位信息。高频分量对应图像中快速变化的部分,如边缘、细节和噪声;低频分量则对应图像中缓慢变化的部分,如大面积的平滑区域、背景。

纺织品的纹理通常具有高度的规律性和周期性,比如经纬线的交错。这种规律性在频域中会表现为一系列离散的、对称的亮点,它们远离频率平面的原点(直流分量,代表图像平均亮度)。相反,一个局部的、非周期性的瑕疵(如油污),其频率成分会更加宽泛,可能覆盖一个连续的频带区域,并且其能量分布与纹理的离散亮点截然不同。

关键洞察:瑕疵检测的本质,在频域中变成了“信号分离”问题。我们需要设计一个滤波器,能够抑制代表背景纹理的特定频率成分(那些离散的亮点),同时保留或增强代表瑕疵的频带成分。这比在空域中设计一个通用的、能适应各种纹理的检测算子要直观和可控得多。

为了更直观地理解不同图像成分在频域的表现,我们可以看下面这个简单的对照:

图像特征 空间域表现 频率域表现(幅度谱)
平滑背景/均匀光照 大区域灰度值接近 能量集中在中心原点(低频)
周期性纹理(如布纹) 规则重复的图案 能量集中在远离原点的对称亮点(高频)
边缘与细节 像素灰度突变线 能量分布在一条穿过原点的线上(中高频)
随机噪声/小瑕疵 随机散落的斑点 能量较均匀地分布在整个频域
大面积污渍 局部灰度缓变区域 能量集中在原点附近及特定中低频带

这种对应关系是我们设计滤波器的理论基础。对于纺织瑕疵检测,一个典型的策略是使用带阻滤波器或带通滤波器。带阻滤波器旨在“阻挡”纹理对应的频率,让其他成分(包括瑕疵)通过;而带通滤波器则直接“允许”我们怀疑的瑕疵频率通过。在实际项目中,我往往先从带通滤波入手,因为它能更直接地凸显我们关心的信号。

2. 构建基石:OpenCV中的二维傅里叶变换全流程

在动手写检测代码之前,我们必须扎实掌握OpenCV中执行二维离散傅里叶变换(DFT)的标准流程。这个过程比一维信号处理稍复杂,涉及到通道管理、频谱搬移和可视化等多个步骤。下面是一个完整、可复用的函数,它完成了从输入灰度图到获取中心化幅度谱的全过程。

#include <opencv2/op
C# + OpenCvSharp实战:用轮廓匹配搞定工业零件瑕疵检测(附完整代码) 本文详细介绍了如何利用C#和OpenCvSharp实现工业零件瑕疵检测的轮廓匹配技术。通过图像预处理、轮廓特征工程和多模板投票机制,提升检测的准确性和鲁棒性。文章还提供了完整的代码示例和调优策略,帮助开发者在工业自动化场景中高效部署视觉检测系统。 阅读详情

相关推荐

OpenCV实战:用傅里叶变换搞定纺织瑕疵检测(附完整C++代码)

本文详细介绍了如何利用OpenCV中的傅里叶变换技术实现纺织布匹的自动化瑕疵检测。通过频域分析和优化滤波策略,有效解决了传统方法难以检测的低对比度、纹理干扰等问题,显著提升检测准确率至93%。附完整C++代码实现,为工业缺陷检测提供实用解决方案。

weixin_29267307的博客 96

OpenCV C++工业缺陷检测实战:模板比对与图像处理算法详解

机器视觉是工业自动化领域的核心技术,其核心原理在于通过图像采集与处理,替代人眼进行识别、测量与判断。在工业质检场景中,表面缺陷检测是关键技术价值所在,它直接关系到产品质量与生产成本。传统算法因其稳定性高、可解释性强且不依赖海量数据,在固定场景下依然是工程实践的首选。OpenCV作为经典的计算机视觉库,提供了从图像预处理、特征匹配到形态学处理的全套工具。本文聚焦于工业视觉中经典的模板比对法,深入解析了基于OpenCV C++实现高精度图像配准、自适应阈值分割以及连通域分析的核心流程,并针对实际部署中常见的配准

aibi9196的博客 401

C++实战:Gabor滤波器在纹理分析与边缘检测中的应用

本文深入探讨了Gabor滤波器在纹理分析与边缘检测中的C++实战应用。通过OpenCV实现多尺度多方向检测,结合工业质检案例解析,详细介绍了参数调优与性能优化技巧,帮助开发者高效解决图像处理中的复杂纹理与边缘检测问题。

weixin_29015483的博客 327

OpenCV 4.8 与 Halcon 频域滤波对比:3类滤波器在纹理分析中的性能实测

本文深入对比了OpenCV 4.8与Halcon在频域滤波技术中的性能表现,重点评测了低通、高通和同态滤波三类滤波器在纹理分析场景下的实际效果。通过详细的代码实现和性能数据,揭示了Halcon在工业视觉检测中的优化优势以及OpenCV的跨平台灵活性,为图像处理工程师提供了实用的技术选型参考。

weixin_33694620的博客 426

C++工业视觉实战:从算法到产线系统的12个工程案例解析

计算机视觉作为人工智能的关键分支,通过模拟人类视觉系统,赋予机器感知和理解图像信息的能力。其核心原理涉及图像采集、预处理、特征提取与模式识别,在工业自动化领域具有极高技术价值,能够实现检测、测量、引导与识别等任务,显著提升生产效率和产品质量。应用场景广泛覆盖制造业的缺陷检测、精密测量、机器人引导和装配验证。本文聚焦工业计算机视觉的工程实践,深入探讨在复杂产线环境中如何利用C++和OpenCV构建稳定高效的视觉系统,涵盖图像配准、尺寸测量等核心算法,并解析了螺丝检测、PCB对齐等典型案例中的工程化解决方案,为

weixin_33910759的博客 561

【图像处理】Gabor滤波器在纹理分析与边缘检测中的实战应用

本文深入探讨了Gabor滤波器在图像处理中的核心应用,特别是在纹理分析与边缘检测领域的实战技巧。通过详细解析Gabor滤波器的数学原理、C++实现优化以及多尺度多方向滤波器组的构建方法,展示了其在布料瑕疵检测、指纹识别等场景中的卓越性能。文章还对比了Gabor滤波器与传统边缘检测算子的效果,并提供了频域加速、硬件优化等实用方案,帮助开发者高效解决复杂图像处理问题。

weixin_29053383的博客 212

计算机视觉图像处理:方法分类、OpenCV实操与深度学习协同

计算机视觉项目的成败,往往取决于图像预处理这一基础环节。从原始像素到有效信息的转换,需要综合运用灰度化、滤波、边缘检测、形态学操作与阈值分割等经典方法。这些算法看似独立,实则构成一条完整的处理链路:先降噪增强,再分割提取,最后为深度学习模型提供干净、规范的输入分布。在工业检测、智能车赛道识别、FPGA实时处理等场景中,OpenCV提供了高效落地工具,而深度学习则负责高层语义推理,二者协同分工。理解各类方法的原理与适用边界,掌握从参数调优到问题排查的实战技巧,是构建稳定视觉系统的关键。本文系统梳理了计算机视觉

weixin_28224217的博客 274

OpenCV机器视觉缺陷检测实战:印刷品配准与差分分析

机器视觉在工业质检中扮演关键角色,缺陷检测则是其中最具挑战性的任务之一。传统阈值分割在背景复杂、纹理多样的场景下容易失效,需要结合更稳健的图像处理技术。OpenCV作为广泛使用的计算机视觉库,提供了形态学、特征匹配、频域分析等工具,能够支撑从图像采集到缺陷识别的完整流程。在印刷品检测中,模板配准与差分阈值是降低误检率的有效手段,而傅里叶变换还能定位周期性墨杠缺陷。本文围绕环境搭建、相机曝光、配准算法及动态阈值实现,系统阐述如何构建一套可落地的印刷缺陷检测方案,帮助工程师解决实际产线中的漏检与误检问题。

weixin_28362173的博客 282

OpenCV频率域滤波实战:高斯、理想、巴特沃斯消除周期噪声

频率域图像处理基于傅里叶变换,将图像像素空间转换到频谱空间,使周期性结构和全局特征更易被分离与操纵。通过设计理想低通、高斯低通、巴特沃斯低通等传递函数,可在频域精准衰减特定频率成分,有效应对空间域难以处理的摩尔纹、周期性噪声、扫描条纹等问题。这种滤波方式在工业视觉、文档扫描、医学图像增强中应用广泛,既能平滑图像,又能保留边缘细节。文章结合OpenCV与NumPy,完整演示了从cv2.dft频谱计算、fftshift中心化、滤波器构造到idft逆变换的流程,并总结了振铃、黑边、彩色图像处理等工程避坑要点,适合

weixin_29061531的博客 269

基于机器视觉的水果分拣系统:Python实现从识别到气吹的完整闭环

机器视觉是工业自动化中的核心技术,通过图像采集与算法处理实现目标识别与定位。其原理在于将像素坐标映射到物理空间,结合分类模型与通信协议驱动执行机构。在农业自动化场景中,水果分拣系统需要解决实时推理、坐标对齐与延迟补偿等工程问题。基于Python的轻量级方案,利用OpenCV与ONNX Runtime,可在CPU上实现可用帧率,并通过Modbus与PLC协同完成气吹动作。本文围绕这一闭环,拆解从相机取帧到气吹触发的完整链路,涵盖模型选型、推理加速与产线避坑经验。

weixin_29053577的博客 250

从零配置XDMA:手把手教你PCIe BAR与AXI总线的地址转换(基于Vivado2023)

本文基于Vivado2023,手把手教你配置XDMA IP核,深入解析PCIe BAR与AXI总线地址转换的核心原理。通过实战步骤,详细说明如何正确设置BAR参数(如32/64位、预取使能)及地址映射,确保主机能稳定访问FPGA侧寄存器与内存,是解决PCIe通信调试难题的关键指南。

2w3e4r5t6y的博客 1218

阿里云大模型 ACP 认证教材内容突变?这些改动藏着通关密码,不看亏大!

【摘要】核心章节大换血,安全合规融入实战场景,大模型微调用数学深度解析,部署章节带来阿里云产品对比实战攻略,甚至整章内容被替换成藏满学习彩蛋的行业趋势指南。这些改动不仅重塑考试重点,更暗藏官方命题风向——安全合规考场景方案,微调原理考几何解析,部署设计考分析框架。无论你是数学小白还是部署新手,这篇攻略都将带你吃透变动逻辑,附赠急救包和考点清单,帮你抓住这些“隐形加分项”,速来解锁通关秘籍!

davidkorhenn的博客 1755

新手避坑指南:从GEO数据库下载单细胞测序数据的5个关键步骤(附实操截图)

本文为单细胞测序数据下载新手提供5个关键避坑步骤,涵盖数据搜索准备、样本量评估、文件选择决策、元数据诊断及高效下载技术。通过实操截图和代码示例,帮助研究者快速锁定GEO数据库中的优质单细胞测序数据,避免常见错误。

weixin_30296405的博客 676

VESC电调高级调参指南:电机校准与性能优化实战解析

本文详细解析了VESC电调的高级调参方法,包括电机校准与性能优化实战技巧。从基础参数设置到高级机械参数优化,再到动态性能调优,提供了全面的调参指南。特别针对电机类型、功率设置、电池参数配置等关键环节给出实用建议,帮助用户充分发挥VESC电调的性能潜力。

weixin_30772105的博客 198

Redash离线环境部署2020.1(centos+windows)

背景 Redash是一款开源的BI系统,核心功能是添加数据源,然后进行数据的可视化展示。一般会拿出来同Supervisor和Metabase进行选型比较,这里对三者的选型不做细致分析。而是给出在Redash开发环境部署踩过的坑,很多坑是自己琢磨出来的,网上几乎找不到更新的资料。适用于没怎么用过linux,也不怎么熟悉python的,用的是最新(master)的redash的代码(上一个发布版本...

Jone_wan的专栏 2139

图像处理基础 || (一) python 读取图像的常用方式

图像的读取与保存是图像处理或计算机视觉领域中最基本的操作,python中有众多的库支持图像的读取、显示与存储,常用的库包括 matplotlib、skimage 和 Pillow 库。

weixin_40234309的博客 5695

5ZCM6ZGrVDllSFLkv6Hmga/ljJbnrqHnkIbns7vnu58= GetFlowDropDown SQL注入

5ZCM6ZGrVDllSFLkv6Hmga/ljJbnrqHnkIbns7vnu58=、eHR/OA一体化智慧云平台、智慧一卡通云平台、行业软件开发与定制、智慧企业管理信息化咨询与项目服务为核心业务的顾问式管理咨询和软件个性定制开发的高科技股份集团公司。同鑫T9eHR信息华管理系统存在SQL注入漏洞,攻击者可通过该漏洞上传shell。关闭互联网暴露面或接口设置访问权限。利用sqlmap进行shell。

iSee857的博客 703

《大数据: Hive 交互命令和常用配置》

一、Hive 交互命令 1. 首先解决一个可能发生的问题 (log4 jar包冲突) 我这里解决方法就是删除一个,我删的是hive下的包 yexiang@hadoop1:<hive>$ hive SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/opt/soft/apache-hive-2.3.7-bin/lib/log4j-slf4j-impl-2.6.2.ja.

yexiang优快云的专栏 289

深度学习工具包 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")

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: 百度AI语音合成API实战:从零开始实现短文本在线合成(附完整PHP代码)
下一篇: Eviews小白必看:3种异方差检验方法实操指南(附怀特检验避坑技巧)
linux6sysadmin
博客等级 码龄4年 59粉丝 1615原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值