当前位置: 首页 > news >正文

微小目标识别研究(2)——基于K近邻的白酒杂质检测算法实现

文章目录

      • 实现思路
      • 配置opencv
      • 位置剪裁
        • 实现代码
      • 自适应中值滤波
        • 实现代码
      • 动态范围增强
        • 实现代码
      • 形态学处理
        • 实现代码
      • 图片预处理效果
      • 计算帧差
        • 连续帧帧差法原理和实现代码
        • 实现代码
      • K近邻实现
        • 基本介绍
        • 实现代码
          • 这部分是手动实现的,并没有直接调用相关的库
          • 完整的代码——调用opencv的特定的库实现的
      • 实现过程
      • 参考

实现思路

  • 使用C++进行实现,开发平台是clion,并没有使用深度学习,使用opencv进行开发

在这里插入图片描述

配置opencv

  • 一开始就出来幺蛾子,之前装好的opencv怎么都找不到包,弄了一个小时,夹着红框后面的三句,告诉clion我安装的opencv包的具体位置,可能是因为我之前没有编译成功,直接间别人编译好的直接下载下来的,不过我为什么不用python上面的opencv那。

  • 在这里插入图片描述

位置剪裁

在这里插入图片描述

  • 相机位置固定,拍摄的位置固定,背景干扰很少,只需要保存红框右半部分的内容即可,左半部分去除。

实现代码

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <iostream>
#include <fstream>using namespace std;
using namespace cv;struct RectPoint{int x,y;int width,height;RectPoint(int x,int y,int width,int height):x(x),y(y),width(width),height(height){}
};void ClipImage(String ImagePath,RectPoint rect,String TargetPath){// 声明Mat保存图片Mat img;Rect m_select;string line;// 判定文件存在ifstream input_file(ImagePath);if (!input_file.is_open()) {cerr << "Could not open the file - '"<< ImagePath << "'" << endl;return;}while(getline(input_file,line)){// 获取文件后缀名,并进行拼接成目标文件名string ImageName = line.substr(line.find_last_of('\\',line.size())+1);string TargetName = TargetPath;TargetName.append(ImageName);// 读取并剪裁图片到特定大小保存img = imread(line);m_select = Rect(rect.x,rect.y,rect.width,rect.height);Mat ROI = img(m_select);imwrite(TargetName,ROI);}
}int main()
{String TargetImage = R"(E:\CProject\impurityDetection\ClippedImage\)";String SourceImage = R"(E:\CProject\impurityDetection\image\path.txt)";ClipImage(SourceImage,RectPoint(600,0,1780,1480),TargetImage);return 0;
}

自适应中值滤波

  • 自适应中值滤波,是为了去除照相机的噪声同时,又不损坏原来的杂质信息,这里使用自适应中值滤波,具体实现如下。

在这里插入图片描述

实现代码

void Convolution(Mat &SourceImage,vector<int> &pixels,int x,int y ,int border){for (int k = -border; k <= border; k++){for (int l = -border; l <= border; l++){pixels.push_back(SourceImage.at<uchar>(x+k, y+l));}}
}Mat SelfAdaptMedianFilter(const Mat& SourceImage){// 复制原图Mat result = SourceImage.clone();// 掩膜大小为3int ksize = 3;int border = ksize /2 ;for (int i = border; i < SourceImage.rows - border; i++){for (int j = border; j < SourceImage.cols - border; j++){while(1){// 提取当前像素的邻域vector<int> pixels;Convolution(result, pixels, i, j, border);// 对邻域像素值进行排序sort(pixels.begin(), pixels.end());// 取中值作为当前像素的新值int median = pixels[pixels.size() / 2];int PMax = pixels[pixels.size() - 1];int PMin = pixels[0];//判定是否为异常值if (median == PMax || median == PMin) {// 掩膜再加2,重新计算ksize += 2;if (ksize + 2 > Nmax) {result.at<uchar>(i, j) = median;break;}else{// 判定传入的值,是否出现越界的情况if((i - ksize / 2 < 0 || i + ksize / 2 < SourceImage.cols) ||j - ksize / 2 < 0 || j + ksize / 2 > SourceImage.rows)result.at<uchar>(i,j) = (PMax + PMin) / 2;}} else {//中值不是极值,判定原像素点是不是极值,然后在进行输出if (result.at<uchar>(i, j) == PMax || result.at<uchar>(i, j) == PMin)result.at<uchar>(i,j) = median;break;}}}}return result;
}

