【IP101】图像特征提取技术:从传统方法到深度学习的完整指南
🌟 特征提取魔法指南
🎨 在图像处理的世界里,特征提取就像是寻找图像的"指纹",让我们能够识别和理解图像的独特性。让我们一起来探索这些神奇的特征提取术吧!
📚 目录
- 基础概念 - 特征的"体检"
- Harris角点 - 图像的"关节"
- SIFT特征 - 图像的"全身体检"
- SURF特征 - 图像的"快速体检"
- ORB特征 - 图像的"经济体检"
- 特征匹配 - 图像的"认亲"
- 性能优化 - "体检"的加速器
- 实战应用 - "体检"的实践
1. 什么是特征提取?
特征提取就像是给图像做"体检",主要目的是:
- 🔍 发现图像中的关键信息
- 🎯 提取有意义的特征
- 🛠️ 降低数据维度
- 📊 提高识别效率
常见的特征包括:
- 角点特征(图像的"关节")
- SIFT特征(图像的"指纹")
- SURF特征(图像的"快速指纹")
- ORB特征(图像的"经济指纹")
2. Harris角点检测
2.1 基本原理
角点检测就像是寻找图像中的"关节",这些点通常具有以下特点:
- 在两个方向上都有明显变化
- 对旋转和光照变化不敏感
- 具有局部唯一性
数学表达式:
Harris角点检测的响应函数:
R = det ( M ) − k ⋅ trace ( M ) 2 R = \det(M) - k \cdot \text{trace}(M)^2 R=det(M)−k⋅trace(M)2
其中:
- M M M 是自相关矩阵
- k k k 是经验常数(通常取0.04-0.06)
- det ( M ) \det(M) det(M) 是矩阵的行列式
- trace ( M ) \text{trace}(M) trace(M) 是矩阵的迹
2.2 手动实现
C++实现
void harris_corner_detection(const Mat& src, Mat& dst,double k = 0.04, int blockSize = 3) {CV_Assert(!src.empty() && src.channels() == 1);// 计算梯度Mat dx, dy;Sobel(src, dx, CV_32F, 1, 0, 3);Sobel(src, dy, CV_32F, 0, 1, 3);// 计算自相关矩阵的元素Mat dx2 = dx.mul(dx);Mat dy2 = dy.mul(dy);Mat dxdy = dx.mul(dy);// 计算响应函数dst.create(src.size(), CV_32F);for (int y = 0; y < src.rows; y++) {for (int x = 0; x < src.cols; x++) {float a = 0, b = 0, c = 0;for (int i = -blockSize/2; i <= blockSize/2; i++) {for (int j = -blockSize/2; j <= blockSize/2; j++) {int ny = y + i;int nx = x + j;if (ny >= 0 && ny < src.rows && nx >= 0 && nx < src.cols) {a += dx2.at<float>(ny, nx);b += dxdy.at<float>(ny, nx);c += dy2.at<float>(ny, nx);}}}float det = a * c - b * b;float trace = a + c;dst.at<float>(y, x) = det - k * trace * trace;}}
}
Python实现
def harris_corner_detection_manual(image, k=0.04, block_size=3):"""手动实现Harris角点检测参数:image: 输入灰度图像k: Harris角点检测参数block_size: 邻域大小"""if len(image.shape) == 3:gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)else:gray = image.copy()// 计算梯度dx = cv2.Sobel(gray, cv2.CV_32F, 1, 0, ksize=3)dy = cv2.Sobel(gray, cv2.CV_32F, 0, 1, ksize=3)// 计算自相关矩阵的元素dx2 = dx * dxdy2 = dy * dydxdy = dx * dy// 计算响应函数height, width = gray.shaperesponse = np.zeros((height, width), dtype=np.float32)offset = block_size // 2for y in range(offset, height - offset):for x in range(offset, width - offset):// 计算局部窗口内的自相关矩阵a = np.sum(dx2[y-offset:y+offset+1, x-offset:x+offset+1])b = np.sum(dxdy[y-offset:y+offset+1, x-offset:x+offset+1])c = np.sum(dy2[y-offset:y+offset+1, x-offset:x+offset+1])// 计算响应值det = a * c - b * btrace = a + cresponse[y, x] = det - k * trace * tracereturn response
3. SIFT特征
3.1 基本原理
SIFT(Scale-Invariant Feature Transform)就像是图像的"全身体检",不管图像怎么变化(旋转、缩放),都能找到稳定的特征点。
主要步骤:
-
尺度空间构建(多角度检查):
L ( x , y , σ ) = G ( x , y , σ ) ∗ I ( x , y ) L(x,y,\sigma) = G(x,y,\sigma) * I(x,y) L(x,y,σ)=G(x,y,σ)∗I(x,y)
其中:- G ( x , y , σ ) G(x,y,\sigma) G(x,y,σ) 是高斯核
- I ( x , y ) I(x,y) I(x,y) 是输入图像
- σ \sigma σ 是尺度参数
-
关键点定位(找到重点):
D ( x , y , σ ) = L ( x , y , k σ ) − L ( x , y , σ ) D(x,y,\sigma) = L(x,y,k\sigma) - L(x,y,\sigma) D(x,y,σ)=L(x,y,kσ)−L(x,y,σ) -
方向分配(确定朝向):
- 计算梯度方向直方图
- 选择主方向
3.2 手动实现
C++实现
void sift_features(const Mat& src, vector<KeyPoint>& keypoints,Mat& descriptors, int nfeatures = 0) {CV_Assert(!src.empty());// 构建高斯金字塔vector<Mat> gaussian_pyramid;buildGaussianPyramid(src, gaussian_pyramid, 4);// 构建DOG金字塔vector<Mat> dog_pyramid;buildDoGPyramid(gaussian_pyramid, dog_pyramid);// 检测关键点detectKeypoints(dog_pyramid, keypoints);// 计算描述子computeDescriptors(gaussian_pyramid, keypoints, descriptors);
}void buildGaussianPyramid(const Mat& src, vector<Mat>& pyramid, int nOctaves) {// ... 实现代码 ...
}void buildDoGPyramid(const vector<Mat>& gaussian_pyramid,vector<Mat>& dog_pyramid) {// ... 实现代码 ...
}void detectKeypoints(const vector<Mat>& dog_pyramid,vector<KeyPoint>& keypoints) {// ... 实现代码 ...
}void computeDescriptors(const vector<Mat>& gaussian_pyramid,const vector<KeyPoint>& keypoints,Mat& descriptors) {// ... 实现代码 ...
}
Python实现
def sift_features_manual(image, n_features=0):"""手动实现SIFT特征提取参数:image: 输入图像n_features: 期望的特征点数量,0表示不限制"""if len(image.shape) == 3:gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)else:gray = image.copy()# 构建高斯金字塔gaussian_pyramid = build_gaussian_pyramid(gray, n_octaves=4)# 构建DOG金字塔dog_pyramid = build_dog_pyramid(gaussian_pyramid)# 检测关键点keypoints = detect_keypoints(dog_pyramid)# 计算描述子descriptors = compute_descriptors(gaussian_pyramid, keypoints)return keypoints, descriptorsdef build_gaussian_pyramid(image, n_octaves):"""构建高斯金字塔"""# ... 实现代码 ...passdef build_dog_pyramid(gaussian_pyramid):"""构建DOG金字塔"""# ... 实现代码 ...passdef detect_keypoints(dog_pyramid):"""检测关键点"""# ... 实现代码 ...passdef compute_descriptors(gaussian_pyramid, keypoints):"""计算描述子"""# ... 实现代码 ...pass
4. SURF特征
4.1 基本原理
SURF(Speeded-Up Robust Features)就像是SIFT的"快速体检版",用积分图像和盒子滤波器加速计算。
核心思想:
H ( x , y ) = D x x ( x , y ) D y y ( x , y ) − ( D x y ( x , y ) ) 2 H(x,y) = D_{xx}(x,y)D_{yy}(x,y) - (D_{xy}(x,y))^2 H(x,y)=Dxx(x,y)Dyy(x,y)−(Dxy(x,y))2
其中:
- D x x D_{xx} Dxx 是x方向二阶导
- D y y D_{yy} Dyy 是y方向二阶导
- D x y D_{xy} Dxy 是xy方向二阶导
4.2 手动实现
C++实现
void surf_features(const Mat& src, vector<KeyPoint>& keypoints,Mat& descriptors, int nfeatures = 0) {CV_Assert(!src.empty());// 计算积分图Mat integral;integral(src, integral, CV_32F);// 使用Hessian矩阵检测特征点detectSurfFeatures(integral, keypoints);// 计算描述子computeSurfDescriptors(integral, keypoints, descriptors);
}void detectSurfFeatures(const Mat& integral, vector<KeyPoint>& keypoints) {// ... 实现代码 ...
}void computeSurfDescriptors(const Mat& integral,const vector<KeyPoint>& keypoints,Mat& descriptors) {// ... 实现代码 ...
}
Python实现
def surf_features_manual(image, n_features=0):"""手动实现SURF特征提取参数:image: 输入图像n_features: 期望的特征点数量,0表示不限制"""if len(image.shape) == 3:gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)else:gray = image.copy()# 计算积分图integral = cv2.integral(gray.astype(np.float32))# 检测特征点keypoints = detect_surf_features(integral)# 计算描述子descriptors = compute_surf_descriptors(integral, keypoints)return keypoints, descriptorsdef detect_surf_features(integral):"""检测SURF特征点"""# ... 实现代码 ...passdef compute_surf_descriptors(integral, keypoints):"""计算SURF描述子"""# ... 实现代码 ...pass
5. ORB特征
5.1 基本原理
ORB(Oriented FAST and Rotated BRIEF)就像是"经济实惠型体检",速度快、效果好、还不要钱!
主要组成:
-
FAST角点检测:
- 检测像素圆周上的强度变化
- 快速筛选候选点
-
BRIEF描述子:
- 二进制描述子
- 汉明距离匹配
5.2 手动实现
C++实现
void orb_features(const Mat& src, vector<KeyPoint>& keypoints,Mat& descriptors, int nfeatures = 500) {CV_Assert(!src.empty());// FAST角点检测detectFASTFeatures(src, keypoints, nfeatures);// 计算方向computeOrientation(src, keypoints);// 计算rBRIEF描述子computeORBDescriptors(src, keypoints, descriptors);
}void detectFASTFeatures(const Mat& src, vector<KeyPoint>& keypoints,int nfeatures) {// ... 实现代码 ...
}void computeOrientation(const Mat& src, vector<KeyPoint>& keypoints) {// ... 实现代码 ...
}void computeORBDescriptors(const Mat& src,const vector<KeyPoint>& keypoints,Mat& descriptors) {// ... 实现代码 ...
}
Python实现
def orb_features_manual(image, n_features=500):"""手动实现ORB特征提取参数:image: 输入图像n_features: 期望的特征点数量"""if len(image.shape) == 3:gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)else:gray = image.copy()# FAST角点检测keypoints = detect_fast_features(gray, n_features)# 计算方向keypoints = compute_orientation(gray, keypoints)# 计算rBRIEF描述子descriptors = compute_orb_descriptors(gray, keypoints)return keypoints, descriptorsdef detect_fast_features(image, n_features):"""检测FAST角点"""# ... 实现代码 ...passdef compute_orientation(image, keypoints):"""计算特征点方向"""# ... 实现代码 ...passdef compute_orb_descriptors(image, keypoints):"""计算ORB描述子"""# ... 实现代码 ...pass
6. 特征匹配
6.1 基本原理
特征匹配就像是"认亲",通过比较特征描述子来找到对应的特征点。
匹配策略:
-
暴力匹配:
- 遍历所有可能
- 计算距离最小值
-
快速近似匹配:
- 构建搜索树
- 快速查找最近邻
6.2 手动实现
C++实现
void feature_matching(const Mat& src1, const Mat& src2,vector<DMatch>& matches,const vector<KeyPoint>& keypoints1,const vector<KeyPoint>& keypoints2,const Mat& descriptors1,const Mat& descriptors2) {matches.clear();// 暴力匹配for (int i = 0; i < descriptors1.rows; i++) {double minDist = DBL_MAX;int minIdx = -1;for (int j = 0; j < descriptors2.rows; j++) {double dist = 0;// 计算欧氏距离for (int k = 0; k < descriptors1.cols; k++) {double diff = descriptors1.at<float>(i,k) -descriptors2.at<float>(j,k);dist += diff * diff;}dist = sqrt(dist);if (dist < minDist) {minDist = dist;minIdx = j;}}if (minIdx >= 0) {DMatch match;match.queryIdx = i;match.trainIdx = minIdx;match.distance = minDist;matches.push_back(match);}}
}
Python实现
def feature_matching_manual(descriptors1, descriptors2, threshold=0.7):"""手动实现特征匹配参数:descriptors1: 第一幅图像的特征描述子descriptors2: 第二幅图像的特征描述子threshold: 匹配阈值"""matches = []# 暴力匹配for i in range(len(descriptors1)):dist = np.linalg.norm(descriptors2 - descriptors1[i], axis=1)idx1, idx2 = np.argsort(dist)[:2]# 比率测试if dist[idx1] < threshold * dist[idx2]:matches.append(cv2.DMatch(i, idx1, dist[idx1]))return matches
7. 代码实现与优化
7.1 性能优化技巧
- SIMD加速:
// 使用AVX2指令集加速特征计算
inline void compute_features_simd(const float* src, float* dst, int width) {alignas(32) float buffer[8];__m256 sum = _mm256_setzero_ps();for (int x = 0; x < width; x += 8) {__m256 data = _mm256_loadu_ps(src + x);sum = _mm256_add_ps(sum, data);}_mm256_store_ps(buffer, sum);*dst = buffer[0] + buffer[1] + buffer[2] + buffer[3] +buffer[4] + buffer[5] + buffer[6] + buffer[7];
}
- OpenMP并行化:
#pragma omp parallel for collapse(2)
for (int y = 0; y < src.rows; y++) {for (int x = 0; x < src.cols; x++) {// 处理每个像素}
}
- 内存优化:
// 使用连续内存访问
Mat temp = src.clone();
temp = temp.reshape(1, src.total());
8. 实验效果与应用
8.1 应用场景
-
图像配准:
- 医学图像对齐
- 遥感图像拼接
- 全景图像合成
-
目标识别:
- 人脸识别
- 物体检测
- 场景匹配
-
运动跟踪:
- 视频监控
- 手势识别
- 增强现实
8.2 注意事项
-
特征提取过程中的注意点:
- 选择合适的特征类型
- 考虑计算效率
- 注意特征的可区分性
-
算法选择建议:
- 根据应用场景选择
- 考虑实时性要求
- 权衡准确性和效率
总结
特征提取就像是给图像做"体检"!通过Harris角点检测、SIFT、SURF、ORB等"检查项目",我们可以发现图像中隐藏的"特征"。在实际应用中,需要根据具体场景选择合适的"检查方案",就像医生为每个病人制定个性化的体检计划一样。
记住:好的特征提取就像是一个经验丰富的"医生",既要发现关键特征,又要保持效率!🏥
参考资料
- Harris C, Stephens M. A combined corner and edge detector[C]. Alvey vision conference, 1988
- Lowe D G. Distinctive image features from scale-invariant keypoints[J]. IJCV, 2004
- Bay H, et al. SURF: Speeded Up Robust Features[C]. ECCV, 2006
- Rublee E, et al. ORB: An efficient alternative to SIFT or SURF[C]. ICCV, 2011
- OpenCV官方文档: https://docs.opencv.org/
- 更多资源: IP101项目主页
相关文章:
【IP101】图像特征提取技术:从传统方法到深度学习的完整指南
🌟 特征提取魔法指南 🎨 在图像处理的世界里,特征提取就像是寻找图像的"指纹",让我们能够识别和理解图像的独特性。让我们一起来探索这些神奇的特征提取术吧! 📚 目录 基础概念 - 特征的"体…...
对windows的简单介绍
目录 一、Windows 操作系统概述 1. 定义与定位 2. 核心目标 二、历史与版本演变 1. 早期阶段(1985–1995) 2. NT 内核时代(1996–2009) 3. 现代操作系统(2012–至今) 三、系统架构与技术特性 1. 内…...
Waymo公司正在加快其位于亚利桑那州新工厂的无人驾驶出租车(robotaxi)生产进度
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
JavaSE核心知识点01基础语法01-03(流程控制:顺序、分支、循环)
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 JavaSE核心知识点01基础语法01-03࿰…...
信息论01:从通信到理论的飞跃
信息论01:从通信到理论的飞跃 1. 信息论的诞生与发展 1.1 前信息论时代(1920s之前) 信息与消息的混淆:传统认知中将信息等同于消息本身先驱者奠基: 哈里奈奎斯特 (1924):提出《影响电报速度的某些因素》…...
Pandas 的透视与逆透视
目录 1. 透视 1.1 pivot 1.2 pivot_table 2.逆透视 1. 透视 透视是长表变宽表。 pivot() 和 pivot_table()两个函数都可以做到,后者可以聚合前者不行。 特性df.pivot()df.pivot_table()重复值处理要求索引和列的组合唯一,否则报错 ValueError允许…...
AI大模型驱动的智能座舱研发体系重构
随着AI大模型(如LLM、多模态模型)的快速发展,传统智能座舱研发流程面临巨大挑战。传统座舱研发以需求驱动、功能固定、架构封闭为特点,而AI大模型的引入使得座舱系统向自主决策、动态适应、持续进化的方向发展。 因此思考并提出一…...
【东枫科技】代理英伟达产品:DPU
NVIDIA BlueField-3 DPU 400Gb/s 基础设施计算平台 NVIDIA BlueField -3 数据处理单元 (DPU) 是第三代基础设施计算平台,使企业能够构建从云端到核心数据中心再到边缘的软件定义、硬件加速的 IT 基础设施。借助 400Gb/s 以太网或 NDR 400Gb/s InfiniBand 网络连接…...
【KWDB 创作者计划】一文掌握KWDB的时序表管理
前言 本文是在对时序数据库有一定了解,并且KWDB的数据库操作了解后进行学习的文章安排,如果对时序数据库与KWDB的数据库操作还不怎么了解的可以查阅官网的文档进行提前学习,当有了这些基础后,本文就是对时序数据表的一个管理操作…...
《算法导论(第4版)》阅读笔记:p9-p9
《算法导论(第4版)》学习第 6 天,p9-p9 总结,总计 1 页。 一、技术总结 1. data structure A data structure is a way to store and organize data in order to facilitate access and modifications(数据结构是一种存储和组织数据的方式,…...
Facebook隐私保护措施的优缺点解析
在这个数字化的时代,隐私保护已成为公众关注的热点话题。Facebook,作为全球最大的社交媒体平台之一,其隐私保护措施自然也受到了广泛的关注和讨论。本文将对Facebook的隐私保护措施进行解析,探讨其优点与缺点,并探讨如…...
深入了解linux系统—— 进程地址空间
前言 程序地址空间 在之前,我们学习C/C时,多多少少都看过这样的一张图 我们现在通过下面这一段代码看一下: #include <stdio.h> #include <unistd.h> #include <stdlib.h> int g_unval; int g_val 100; int main(int…...
电动加长杆金属硬密封法兰式蝶阀泄漏等级解析:水、蒸汽、油品介质的可靠选择-耀圣
电动加长杆金属硬密封法兰式蝶阀泄漏等级解析:水、蒸汽、油品介质的可靠选择 在工业流体控制领域,电动金属硬密封蝶阀凭借其卓越的密封性能和耐高温高压特性,成为水、蒸汽、油品等介质的核心控制设备。其泄漏等级作为衡量阀门性能的关键指标…...
win11共享打印机主机设置
1.首先打开设置,选择打印机和扫描仪点击打印机属性,将共享窗口的共享这台打印机和在客户端计算机上呈现打印作业这两项勾选上。 2.通过cmd命令 gpedit.msc 打开本地组策略编辑器。 3.网络访问选择仅来宾 4.将账户来宾状态选择启用 5.将拒绝从网络访问这台…...
Flowable7.x学习笔记(二十)查看流程办理进度图
前言 本文是基于继承Flowable的【DefaultProcessDiagramCanvas】和【DefaultProcessDiagramGenerator】实现的自定义流程图生成器,通过自定义流程图生成器可以灵活的指定已经执行过的节点和当前正在活跃的节点样式,比如说已经执行完成的节点我们标绿&…...
【计算机网络 第8版】谢希仁编著 第四章网络层 地址类题型总结
小结 个人觉得地址类在网络层算好做的题,这部分知识本身并不多,理解到位了就是2进制和10进制的换算题了。而且这种题给你一小时例题和标答,肯定自己都能悟出来。但是计网网络层的整体我感觉很散,老师讲的也乱七八糟的,…...
一种基于条件生成对抗网络(cGAN)的CT重建算法
简介 简介:该文提出了一种基于条件生成对抗网络(cGAN)的CT重建算法,通过引入CBAM注意力机制增强网络对关键特征的提取能力,有效解决了CT成像中因噪声干扰导致的重建精度下降问题。实验采用固体火箭发动机模拟件数据集,将正弦图分为五组并添加不同程度的噪声进行训练。结…...
欧拉系统(openEuler)上部署OpenStack的完整指南 ——基于Yoga版本的全流程实践
(资源区里有上传的配置好的openstack镜像) 一、环境规划与前置准备 1. 硬件与节点规划升级 存储节点(可选):若需Cinder后端,建议配置SSDHDD混合存储网络拓扑强化: 管理网络:启用V…...
oceanbase不兼容SqlSugarCore的问题
问题发现 C#程序使用SqlSugarCore5.1.4.166进行数据库操作,而且项目需要在多台服务器上面部署,结果发现A服务器部署运行没有问题, B服务器部署却报错:SqlSugar.SqlSugarException:Connect timeout expired. 但是我们的C#代码是一…...
深入理解分布式锁——以Redis为例
一、分布式锁简介 1、什么是分布式锁 分布式锁是一种在分布式系统环境下,通过多个节点对共享资源进行访问控制的一种同步机制。它的主要目的是防止多个节点同时操作同一份数据,从而避免数据的不一致性。 线程锁: 也被称为互斥锁(…...
OrangePi Zero 3学习笔记(Android篇)1 - 搭建环境
目录 1. 下载安装Ubuntu22.04 1.1 安装增强功能 1.2 设置共享文件夹 1.3 创建AOSP.vdi 1.4 更新相关软件包 2. 解压AOSP源代码 3. 编译代码 3.1 编译uboot/Linux 3.2 编译AOSP源代码 3.3 内存问题调试记录 3.3.1 查看具体什么问题 3.3.2 关闭dex2oat(无…...
RabbitMq(尚硅谷)
RabbitMq 1.RabbitMq异步调用 2.work模型 3.Fanout交换机(广播模式) 4.Diret交换机(直连) 5.Topic交换机(主题交换机,通过路由匹配) 6.Headers交换机(头交换机) 6…...
OpenAI的“四面楚歌”:从营利到非营利,一场关于AGI控制权的革命
引言 当“奥特曼妥协”与“四面楚歌”并置时,OpenAI的这次重大调整,仿佛在科技史上投下一颗震撼弹。这家曾因“拒绝盈利”而备受争议的人工智能公司,如今却在资本与理想之间艰难抉择——放弃营利性转型,回归非营利初心。这不仅是对…...
[250505] Arch Linux 正式登陆 Linux 的 Windows 子系统
目录 Arch Linux 正式登陆 Windows Subsystem for Linux (WSL) Arch Linux 正式登陆 Windows Subsystem for Linux (WSL) Arch Linux 社区与 Microsoft 合作,正式宣布 Arch Linux 现已提供官方的 Windows Subsystem for Linux (WSL) 镜像。这意味着 Windows 用户现…...
MySQL 日期格式化:DATE_FORMAT 函数用法
MySQL 日期格式化:DATE_FORMAT 函数用法 在 MySQL 中,DATE_FORMAT() 函数用于将日期或时间值格式化为指定的字符串格式。 正确语法 DATE_FORMAT(date, format)常用格式说明符 说明符描述%Y四位数的年份(例如:2023)…...
java springboot解析出一个图片的多个二维码
引入 <dependencies><!-- ZXing --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.4.1</version></dependency><dependency><groupId>com.google.zxing…...
【四川省专升本计算机基础】第一章 计算机基础知识(上)
前言 对计算机专业的同学来说这门课程可能很简单,容易拿高分(125分以上),但也可能很容易大意丢分。因为本门课程人称:背多分。大意丢分者的心态觉得计算机基础都学过,内容很简单,最后才开始背计…...
406错误,WARN 33820 --- [generator] [nio-8080-exec-4] .w.s.m.s.DefaultHa
在接口调用过程中,后端出现.w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpMediaTypeNotAcceptableException: No acceptable representation]错误。检查了一个小时才发现我返回的对象没有写getter方法, 当Spring B…...
基于STM32、HAL库的SST26VF064B NOR FLASH存储器驱动应用程序设计
一、简介: SST26VF064B是Microchip公司生产的一款64Mbit(8MB)串行闪存器件,采用SPI接口通信,具有以下特点: 工作电压:2.7-3.6V 最高104MHz时钟频率 统一4KB扇区结构 快速擦除和编程时间 低功耗特性 支持标准SPI、Dual SPI和Quad SPI模式 二、硬件接口: STM32L4引脚SST26V…...
美信监控易:全栈式自主可控的底层架构优势
在当今数字化时代,企业的运维管理面临着越来越多的挑战。为了确保业务的稳定运行,企业需要一款高效、可靠的运维管理软件。北京美信时代的美信监控易运维管理软件,以其全栈式自主可控的底层架构优势,成为了运维团队的理想选择。 …...
Class AB OPA corner 仿真,有些corenr相位从0开始
Class AB OPA做 STB 仿真时,会遇到有些corner(c0_0、c0_4、c0_5)相位从0开始的情况。 首先应该去检查电路,电路里是否有正反馈;排除没有正反馈后,考虑是图中的红框中的线性跨导环中的Vds 太大导致了碰撞电离导致的。 查找了网上…...
【JEECG】BasicTable单元格编辑,插槽添加下拉组件样式错位
1.功能说明 BasicTable表格利用插槽,添加组件实现单元格编辑功能,选择组件下拉框错位 2.效果展示 3.解决方案 插槽内组件增加::getPopupContainer"getPopupContainer" <template #salesOrderProductStatus"{ column, re…...
第十五届蓝桥杯单片机国赛-串口解析
串口通信像是蓝桥杯单片机组国赛中一个若隐若现的秘境,总在不经意间为勇者们敞开大门。然而,初次探索这片领域的冒险者,常常会被其神秘莫测的特性所震慑,黯然退场(编不下去了,直接进入正题)。 附…...
Flutter开发HarmonyOS实战-鸿蒙App商业项目
Flutter开发HarmonyOS实战内容介绍: Flutter开发HarmonyOS 鸿蒙App商业项目(小米商城APP)实战视频教程 Flutter开发鸿蒙APP是在《FlutterGetx仿小米商城》项目基础之上讲解的,调试Flutter HarmonyOS应用需要有HarmonyOS Next的手机…...
【回眸】香橙派Zero2 超声波模块测距控制SG90舵机转动
前言 知识准备 超声波模块时序图 gettimeofday()函数作用 gettimeofday()函数原型 tv结构体 获取当前系统时间与格林威治时间的时间差 获取香橙派数10万秒花费的时间 使用超声波模块获取到障碍物距离 SG90舵机模块 舵机模块的作用 舵机模块方波时序图 舵机模块工作原…...
RabbitMQ 添加新用户和配置权限
以下是关于使用 sudo rabbitmqctl add_user 命令创建新用户的详细示例,同时包含创建用户后进行权限设置、角色设置等相关操作的示例。 1. 前提条件 确保你的 RabbitMQ 服务已经正常运行,并且你具有执行 sudo 命令的权限。 2. 创建新用户 假设我们要创…...
【前缀和】矩阵区域和
文章目录 1314. 矩阵区域和解题思路1314. 矩阵区域和 1314. 矩阵区域和 给你一个 m x n 的矩阵 mat 和一个整数 k ,请你返回一个矩阵 answer ,其中每个 answer[i][j] 是所有满足下述条件的元素 mat[r][c] 的和: i - k <= r <= i + k, j - k <= c <= j + k …...
编程日志4.25
栈的stl模板 可直接用<stack>库进行调用 #include<iostream> #include<stack>//栈的模板库 using namespace std; int main() { stack<int> intStk;//整数 栈 stack<double> doubleStk;//浮点数 栈 intStk.push(1); intStk.pu…...
【中间件】brpc之工作窃取队列
文章目录 BRPC Work Stealing Queue1 核心功能2 关键数据结构2.1 队列结构2.2 内存布局优化 3 核心操作3.1 本地线程操作(非线程安全)3.2 窃取操作(线程安全) 4 设计亮点4.1 无锁原子操作4.2 环形缓冲区优化4.3 线程角色分离 5 性…...
用OMS从MySQL迁移到OceanBase,字符集utf8与utf8mb4的差异
一、问题背景 在一次从MySQL数据库迁移到OceanBase的MySQL租户过程中,出现了一个转换提示: [WARN][CONVER] he table charset:utf8->utf8mb4, 你可能会担心这种转换可能导致字符集不兼容的问题。但通过查阅相关资料可知,utf8m…...
知乎前端面试题及参考答案
Webpack 和 Vite 的区别是什么? 构建原理: Webpack 是基于传统的打包方式,它会将所有的模块依赖进行分析,然后打包成一个或多个 bundle。在开发过程中,当代码发生变化时,需要重新构建整个项目,构建速度会随着项目规模的增大而变慢。Vite 利用了浏览器对 ES 模块的支持,…...
项目中为什么选择RabbitMQ
当被问及为什么选择某种技术时,应该结合开发中的实际情况以及类似的技术进行分析,适合的技术才是最好的。 在项目中为什么选择RabbitMQ 作为消息中间件,主要可以基于以下几方面进行分析: 1. 可靠性 消息持久化:Rabbi…...
深入解析二维矩阵搜索:LeetCode 74与240题的两种高效解法对比
文章目录 [toc]**引言** **一、问题背景与排序规则对比****1. LeetCode 74. 搜索二维矩阵****2. LeetCode 240. 搜索二维矩阵 II** **二、核心解法对比****方法1:二分查找法(适用于LeetCode 74)****方法2:线性缩小搜索范围法&…...
Qt案例 以单线程或者单生产者多消费者设计模式实现QFTP模块上传文件夹功能
前文:Qt案例 使用QFtpServerLib开源库实现Qt软件搭建FTP服务器,使用QFTP模块访问FTP服务器 已经介绍了Qt环境下搭建FTP服务器或者使用QFTP上传的方式示例, 这里主要介绍下使用QFTP模块上传整个文件夹的案例示例。 目录导读 前因后果单线程处理1.定义FTPFolderUpload 继承 QT…...
含锡废水回收率提升技术方案
一、预处理环节优化 物理分离强化 采用双层格栅系统(孔径1mm0.5mm)拦截悬浮物,配套旋流分离器去除密度>2.6g/cm的金属颗粒,使悬浮物去除率提升至85%。增设pH值智能调节模块,通过在线pH计联动碳酸钠/氢氧化钠投加系…...
第八章,STP(生成树协议)
广播风暴----广播帧在二层环路中形成逆时针或顺时针的转动的环路,并且无限循环,最终导致设备宕机,网络瘫痪。 MAC地址表的翻摆(漂移)----同一个数据帧,顺时针接收后将记录MAC地址及接口的对应信息ÿ…...
《面向对象程序设计-C++》实验五 虚函数的使用及抽象类
程序片段编程题 1.【问题描述】 基类shape类是一个表示形状的抽象类,area( )为求图形面积的函数。请从shape类派生三角形类(triangle)、圆类(circles)、并给出具体的求面积函数。注:圆周率取3.14 #include<iostream> #in…...
PCIe - ZCU106(RC) + KU5P(EP) + 固化
目录 1. 简介 1.1 Data Mover 1.2 描述符 2. ZCU102 2.1 Ubuntu OS 2.2 USB Host 2.2.1 连接拓扑 2.2.2 设备类型 2.2.3 USB 跳帽设置 2.3 无线网卡 2.4 PCIe Info 2.4.1 Diagram 2.4.2 lspci -tv 2.4.3 lspci -v 2.4.2.1 设备基本信息 2.4.2.2 控制与状态寄存…...
网络编程核心技术解析:从Socket基础到实战开发
网络编程核心技术解析:从Socket基础到实战开发 一、Socket编程核心基础 1. 主机字节序与网络字节序:数据传输的统一语言 在计算机系统中,不同架构对多字节数据的存储顺序存在差异,而网络通信需要统一的字节序标准,这…...
SQL注入总结
一.sql注入 原理:当一个网站存在与用户交互的功能(如登录表单、搜索框、评论区等),并且用户输入的数据未经充分过滤或转义,直接拼接到后台数据库查询语句中执行时,就可能引发SQL注入漏洞。攻击者可以通过构…...