(数字图像处理MATLAB+Python)第十一章图像描述与分析-第一节、二节:图像描述概述和特征点
文章目录
- 一:图像描述概述
- (1)图像描述
- (2)描述子
- 二:特征点
- (1)Moravec角点检测
- A:原理
- B:程序
- (2)Harris角点检测
- A:原理
- B:程序
- (3)SUSAN角点检测
- A:原理
- B:程序
一:图像描述概述
(1)图像描述
图像描述:将分割后区域的区域、边界的属性和相互关系用更为简单明确的文字、数值、符号或图来描述或说明。保留原图像或图像区域重要信息,减少数据量。它旨在通过自然语言来准确地描述图像中出现的对象、场景和其他相关信息。图像描述一般由计算机视觉和自然语言处理领域共同完成。图像描述的主要目标是使计算机能够理解和表达对图像的理解,将视觉信息转化为可读性强的文本描述。这项技术对于提高图像的可搜索性和可索引性非常有用,也可以帮助视觉障碍者理解图像内容

图像描述技术的应用非常广泛。例如,在社交媒体平台上,可以通过图像描述实现自动标签生成,提高图像搜索的效果。此外,还可以应用于辅助无障碍技术、智能推荐系统等领域,为用户提供更好的体验和服务
(2)描述子
描述子:是计算机视觉领域中用于表示图像或图像中的特征的一种数值化描述方法。它提取图像中的关键信息,并将其转化为可以进行比较和匹配的向量或特征向量。描述子在图像处理和计算机视觉任务中起着重要作用,如图像检索、目标识别、图像匹配等。通过使用描述子,可以将复杂的图像数据转换成紧凑且可度量的向量形式,从而方便进行图像之间的相似性计算和比较。常见的描述子包括
- SIFT
- SURF
- ORB
描述子应具有以下特点
- 唯一性
- 几何变换不变性
- 完整性
- 敏感性
- 抽象性
描述子的生成通常涉及到特征提取算法,这些算法会在图像中寻找图像的局部特征,并将其转换为具有良好鲁棒性和区分性的描述子。这些描述子通常具有以下特点:对尺度、旋转和光照变化具有一定的不变性;在不同图像中相同物体的描述子能够相互匹配;不同物体的描述子能够有较大的差异性描述子在计算机视觉领域中被广泛应用,它们为图像处理和分析提供了有效的工具,可以实现图像特征的提取、匹配和识别等任务
二:特征点
特征点:也称为关键点(Key Points)或兴趣点(Interest Points),是图像中具有显著性、独特性和稳定性的位置或区域。它们在图像中代表了一些突出的结构、边缘或纹理信息。如线条交叉点、边界封闭区域的重心,或者曲面的高点等;也可以没有实际的直观视觉意义,但在某种角度、某个尺度上含有丰富的易于匹配的信息。特征点具有以下特点
- 显著性:特征点应该在图像中相对其他区域更加明显和突出,能够吸引注意力。
- 独特性:特征点应该具有较高的不变性,能够在不同的图像中准确地找到对应的特征点。
- 稳定性:特征点应该对于尺度、旋转、仿射变换等图像变化具有一定程度的稳定性
特征点在影像匹配、图像拼接、运动估计以及形状描述等诸多方面都具有重要作用。特征点通常由特征检测算法自动提取,这些算法可以根据图像的局部特征属性来确定特征点的位置和尺度。常见的特征点检测算法包括Harris角点检测、SIFT(Scale-Invariant Feature Transform)、SURF(Speeded-Up Robust Features)等
角点是特征点中最主要的一类,由景物曲率较大地方的两条或多条边缘的交点所形成,比如线段的末端、轮廓的拐角等
(1)Moravec角点检测
A:原理
Moravec角点检测:是一种经典的图像特征检测算法,用于检测图像中的角点。Moravec角点检测算法基于角点的一个重要特性:在角点处,图像在各个方向上的微小平移都会引起较大的灰度变化。算法通过滑动窗口在图像中的每个像素位置上进行操作,计算不同方向上窗口内的灰度差异来确定是否存在角点,具体步骤如下
- 对于图像中的每个像素位置,定义一个小的窗口
- 分别在水平、垂直和对角线方向上对窗口进行平移,并计算平移后窗口与原窗口之间的灰度差异
- 对于每个平移方向,计算灰度差异的总和或平均值,作为该窗口位置上的角点响应值
- 针对所有像素位置,根据角点响应值进行阈值处理或非极大值抑制,筛选出最显著的角点
Moravec角点检测算法的优点是简单、快速,适用于实时应用和计算资源受限的场景。然而,它对于尺度变化、噪声和旋转等因素比较敏感,并且可能会产生大量的冗余角点。因此,后续的改进算法如Harris角点检测算法等被提出,以提高角点检测的稳定性和鲁棒性。另外
- 当固定窗口在平坦区域时,灰度比较均匀,4个方向的灰度变化值都很小
- 在边缘处,沿边缘方向的灰度变化值很小,沿垂直边缘方向的灰度变化值比较大
- 当窗口在角点或独立点上的时候,沿各个方向的灰度变化值都比较大
- 因此,若某窗口内各个方向变化的最小值大于某个阈值,说明各方向的变化都比较大,则该窗口所在即为角点所在
B:程序
如下