动态范围增强

  • 这里就是图像的直方图均衡化,使得整个模型的图片颜色对比度更大,显示出更多的细节。

实现代码

   //对图片进行直方图均衡化,凸显出前后差异Mat equalized;// 转成二值化,并变为直方图均衡化cvtColor(ROI, equalized, COLOR_BGR2GRAY);equalizeHist(equalized, equalized);

形态学处理

  • 膨胀操作 :通过增加图像中的物体的像素数量,使得物体的大小和面积增加,边缘变得更加明显,改变了原来字体粗细

在这里插入图片描述

  • 腐蚀操作 :在卷积核大小中对图片进行卷积。取图像中(3 * 3)区域内的最小值。可以消除图像中的毛刺和噪声。改变了原来字体粗细
    在这里插入图片描述
  • 开运算 :先腐蚀运算,在进行膨胀运算。在不损害字体信息的情况下,去除了噪声和毛刺。通过调整卷积可以进一步减少噪声

在这里插入图片描述

  • 闭运算 :先膨胀运算,在进行腐蚀运算。在不去除任何噪声的情况下,补全了缺失的信息。

在这里插入图片描述

  • 这里选择开运算,具体实现代码如下,别的可以参考知乎链接

实现代码

   // 对图像进行开运算,Mat morphologied;int size = 3;// shape是内核的形状,size是内核的尺寸,锚点的位置,对于矩形来说,全部都是 1 ,不用调整cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT,cv::Size(2*size + 1, 2*size+1),cv::Point(size, size));cout<<element<<endl;morphologyEx(equalized, morphologied, cv::MORPH_OPEN, element);

图片预处理效果

在这里插入图片描述

计算帧差

  • 主要有两种方法,分别是静态参考帧差分法和连续帧帧差法,下图为两个效果,很明显的可以就看到连续帧帧差法的效果更好,常见的静态帧是将多个帧进行平均,然后以平均之后的帧作为参考帧,然后后面每帧都是和当前帧作比较,没有动作的连续性。

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

连续帧帧差法原理和实现代码

  • 实现原理如下图
    在这里插入图片描述

  • 使用absdiff函数,具体描述如下,计算frame1和frame2的帧差,然后将结果保存到framediff中

cv::Mat frameDiff;
cv::absdiff(frame1, frame2, frameDiff);

实现代码


//计算帧差,并将最终的结果进行返回
Mat DifFrame(Mat PreFrame,Mat CurFrame,Mat NextFrame){//计算帧差Mat FrameDiffPre , FrameDiffNext;absdiff(PreFrame,CurFrame,FrameDiffPre);absdiff(CurFrame,NextFrame,FrameDiffNext);// 分别进行二值化,设定二值化的阈值Mat BinImgPre , BinImgNext;threshold(FrameDiffPre,BinImgPre,128,255,cv::THRESH_BINARY);threshold(FrameDiffNext,BinImgPre,128,255,cv::THRESH_BINARY);// 将图片进行与运算,然后将结果进行输出Mat ResFrame;bitwise_and(FrameDiffPre,FrameDiffNext,ResFrame);//返回最终处理过后的帧return ResFrame;}// 计算帧差的外部函数,读取原来处理过的文件,计算所有图片的帧差
void AllDifFrame(const string& ImagePath,const string& TargetPath){// 保存文件名string line;// 判定文件存在ifstream input_file(ImagePath);if (!input_file.is_open()) {cerr << "Could not open the file - '"<< ImagePath << "'" << endl;return;}// 需要提前读取两个,然后依次往后进行迭代Mat PreFrame,CurFrame,NextFrame;getline(input_file,line);PreFrame = imread(line);// 读取下一个需要处理的帧getline(input_file,line);CurFrame = imread(line);// 逐行读取文件名while(getline(input_file,line)){// 当前需要处理的帧NextFrame = imread(line);// 获取文件后缀名,并进行拼接成目标文件名string ImageName = line.substr(line.find_last_of('\\',line.size())+1);string TargetName = TargetPath;TargetName.append(ImageName);// 三帧相邻出进行帧差运算,算出的帧差进行按位相与运算Mat TempFrame;absdiff(PreFrame,CurFrame,PreFrame);absdiff(CurFrame,NextFrame,TempFrame);bitwise_and(PreFrame,TempFrame,TempFrame);//计算计算过进行保存imwrite(TargetName,TempFrame);// 三帧往前进行迭代PreFrame = CurFrame;CurFrame = NextFrame;}}

K近邻实现

基本介绍

  • 思路 : 将样本在特征空间中,根据一定的分类方法,归类于与该样本最相似的K个样本中大多数的那一类。需要一部分已经标注过的样本,然后将未标注过的样本进行分类。

  • 特点

    • 对于异常目标的容忍度比较高,因为不依靠参数直接分类,而是寻找多个近邻目标的联合分类
    • 支持多分类,对于类域交叉重叠依然有较好的分类能力,因为白酒中的杂质在特征上有很强的相似性,在类域上会有很强的重叠性
    • 训练过程复杂度低:实时更新样本数据集,再识别一种杂质之后,将该样本增加到样本数据中,使得分类效果更加稳定。
  • 实现过程

    • 准备数据集:需要将要分类的目标的特征向量与一些已知分类的目标的特征向量组成一个数据集。
    • 特征提取:使用OpenCV库提取目标的特征向量。
      • 注意 这里提取的特征是完整的一幅图片,因为我这里已经对图片进行了预处理,让特征很明显,所以不需要进行特征提取
    • 训练模型:使用KNN算法对数据集进行训练,生成分类器。
    • 分类:使用训练好的分类器对新的目标进行分类。
  • 补充

    • 针对图片进行的KNN分类,是一种高维数据,KNN算法可以使用降维技术,来提高效率和准确率,比如说主成分分析(PCA)
    • KNN,适用于小数据集和低维度数据集
    • 可以通过对距离加权的方式,来提升预测的准确率

实现代码

这部分是手动实现的,并没有直接调用相关的库
// 定义一个结构体,用于保存数据点和标签
struct DataPoint {vector<double> features;   // 特征数据int label;                      // 标签
};// 计算欧氏距离
double euclideanDistance(const vector<double>& v1, const vector<double>& v2) {double dist = 0.0;for (int i = 0; i < v1.size(); i++) {dist += pow((v1[i] - v2[i]), 2);}return sqrt(dist);
}// 预测函数,返回预测标签
int predict(const vector<DataPoint>& trainData, const vector<double>& testData, const int k) {// 对于测试集,计算每一个测试样本和数据集中的,所有样本的欧式距离vector<pair<int, double>> distances;   // 存储距离和标签for (const auto & i : trainData) {double distance = euclideanDistance(i.features, testData);distances.emplace_back(i.label, distance);}// 根据结果进行排序,指定排序函数,仅仅对距离进行比较sort(distances.begin(), distances.end(), [](pair<int, double> a, pair<int, double> b) {return a.second < b.second;});//   获取最后k个样本最高的分类类别vector<int> kLabels(k);for (int i = 0; i < k; i++) {kLabels.push_back(distances[i].first);}// 获取数量类别最大的分类int maxLabel = 0;int maxCount = 0;for (auto iter = kLabels.begin();iter != kLabels.end();iter ++){int times = count(kLabels.begin(),kLabels.end(),*(iter));if(times > maxCount){maxCount = times;maxLabel = *(iter);}}return maxLabel;}
完整的代码——调用opencv的特定的库实现的
#include<opencv2/opencv.hpp>
#include<iostream>
#include <fstream>using namespace std;
using namespace cv;
using namespace cv::ml;// 读取图片并形成数据集
void KNNTraning(const string& ImagePath, Mat& Images, Mat& Labels) {/** 将图片转成一维数据,并保存在MAT中* path: 读取文件需要使用的路径* images:保存所有图片的数据集* labels:对应每一张图片的标签*/// 声明Mat保存图片Mat img;string line;string ImgLabel;int flag = 0;// 判定文件存在ifstream input_file(ImagePath);if (!input_file.is_open()) {cerr << "Could not open the file - '"<< ImagePath << "'" << endl;return;}while(getline(input_file,line)) {// 获取文件后缀名,并进行拼接成目标文件名string ImageName = line.substr(line.find_last_of('\\',line.size())+1);if(ImageName != ImgLabel)flag ++;// 将图片转成一维的数据,并合并到一个大的mat中img = imread(line, cv::IMREAD_GRAYSCALE);Images.push_back(img.reshape(0,1));Labels.push_back(flag);}// 将Mat转变成数据集Images.convertTo(Images,CV_32F);Images = Images / 255;int nImgCount = Images.rows;int nTrainCount = nImgCount / 4 * 3;Mat trainData,trainLabels;trainData = Images(Range(0,nTrainCount),Range::all());trainLabels = Labels(Range(0,nTrainCount),Range::all());Ptr<TrainData> tData = TrainData::create(trainData, ROW_SAMPLE, trainLabels);// 训练KNN模型Ptr<KNearest> model = KNearest::create();// 设定k值,最终选取是哪个类别model->setDefaultK(5);// 设置分类还是回归,true为分类,false为回归model->setIsClassifier(true);// 设置训练数据,进行训练。就相当于将前面的标注数据和测试数据进行了一个训练绑定model->train(tData);model->save("model.xml");
}float predict(string ImgPath,string modelPath){// 加载模型cv::Ptr<cv::ml::KNearest> knn = cv::ml::StatModel::load<cv::ml::KNearest>(modelPath);//读取图片Mat imgTest = imread(ImgPath);imgTest.convertTo(imgTest,CV_32F);imgTest = imgTest / 255;imgTest = imgTest.reshape(0,1);//输出预测结果float ret = knn->predict(imgTest);return ret;
}

实现过程

参考

  • Opencv 图像处理之膨胀与腐蚀 【https://zhuanlan.zhihu.com/p/110330329】

相关文章:

微小目标识别研究(2)——基于K近邻的白酒杂质检测算法实现

文章目录实现思路配置opencv位置剪裁实现代码自适应中值滤波实现代码动态范围增强实现代码形态学处理实现代码图片预处理效果计算帧差连续帧帧差法原理和实现代码实现代码K近邻实现基本介绍实现代码这部分是手动实现的&#xff0c;并没有直接调用相关的库完整的代码——调用ope…...

2022-06-14至2022-08-11 关于复现MKP算法的总结与反思

Prerequisite 自2022年6月14日至2022年8月11日的时间内&#xff0c;我致力于完成A Hybrid Approach for the 0–1 Multidimensional Knapsack problem 论文的复现工作&#xff0c;此次是我第一次进行组合优化方向的学习工作&#xff0c;下面介绍该工作内容发展过程以及该工作结…...

IBMMQ教程二(window版安装)

下载下载地址&#xff1a;https://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/messaging/mqadv/我这里选择的是9.1.0.0版本安装将下载完成的压缩包解压双击Setup.exe直接运行点击软件需求查看系统配置是否满足&#xff0c;右边绿色的对号说明满足需求&#xff0c…...

Java | HashSet 语法

HashSet 基于 HashMap 来实现的&#xff0c;是一个不允许有重复元素的集合。 HashSet 允许有 null 值。 HashSet 是无序的&#xff0c;即不会记录插入的顺序。 HashSet 不是线程安全的&#xff0c; 如果多个线程尝试同时修改 HashSet&#xff0c;则最终结果是不确定的。 您必须…...

js学习4(运算符)

### 1.算数运算符&#xff1a; 、-、*、\、%&#xff08;取余&#xff09;、**&#xff08;幂方&#xff09; ## 优先级 同数学课程&#xff0c;可以加括号 ### 2.自增和自减 、--&#xff08;即数值变量加一或减一&#xff09; ### 3.赋值运算符 、、-、*、/、... ### 4.比较运…...

2月更新 | Visual Studio Code Python

我们很高兴地宣布&#xff0c;2023年2月版 Visual Studio Code Python 和 Jupyter 扩展现已推出&#xff01;此版本包括以下改进&#xff1a;从激活的终端启动 VS Code 时的自动选择环境 使用命令 Python: Create Environmen 时可选择需求文件或可选依赖项 预发布&#xff1a;改…...

C++回顾(十八)—— 文件操作

18.1 I/O流概念和流类库结构 1 概念 程序的输入指的是从输入文件将数据传送给程序&#xff0c;程序的输出指的是从程序将数据传送给输出文件。 C输入输出包含以下三个方面的内容&#xff1a; &#xff08;1&#xff09;对系统指定的标准设备的输入和输出。即从键盘输入数据&am…...

以java编写员工管理系统(测试过 无问题)

一、系统结果的部分展示 二、题目以及相关要求 三、组成 1.该系统由 Employee 类 、commonEmployee类、Testemd类和managerEmployee类组成 2.Employee实现的代码 public class Employee {private String id;private String name;private String job;private int holiday…...

单例模式之懒汉式

在上篇文章中&#xff0c;我们讲了单例模式中的饿汉式&#xff0c;今天接着来讲懒汉式。 1.懒汉式单例模式的实现 public class LazySingleton {private static LazySingleton instance null;// 让构造函数为private&#xff0c;这样该类就不会被实例化private LazySingleto…...

1638_chdir函数的功能

全部学习汇总&#xff1a;GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 今天看一个半生不熟的小函数&#xff0c;chdir。说半生不熟&#xff0c;是因为这个接口一看就知道是什么功能。然而&#xff0c;这个接口如何用可真就没啥想法了。 …...

使用CEF 获得某头条请求,并生成本地文件的方法

目录 一、获得网站请求响应信息 1、响应过滤 2、匹配过滤URL的函数 3、获得请求响应后的处理...

二十、Django-restframework之视图集和路由器

一、视图集和路由器 REST框架包含了一个处理视图集的抽象&#xff0c;它允许开发人员集中精力建模API的状态和交互&#xff0c;并根据通用约定自动处理URL构造。 视图集类与视图类几乎相同&#xff0c;不同之处在于它们提供的是retrieve或update等操作&#xff0c;而不是get或…...

[深入理解SSD系列 闪存实战2.1.2] SLC、MLC、TLC、QLC、PLC NAND_固态硬盘闪存颗粒类型

闪存最小物理单位是 Cell, 一个Cell 是一个晶体管。 闪存是通过晶体管储存电子来表示信息的。在晶体管上加入了浮动栅贮存电子。数据是0或1取决于在硅底板上形成的浮动栅中是否有电子。有电子为0,无电子为1. SSD 根据闪存颗粒区分,固态硬盘有SLC、MLC、TLC、QLC、PLC 五种类型…...

论文阅读-MGTAB: A Multi-Relational Graph-Based Twitter Account DetectionBenchmark

目录 摘要 1. 引言 2. 相关工作 2.1. 立场检测 2.2.机器人检测 3.数据集预处理 3.1.数据收集和清理 3.2.专家注释 3.3. 质量评估 3.4.特征分析 4. 数据集构建 4.1.特征表示构造 4.2.关系图构建 5. 实验 5.1.实验设置 5.2.基准性能 5.3训练集大小的研究 5.4 社…...

基于libco的c++协程实现(时间轮定时器)

在后端的开发中&#xff0c;定时器有很广泛的应用。 比如&#xff1a; 心跳检测 倒计时 游戏开发的技能冷却 redis的键值的有效期等等&#xff0c;都会使用到定时器。 定时器的实现数据结构选择 红黑树 对于增删查&#xff0c;时间复杂度为O(logn)&#xff0c;对于红黑…...

java多线程与线程池-04线程池与AQS

第7章 线程池与AQS java.util.concurrent包中的绝大多数同步工具,如锁(locks)和屏障(barriers)等,都基于AbstractQueuedSynchronizer(简称AQS)构建而成。这个框架提供了一套同步管理的通用机制,如同步状态的原子性管理、线程阻塞与解除阻塞,还有线程排队等。 在JD…...

优化模型验证关键代码25:样本均值近似技术处理两阶段随机旅行商问题及Gurobipy代码验证

大多数数学规划模型都会考虑到研究问题中存在的不确定性,针对这些不确定性,两种常用的处理方法是鲁棒优化和随机规划。这篇论文我们关注后者,也就是两阶段随机旅行商问题;利用套期保值算法计算不同规模TSP的可行解,同时比较了样本均值近似技术的解的情况,并计算了该问题的…...

老爸:“你做的什么游戏测试简直是不务正业!”——我上去就是一顿猛如虎的解释。

经常有人问我&#xff1a;游戏测试到底是干什么呢&#xff1f;是游戏代练&#xff1f;每天玩游戏&#xff1f;装备随便造&#xff0c;怪物随便秒&#xff0c;线上GM指令随便用&#xff1f;可以每天玩玩游戏&#xff0c;不用忙工作&#xff0c;太爽了&#xff1f;有时朋友不理解…...

JVM垃圾回收调优知识点整理

目录 1、JVM内存模型 1.2、堆及垃圾回收 1.3、JVM参数设置经验: 1.4、对象逃逸分析:...

linux安装mysql-8.0.31

1)、下载mysql-8.0.31压缩包两种方式 a.本地下载后上传服务器解压&#xff0c;下载地址&#xff1a;https://downloads.mysql.com/archives/community/ b.服务器使用命令下载&#xff0c;注意&#xff1a;路径在那&#xff0c;就下载到那个位置。 wget https://dev.mysql.com/…...

2023 年会是网络安全的关键年吗?

过去 12 个月对网络安全领域和周围的每个人来说再次充满挑战。和往年不同&#xff0c;感觉很不一样&#xff0c;攻击源源不断。过去&#xff0c;大型漏洞每季度发生一次&#xff0c;但在过去一年中&#xff0c;在某些情况下&#xff0c;我们几乎每周都会处理严重漏洞。 已知利…...

【深度强化学习】(1) DQN 模型解析,附Pytorch完整代码

大家好&#xff0c;今天和各位讲解一下深度强化学习中的基础模型 DQN&#xff0c;配合 OpenAI 的 gym 环境&#xff0c;训练模型完成一个小游戏&#xff0c;完整代码可以从我的 GitHub 中获得&#xff1a; https://github.com/LiSir-HIT/Reinforcement-Learning/tree/main/Mod…...

Nginx服务优化与防盗链

目录 1.隐藏nginx版本号 1.查看版本号 2.隐藏版本信息 2.修改用户与组 3.缓存时间 4.日志分割 5.连接超时 6.更改进程数 7.网页压缩 8.配置防盗链 1.配置web源主机&#xff08;192.168.156.10 www.lhf.com&#xff09; 2.配置域名映射关系 3.配置盗链主机 &#xff0…...

npm与yarn常用命令

npm npm -v&#xff1a;查看 npm 版本npm init&#xff1a;初始化后会出现一个 Package.json 配置文件&#xff0c;可以在后面加上 -y&#xff0c;快速跳到问答界面npm install&#xff1a;会根据项目中的 package.json 文件自动给下载项目中所需的全部依赖npm insall 包含 --…...

【C++】C++11新特性——右值引用

文章目录一、左值引用、 右值引用1.1 左值与右值1.2 左值引用1.3 右值引用二、右值引用的意义三、移动语句3.1 移动构造3.2 移动赋值3.3 总结四、move问题五、完美转发5.1 万能引用与折叠5.2 完美转发std::forward一、左值引用、 右值引用 1.1 左值与右值 我们经常能听到左值…...

C#基础教程21 正则表达式

文章目录 简介正则表达式语法字符集元字符转义字符量词贪婪匹配和非贪婪匹配正则表达式类Regex类Match方法Matches方法简介 正则表达式是一种描述字符串模式的语言,它可以用来匹配、查找、替换字符串中的模式。在C#中,我们可以使用System.Text.RegularExpressions命名空间下的…...

聚观早报|谷歌发布最大视觉语言模型;王兴投资王慧文ChatGPT项目

今日要闻&#xff1a;谷歌发布全球最大视觉语言模型&#xff1b;马斯克预计Twitter下季度现金流转正&#xff1b;王兴投资王慧文ChatGPT项目&#xff1b;美国拟明年 11 月开展载人绕月飞行&#xff1b;慧与科技宣布收购Athonet谷歌发布全球最大视觉语言模型 近日&#xff0c;来…...

java Spring5 xml配置文件方式实现声明式事务

在java Spring5通过声明式事务(注解方式)完成一个简单的事务操作中 我们通过注解方式完成了一个事务操作 那么 下面 我还是讲一下 基于xml实现声明式事务的操作 其实在开发过程中 大家肯定都喜欢用注解 因为他方便 这篇文章中的xml方式 大家做个了解就好 还是 我们的这张表 记…...

常用存储芯片-笔记本上固态硬盘PTS11系列推荐

在存储领域中&#xff0c;除了存储颗粒之外&#xff0c;还有一种极其重要的芯片&#xff1a;存储控制芯片。存储控制芯片是CPU与存储器之间数据交换的中介&#xff0c;决定了存储器最大容量、存取速度等多个重要参数。特别是在AI、5G、自动驾驶时代&#xff0c;对于数据处理及存…...

【AI绘图学习笔记】奇异值分解(SVD)、主成分分析(PCA)

这节的内容需要一些线性代数基础知识&#xff0c;如果你没听懂本文在讲什么&#xff0c;强烈建议你学习【官方双语/合集】线性代数的本质 - 系列合集 文章目录奇异值分解线性变换特征值和特征向量的几何意义什么是奇异值分解&#xff1f;公式推导SVD推广到任意大小矩阵如何求SV…...

【设计模式】模板方法模式和门面模式

模板方法模式和门面模式模板方法模式代码示例门面模式代码示例门面模式的应用场景模板方法模式 模板方法模式非常简单&#xff0c;就是定义了一个固定的公共流程&#xff0c;整个流程有哪些步骤是事先定义好的&#xff0c;具体的步骤则交由子类去实现。属于行为型设计模式。 简…...

Kubernetes未来十年的四大发展趋势

作者&#xff1a;李翔 跟大家已经感受到的一样&#xff0c;Kubernetes已经成为了云计算领域最具统治力的平台&#xff0c;成为了云原生开发的绝对标准&#xff0c;而伴随Kubernetes诞生的CNCF (Cloud Native Computing Foundation) 也因此成为了业界影响力巨大的组织。在成为云…...

一、sql 基础知识、函数和子查询

MySQL 是一种流行的关系型数据库管理系统&#xff0c;使用 SQL 语言进行数据管理和操作。在 MySQL 中&#xff0c;常用的语句包括 SELECT 查询语句、WHERE 条件语句、算术表达式、函数、聚合函数、自定义函数、逻辑表达式、子查询和连接。这些语句可以帮助用户快速地进行数据查…...

产品射频认证笔记

文章目录1. 射频监管认证的目的&#xff1a;1.1 确保 RF 产品在其预期环境中按预期运行1.2 确保射频产品不会干扰其他电子或射频设备2. 射频认证地区规范3. FCC简介4. FCC认证需要准备的内容&#xff1a;5. 射频监管测量会话期间测量以下射频属性&#xff1a;6. 调整射频参数6.…...

做了个springboot接口参数解密的工具,我给它命名为万能钥匙(已上传maven中央仓库,附详细使用说明)

前言&#xff1a;之前工作中做过两个功能&#xff0c;就是之前写的这两篇博客&#xff0c;最近几天有个想法&#xff0c;给它做成一个springboot的start启动器&#xff0c;直接引入依赖&#xff0c;写好配置就能用了 springboot使用自定义注解实现接口参数解密&#xff0c;普通…...

【Flutter从入门到入坑】Flutter 知识体系

学习 Flutter 需要掌握哪些知识&#xff1f; 终端设备越来越碎片化&#xff0c;需要支持的操作系统越来越多&#xff0c;从研发效率和维护成本综合考虑&#xff0c;跨平台开发一定是未来大前端的趋势&#xff0c;我们应该拥抱变化。而 Flutter 提供了一套彻底的移动跨平台方案…...

顺序表的基本操作

目录 一.什么是顺序表 二.顺序表的基本操作 1.初始化 2.增容 3.尾插 4.头插 5.尾删 6.头删 7.指定位置插入 8.指定位置删除 9.打印 10.查找 11.销毁 一.什么是顺序表 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组…...

设计模式——创建型模型——单列模式(8种实现)

前言&#xff1a; &#x1f44f;作者简介&#xff1a;我是笑霸final&#xff0c;一名热爱技术的在校学生。 &#x1f4dd;个人主页&#xff1a;个人主页1 || 笑霸final的主页2 &#x1f4d5;系列专栏&#xff1a;计算机基础专栏 &#x1f4e7;如果文章知识点有错误的地方&#…...

【软考中级】软件设计师笔记

计算机系统的性能一般包括两个方面&#xff1a;一方面是它的可用性&#xff0c;也就是计算机系统能正常工作的时间&#xff0c;其指标可以是能够持续工作的时间长度&#xff0c;也可以是在一段时间内&#xff0c;能正常工作的时间所占的百分比 另一方面是处理能力&#xff0c;又…...

包教包会的ES6

自学参考&#xff1a;http://es6.ruanyifeng.com/ 一、ECMAScript 6 简介 ECMAScript 6.0&#xff08;以下简称 ES6&#xff09;是 JavaScript 语言的下一代标准&#xff0c;已经在 2015 年 6 月正式发布了。它的目标&#xff0c;是使得 JavaScript 语言可以用来编写复杂的大…...

python学习——【第四弹】

前言 上一篇文章 python学习——【第三弹】 中学习了python中的流程控制语句&#xff0c;这篇文章我们接着学习python中的序列。先给大家介绍不可变序列 字符串和可变序列 列表&#xff0c;下一篇文章接着补充元组&#xff0c;集合和字典。 序列 指的是一块可以存放多个值的…...

Web3中文|无聊猿Otherside元宇宙启动第二次旅行

3月9日消息&#xff0c;无聊猿Bored Ape Yacht Club母公司Yuga Labs公布了其Otherside元宇宙游戏平台第二次测试的最新细节。Yuga Labs公司称&#xff0c;“第二次旅行”将于3月25日举行&#xff0c;由四位Otherside团队长带领完成近两小时的游戏故事。本次旅行对Otherdeed NFT…...

SpringCloud-7_OpenFeign服务调用

OpenFeign介绍OpenFeign是什么1.OpenFeign是个声明式WebService客户端&#xff0c;使用OpenFeign让编写Web Service客户端更简单2.它的使用方法是定义一个服务接口然后在上面添加注解3.OpenFeign也支持可拔插式的编码器和解码器4.Spring Cloud对OpenFeign进行了封装使其支持了S…...

解决docker容器之间网络互通

docker容器之间相互访问 1.查看当前的网络 Copy [roothost ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 3dd4643bb158 bridge bridge local 748b765aca52 host host …...

测试微服务:快速入门指南

在过去几年中&#xff0c;应用程序已经发展到拥有数百万用户并产生大量数据。使用这些应用程序的人期望快速响应和 24/7 可用性。为了使应用程序快速可用&#xff0c;它们必须快速响应增加的负载。 一种方法是使用微服务架构&#xff0c;因为在单体应用程序中&#xff0c;主要…...

MySQL Show Profile分析

6 Show Profile分析&#xff08;重点&#xff09; Show Profile是mysql提供可以用来分析当前会话中语句执行的资源消耗情况。可以用于SQL的调优的测量 官网文档 默认情况下&#xff0c;参数处于关闭状态&#xff0c;并保存最近15次的运行结果 分析步骤&#xff1a; 1、是否…...

基于Docker快速搭建蜜罐Dionaea(30)

实验目的 1. 快速搭建Dionaea蜜罐 2. 使用Nmap扫描测试Dionaea蜜罐预备知识1. 初步认识Dionaea dionaea&#xff0c;中文的意思即捕蝇草&#xff0c;是否形容蜜罐很形象&#xff1f;dionaea是nepenthes&#xff08;猪笼草&#xff09;的发展和后续&#xff0c;更加容易被部署和…...

WP_Query 的所有参数及其讲解和实用案例

WP_Query 是 WordPress 提供的一个强大的查询工具&#xff0c;用于获取与当前页面或文章相关的内容。下面是 WP_Query 的所有参数及其讲解&#xff1a;author: 查询特定作者的文章。可以是作者 ID、作者登录名或作者昵称。实用案例&#xff1a;查询作者为 "John Smith&quo…...

100个网络运维工作者必须知道的小知识!(上)

1&#xff09;什么是链接&#xff1f; 链接是指两个设备之间的连接。它包括用于一个设备能够与另一个设备通信的电缆类型和协议。 2&#xff09;OSI参考模型的层次是什么&#xff1f; 有7个OSI层&#xff1a;物理层&#xff0c;数据链路层&#xff0c;网络层&#xff0c;传输…...

Python如何获取大量电影影评,做可视化演示

前言 《保你平安》今天上映诶&#xff0c;有朋友看过吗&#xff0c;咋样啊 这是我最近比较想看的电影了&#xff0c;不过不知道这影评怎么样&#xff0c;上周末的点映应该是有蛮多人看的吧&#xff0c;可以采集采集评论看过的朋友发出来的评论&#xff0c;分析分析 这周刚好…...