matlab实现:
clear,clc,close all;
% image=im2double(rgb2gray(imread('bricks.jpg')));
% image= im2double(rgb2gray(imread('bricksrotate.jpg')));image= im2double(rgb2gray(imread('testrotate.bmp')));
figure,imshow(image),title('Ôͼ');
[N,M]=size(image);
radius=3;
CRF=zeros(N,M);
for i=radius+1:M-radiusfor j=radius+1:N-radiusv=zeros(4,1);for m=-radius:radius-1v(1)=v(1)+(image(j,i+m)-image(j,i+m+1))^2;v(2)=v(2)+(image(j+m,i)-image(j+m+1,i))^2;v(3)=v(3)+(image(j+m,i+m)-image(j+m+1,i+m+1))^2;v(4)=v(4)+(image(j+m,i-m)-image(j+m+1,i-m-1))^2;endCRF(j,i)=min(v(:));end
end
thresh=0.08;
for i=radius+1:M-radiusfor j=radius+1:N-radius temp=CRF(j-radius:j+radius,i-radius:i+radius);if CRF(j,i)>thresh && CRF(j,i)==max(temp(:))for m=-radius:radiusimage(j+m,i+m)=0;image(j-m,i+m)=0; endend end
end
figure,imshow(image),title('Moravec½¹µã¼ì²â');
imwrite(image,'Moravetestrotate.jpg');
python实现:
import numpy as np
import cv2
import matplotlib.pyplot as plt# Load and convert the image to grayscale
image = cv2.imread('testrotate.bmp')
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
image = image.astype(np.float32)# Display the original image
plt.imshow(image, cmap='gray')
plt.title('Original Image')
plt.show()N, M = image.shape
radius = 3
CRF = np.zeros((N, M))# Calculate the Corner Response Function (CRF)
for i in range(radius, M-radius):for j in range(radius, N-radius):v = np.zeros(4)for m in range(-radius, radius):v[0] += (image[j, i+m] - image[j, i+m+1]) ** 2v[1] += (image[j+m, i] - image[j+m+1, i]) ** 2v[2] += (image[j+m, i+m] - image[j+m+1, i+m+1]) ** 2v[3] += (image[j+m, i-m] - image[j+m+1, i-m-1]) ** 2CRF[j, i] = np.min(v)thresh = 0.08# Suppress non-maximum corners
for i in range(radius, M-radius):for j in range(radius, N-radius):temp = CRF[j-radius:j+radius, i-radius:i+radius]if CRF[j, i] > thresh and CRF[j, i] == np.max(temp):for m in range(-radius, radius+1):image[j+m, i+m] = 0image[j-m, i+m] = 0# Display the resulting image with suppressed corners
plt.imshow(image, cmap='gray')
plt.title('Moravec Corner Detection')
plt.show()# Save the resulting image
cv2.imwrite('Moravetestrotate.jpg', image)
(2)Harris角点检测
A:原理
Harris角点检测:是一种常用的图像特征检测算法,用于寻找图像中的角点。Harris角点检测算法基于以下假设:在角点处,图像在所有方向上进行微小平移时,灰度值会发生较大的变化。该算法通过计算图像局部区域的灰度值梯度来判断是否存在角点,并根据灰度值梯度的变化情况计算角点响应函数。具体步骤如下
- 对图像进行灰度处理(若原图不是灰度图)
- 计算每个像素位置上的梯度值,通常使用Sobel算子或其他梯度算子
- 根据梯度值计算自相关矩阵M,包括梯度的协方差矩阵
- 根据自相关矩阵M的特征值,计算角点响应函数R
- 根据设定的阈值,选取响应函数大于阈值的像素点作为角点
- 对于相邻的角点,进行非极大值抑制,保留具有最大响应的角点
Harris角点检测算法的优点是对于尺度变化、旋转和仿射变换等具有一定的不变性,并且能够检测到各种类型的角点。它在图像配准、目标跟踪、图像拼接等计算机视觉任务中得到广泛应用
B:程序
如下

matlab实现:
clear,clc,close all;
image= im2double(rgb2gray(imread('bricks.jpg')));
% image= im2double(rgb2gray(imread('bricksrotate.jpg')));
% image= im2double(rgb2gray(imread('testrotate.bmp')));
figure,imshow(image),title('原图');
[h,w]=size(image);
Hx = [-2 -1 0 1 2]; % x方向梯度算子(用于Harris角点提取算法)
fx = filter2(Hx,image); % x方向滤波
Hy = [-2;-1;0;1;2]; % y方向梯度算子(用于Harris角点提取算法)
fy = filter2(Hy,image); % y方向滤波
fx2 = fx.^2;
fy2 = fy.^2;
fxy = fx.*fy;
sigma=2;
Hg= fspecial('gaussian',[7 7],sigma);
fx2 = filter2(Hg,fx2);
fy2 = filter2(Hg,fy2);
fxy = filter2(Hg,fxy);
result = zeros(h,w);
R = zeros(h,w);
k=0.06;
for i = 1:w for j = 1:h M = [fx2(j,i) fxy(j,i);fxy(j,i) fy2(j,i)];detM = det(M); %求行列式traceM = trace(M); %求迹R(j,i) = detM-k*traceM^2; end
end
radius=3;
num=0;
for i = radius+1:w-radiusfor j = radius+1:h-radiustemp=R(j-radius:j+radius,i-radius:i+radius);if R(j,i)==max(temp(:))result(j,i)=1;num=num+1;end end
end
Rsort=zeros(num,1);
[posy, posx] = find(result == 1);
for i=1:numRsort(i)=R(posy(i),posx(i));
end
[Rsort,index]=sort(Rsort,'descend');
corner=24;
for i=1:cornery=posy(index(i)); x=posx(index(i)); for m=-radius:radiusimage(y+m,x+m)=0;image(y-m,x+m)=0; end
end
figure,imshow(image),title('Harris角点检测');
% imwrite(image,'Harristestrotate.jpg');
python实现:
import cv2
import numpy as np
import matplotlib.pyplot as plt# Load and convert the image to grayscale
image = cv2.imread('bricks.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
image = image.astype(np.float32) / 255.0# Display the original image
plt.imshow(image, cmap='gray')
plt.title('原图')
plt.show()h, w = image.shape
Hx = np.array([-2, -1, 0, 1, 2]) # x方向梯度算子(用于Harris角点提取算法)
fx = cv2.filter2D(image, -1, Hx) # x方向滤波
Hy = np.array([[-2], [-1], [0], [1], [2]]) # y方向梯度算子(用于Harris角点提取算法)
fy = cv2.filter2D(image, -1, Hy) # y方向滤波
fx2 = fx ** 2
fy2 = fy ** 2
fxy = fx * fy
sigma = 2
Hg = cv2.getGaussianKernel(7, sigma)
fx2 = cv2.filter2D(fx2, -1, Hg)
fy2 = cv2.filter2D(fy2, -1, Hg)
fxy = cv2.filter2D(fxy, -1, Hg)
result = np.zeros((h, w))
R = np.zeros((h, w))
k = 0.06for i in range(w):for j in range(h):M = np.array([[fx2[j, i], fxy[j, i]], [fxy[j, i], fy2[j, i]]])detM = np.linalg.det(M) # 求行列式traceM = np.trace(M) # 求迹R[j, i] = detM - k * traceM ** 2radius = 3
num = 0
for i in range(radius + 1, w - radius):for j in range(radius + 1, h - radius):temp = R[j - radius : j + radius, i - radius : i + radius]if R[j, i] == np.max(temp):result[j, i] = 1num += 1Rsort = np.zeros(num)
pos = np.where(result == 1)
for i in range(num):Rsort[i] = R[pos[0][i], pos[1][i]]index = np.argsort(Rsort)[::-1]
corner = 24for i in range(corner):y = pos[0][index[i]]x = pos[1][index[i]]for m in range(-radius, radius + 1):image[y + m, x + m] = 0image[y - m, x + m] = 0# Display the resulting image with detected corners
plt.imshow(image, cmap='gray')
plt.title('Harris角点检测')
plt.show()# Save the resulting image
cv2.imwrite('Harristestrotate.jpg', image * 255.0)
(3)SUSAN角点检测
A:原理
SUSAN角点检测:是一种常用的图像特征检测算法,用于寻找图像中的角点。SUSAN角点检测算法基于以下假设:在角点处,相邻像素的灰度值与中心像素的灰度值之间会存在明显的差异。该算法通过计算像素周围邻域内的灰度差异来判断是否存在角点,并根据邻域内像素的差异程度计算角点响应函数。具体步骤如下
- 对图像进行**灰度处理(**若原图不是灰度图)
- 选择一个合适的邻域大小(通常为37个像素点),以及一个阈值T,用于判断像素点是否为角点
- 遍历图像上的每个像素点
- 对于每个像素点,计算其周围邻域内像素与中心像素的灰度差异
- 计算灰度差异小于阈值T的像素数目
- 如果该数目小于某个预先设定的阈值K,则将该像素标记为角点
SUSAN角点检测算法的优点是对噪声和光照变化具有一定的鲁棒性,并且能够检测到各种类型的角点。它在图像配准、目标跟踪、特征提取等计算机视觉任务中得到广泛应用
B:程序
如下

matlab实现:
clear,clc,close all;
% image=im2double(rgb2gray(imread('bricks.jpg')));
% image= im2double(rgb2gray(imread('bricksrotate.jpg')));
% image= im2double(rgb2gray(imread('test.bmp')));
image= im2double(rgb2gray(imread('testrotate.bmp')));
figure,imshow(image),title('Ôͼ');
[N,M]=size(image);
templet=[0 0 1 1 1 0 0;0 1 1 1 1 1 0;1 1 1 1 1 1 1;1 1 1 1 1 1 1;1 1 1 1 1 1 1;0 1 1 1 1 1 0;0 0 1 1 1 0 0];
g=floor(sum(templet(:))/2-1);
R=zeros(N,M);
thresh=(max(image(:))-min(image(:)))/10;
radius=3;
for i=radius+1:M-radiusfor j=radius+1:N-radiuscount=0;usan=zeros(2*radius+1,2*radius+1);for m=-radius:radiusfor n=-radius:radiusif templet(radius+1+n,radius+1+m)==1 && abs(image(j,i)-image(j+n,i+m))<threshcount=count+1;usan(radius+1+n,radius+1+m)=1;end end end if count<g && count>5centerx=0;centery=0;totalgray=0;for m=-radius:radiusfor n=-radius:radiusif usan(radius+1+n,radius+1+m)==1 centerx=centerx+(i+m)*image(j+n,i+m);centery=centery+(j+n)*image(j+n,i+m);totalgray=totalgray+image(j+n,i+m);end end end centerx=centerx/totalgray;centery=centery/totalgray;dis=sqrt((i-centerx)^2+(j-centery)^2);if dis>radius*sqrt(2)/3R(j,i)=g-count;endendend
end
for i=radius+1:M-radiusfor j=radius+1:N-radius temp=R(j-radius:j+radius,i-radius:i+radius);if R(j,i)~=0 && R(j,i)==max(temp(:))for m=-radius:radiusimage(j+m,i+m)=0;image(j-m,i+m)=0;endend end
end
figure,imshow(image),title('SUSAN½Çµã¼ì²â');
imwrite(image,'Susantestrotate.jpg');
python实现:
import cv2
import numpy as np
import matplotlib.pyplot as plt# Load and convert the image to grayscale
image = cv2.imread('testrotate.bmp')
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
image = image.astype(np.float32) / 255.0# Display the original image
plt.imshow(image, cmap='gray')
plt.title('原图')
plt.show()N, M = image.shape
templet = np.array([[0, 0, 1, 1, 1, 0, 0],[0, 1, 1, 1, 1, 1, 0],[1, 1, 1, 1, 1, 1, 1],[1, 1, 1, 1, 1, 1, 1],[1, 1, 1, 1, 1, 1, 1],[0, 1, 1, 1, 1, 1, 0],[0, 0, 1, 1, 1, 0, 0]])
g = int(np.sum(templet) / 2 - 1)
R = np.zeros((N, M))
thresh = (np.max(image) - np.min(image)) / 10
radius = 3for i in range(radius + 1, M - radius):for j in range(radius + 1, N - radius):count = 0usan = np.zeros((2 * radius + 1, 2 * radius + 1))for m in range(-radius, radius):for n in range(-radius, radius):if templet[radius + 1 + n, radius + 1 + m] == 1 and abs(image[j, i] - image[j + n, i + m]) < thresh:count += 1usan[radius + 1 + n, radius + 1 + m] = 1if count < g and count > 5:centerx = 0centery = 0totalgray = 0for m in range(-radius, radius):for n in range(-radius, radius):if usan[radius + 1 + n, radius + 1 + m] == 1:centerx += (i + m) * image[j + n, i + m]centery += (j + n) * image[j + n, i + m]totalgray += image[j + n, i + m]centerx /= totalgraycentery /= totalgraydis = np.sqrt((i - centerx) ** 2 + (j - centery) ** 2)if dis > radius * np.sqrt(2) / 3:R[j, i] = g - countfor i in range(radius + 1, M - radius):for j in range(radius + 1, N - radius):temp = R[j - radius : j + radius, i - radius : i + radius]if R[j, i] != 0 and R[j, i] == np.max(temp):for m in range(-radius, radius):image[j + m, i + m] = 0image[j - m, i + m] = 0# Display the resulting image with detected corners
plt.imshow(image, cmap='gray')
plt.title('SUSAN角点检测')
plt.show()# Save the resulting image
cv2.imwrite('Susantestrotate.jpg', image * 255.0)相关文章:
(数字图像处理MATLAB+Python)第十一章图像描述与分析-第一节、二节:图像描述概述和特征点
文章目录 一:图像描述概述(1)图像描述(2)描述子 二:特征点(1)Moravec角点检测A:原理B:程序 (2)Harris角点检测A:原理B&…...
SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录(第五天)MyBatis的注解开发
SSM框架的学习与应用(Spring Spring MVC MyBatis)-Java EE企业级应用开发学习记录(第五天)MyBatis的注解开发 昨天我们深入学习了MyBatis多表之间的关联映射,了解掌握了一对一关联映射,一对多关联映射,嵌套查询方…...
VBA技术资料MF48:VBA_在Excel中将列号与字母转换
【分享成果,随喜正能量】除非自己的认知获得了改变和刷新,否则,人们常说的“顺应自己的内心”,顺的不过是一颗旧心,一颗惯性的,充满了各种习性的套路之心。与“顺应自己的内心”恰恰相反,人要用…...
LeetCode-160. 相交链表
这是一道真的非常巧妙的题,题解思路如下: 如果让他们尾端队齐,那么从后面遍历就会很快找到第一个相交的点。但是逆序很麻烦。 于是有一个巧妙的思路诞生了,如果让短的先走完自己的再走长的,长的走完走短的,…...
微信小程序如何实现页面传参和页面传递多个参数
前言 只要你的小程序超过一个页面那么可能会需要涉及到页面参数的传递,下面我总结了 4 种页面方法。 下面时多个参数页面传参的方式 let loveJSON.stringify(this.data.totle);let youJSON.stringify(this.data.totleId)let csdnJSON.stringify(this.data.totleP…...
ChatGPT⼊门到精通(3):ChatGPT 原理
OpenAI在2022年11⽉份发布ChatGPT,强⼤的⽂字对话、创意写作能⼒,全球掀起了⼀ 波AI浪潮。本⽂对ChatGPT的技术原理、厉害之处、可能的落地⽅向等⽅⾯进⾏了全⾯ 的解析,看完后会对ChatGPT有更深⼊的了解。 ⼀、前⾔ 2022年11⽉30⽇&#x…...
nginx配置keepalive长连接
nginx之keepalive详解与其配置_keepalive_timeout_恒者走天下的博客-CSDN博客 为什么要有keepalive? 因为每次建立tcp都要建立三次握手,消耗时间较长,所以为了减少tcp建立连接需要的时间,就可以设置keep_alive长连接。 nginx中keep_alive对…...
Thread.enumerate方法
Thread.enumerate方法的作用是将当前线程所对应的的线程组包含的所有线程放入一个数组 参见源码注释 /*** Copies into the specified array every active thread in the current* threads thread group and its subgroups. This method simply* invokes the {@link java.lan…...
* 号靠近数据类型,和靠近变量名, 号靠近数据类型,和靠近变量名,有什么区别
文章目录 一、int* age 和 int *age,* 号靠近数据类型,和靠近变量名,有什么区别:1. int* age:2. int *age: 二、int& age 和 int &age,& 号靠近数据类型,和靠近变量名,有什么区别&a…...
为了做好农业,拼多多请来顶尖农业专家当独立董事
8月29日,拼多多发布截至6月30日的2023年第二季度业绩报告。财报显示,拼多多集团今年第二季度收入为523亿元,同比增长66%,远超市场预期。 财报发布的同时,拼多多还宣布,其董事会已聘任荷兰瓦赫宁根大学终身…...
Linux服务器安装部署MongoDB数据库 – 【无公网IP远程连接】
文章目录 前言1.配置Mongodb源2.安装MongoDB数据库3.局域网连接测试4.安装cpolar内网穿透5.配置公网访问地址6.公网远程连接7.固定连接公网地址8.使用固定公网地址连接 前言 MongoDB是一个基于分布式文件存储的数据库。由 C 语言编写,旨在为 WEB 应用提供可扩展的高…...
Python+PIL+qrcode实现二维码自由—普通二维码+彩色二维码+logo二维码+动态二维码(附完整代码)
有时候我们需要自己制作一个二维码,然后进行打印下来,或者说在二维码中提前写上一段话比如搞笑的话,然后印在衣服上,然后穿出去玩!的🤣 那么今天我们分享一下制作二维码的几种方式: 哎&#x…...
【Spring Data JPA】JPA 常用查询函数
文章目录 前言函数查询表格 前言 函数查询的表格参考了官网的 2.7.3 版本的文档,JPA 的这种函数式查询方法改动不大,如果想知道更多的复杂查询,可以参考这篇文章 【Spring Data JPA】基于 JpaRepository 增删改查 官方文档地址 Spring Data…...
Visual Studio 2022的MFC框架——AfxWinMain全局对象和InitInstance函数
我是荔园微风,作为一名在IT界整整25年的老兵,今天我们来重新审视一下Visual Studio 2022下开发工具的MFC框架知识。 在看这篇帖子前,请先看我的另一篇帖子《Visual Studio 2022的MFC框架——应用程序向导》。 当程序调用了CWinApp类的构造…...
【网络】多路转接——poll | epoll
🐱作者:一只大喵咪1201 🐱专栏:《网络》 🔥格言:你只管努力,剩下的交给时间! 书接上文五种IO模型 | select。 poll | epoll 🍧poll🧁认识接口🧁简…...
音视频 ffmpeg命令视频录制(Windows)
先安装dshow软件 Screen Capturer Recorder, 项目地址:https://sourceforge.net/projects/screencapturer/files/ 然后查看可用设备名字:ffmpeg -list_devices true -f dshow -i dummy [dshow 0509d6c0] DirectShow video devices (some ma…...
【拾枝杂谈】从游戏开发的角度来谈谈原神4.0更新
君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 Hello,米娜桑们,这里是君兮_,结合最近的学习内容和以后自己的目标,今天又开了杂谈这个新坑,分享一下我在学习游戏开发的成长和自己的游戏理解,当然现在还是一枚…...
QT设置mainwindow的窗口title
QT设置mainwindow的窗口title 在QT程序中,通常会有**aaaa-[bbbbbbb]**这种形式的title,对于刚上手qt的程序员同学,可能会简单的以为修改这种title,就是使用setWindowTitle这个接口,其实只对了一半,这种形式…...
SaaS多租户系统架构设计
前言:多租户是SaaS(Software-as-a-Service)下的一个概念,意思为软件即服务,即通过网络提供软件服务。SaaS平台供应商将应用软件统一部署在自己的服务器上,客户可以根据工作的实际需求,通过互联网…...
Java自定义捕获异常
需求分析 ElectricalCustomerVO electricalCustomerVO new ElectricalCustomerVO(); electricalCustomerVO.setElcNumber(chatRecordsLog.getDeviceNumber()); List<ElectricalCustomerVO> electricalCustomerlist electricalCustomerMapper.selectElectricalCustomer…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
