(数字图像处理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…...
力扣--数组类题目27. 移除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 示例 1: 输入:nums [3,2,2,3], val 3 输出:2, nums [2,2] 解释:函数应该返回新的长度 2, 并且 n…...
实际并行workers数量不等于postgresql.conf中设置的max_parallel_workers_per_gather数量
1 前言 本文件的源码来自PostgreSQL 14.5,其它版本略有不同 PostgreSQL的并行workers是由compute_parallel_worker函数决定的,compute_parallel_worker是估算扫描所需的并行工作线程数,并不是您在postgresql.conf中设置的max_parallel_work…...
java定位问题工具
一、使用 JDK 自带工具查看 JVM 情况 在我的机器上运行 ls 命令,可以看到 JDK 8 提供了非常多的工具或程序: 接下来,我会与你介绍些常用的监控工具。你也可以先通过下面这张图了解下各种工具的基本作用: 为了测试这些工具&#x…...
【Java】基础入门 (十六)--- 异常
1.异常 1.1 异常概述 异常是指程序在运行过程中出现的非正常的情况,如用户输入错误、除数为零、文件不存在、数组下标越界等。由于异常情况再程序运行过程中是难以避免的,一个良好的应用程序除了满足基本功能要求外,还应具备预见并处理可能发…...
[javaWeb]Socket网络编程
网络编程:写一个应用程序,让这个程序可以使用网络通信。这里就需要调用传输层提供的 api。 Socket套接字 传输层提供协议,主要是两个: UDP和TCP 提供了两套不同的 api,这api也叫做socket api。 UDP和 TCP 特点对比: UDP: 无连…...
<MySon car=“宝马“ :money=“money“></MySon>有没有冒号
为什么car"宝马"没有: 但是 :money"money"就有: <script setup> import {ref} from vue import MySon from /components/MySon.vueconst money ref(100) </script><template><h3>father</h3><My…...
netty(三):NIO——多线程优化
NIO多线程优化 使用Boss线程来处理accepct事件使用Worker线程来处理读写事件,可以创建多个worker线程 package com.review;import lombok.extern.slf4j.Slf4j;import java.io.IOException; import java.net.InetSocketAddress; import java.nio.channels.*; impor…...
Linux操作系统--linux概述
1.Linux概述 Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统(OS)。简单的说就是一种操作系统。在日常中常见的操作系统有一下三种: 2.linux起源和背景 (1).linux的诞生 linux操作系统是由李纳斯托瓦兹…...
数组中出现次数超过一半的数字
⭐️ 题目描述 🌟 OJ链接:数组中出现次数超过一半的数字 思路: 采用投票计数的方式,我们可以把每个数字都看成一次投票并且计数,那么最后剩下来的就是数组中数字出现次数最多的那一个。比如 { 1,2,3,2,2,2,5,4,2 } &a…...
网络优化工程师,你真的了解吗?
一、5G网络优化工程师到底是什么? 5G,就是我们通常所说的第五代移动通信标准,属于目前最热门的新技术趋势。随着2019年5G技术进入正式的商用阶段,拥有广阔的发展前景,备受瞩目。“5G工程师”这个词是一个概念词&#x…...
git 的常用命令
git是一个版本管理器,是程序员必备工具之一,其主分为三个区: 工作区: 暂存区: 仓库: 通过保持软件版本,分支,合并,等多种版本操作,使软件能在自己想要的版本…...
linux如何拷贝文件,删除多余的一级目录,用*号代替所有文件
加上*,代表目录下的所有文件 mv /home/user/dir1/dir1/* /home/user/dir1/可以使用mv命令的通配符来去掉一层目录。 例如,假设有一个名为/home/user/dir1/dir2/file.txt的文件,要将它移动到/home/user/dir2/目录下并去掉dir1目录࿰…...
springboot使用properties
一、方式1: 1.1.配置类: package cn.zyq.stater.config;import cn.zyq.stater.bean.User4; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework…...
Android中获取手机SIM卡的各种信息
通过以下工具类方法可以获取到手机SIM的各种信息数据!!! package com.utils; import android.telephony.TelephonyManager; import com.baidu.platform.comapi.map.E; import org.json.JSONArray; import org.json.JSONObject; import java.…...
matlab 根据索引提取点云
目录 一、语法二、说明三、名称-值对应参数1、输入参数2、输出参数四、代码示例五、结果展示六、参考链接一、语法 ptCloudOut = select(ptCloud,indices) ptCloudOut = select(ptCloud,row,column...
蓝芯、四川邦辰面试(部分)
蓝芯 HTTP请求经过MQ异步处理后,怎样返回结果呢?grpc比起spring cloud的优缺点? 四川邦辰 SkyWalking的埋点具体是怎么操作的?newBing: SkyWalking支持两种埋点方式:自动埋点和手动埋点。自动埋点是指通过SkyWalking…...
openCV实战-系列教程13:文档扫描OCR识别下(图像轮廓/模版匹配)项目实战、源码解读
🧡💛💚💙💜OpenCV实战系列总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 上篇内容: openCV实战-系列教程11:文档扫描OCR识别上&am…...
SpringBootWeb案例 Part 4
3. 修改员工 需求:修改员工信息 在进行修改员工信息的时候,我们首先先要根据员工的ID查询员工的信息用于页面回显展示,然后用户修改员工数据之后,点击保存按钮,就可以将修改的数据提交到服务端,保存到数据…...
什么是ChatGPT水印,ChatGPT生成的内容如何不被检测出来,原理什么?
太长不看版 1. 什么是ChatGPT水印? ChatGPT水印是AI以伪随机方式生成的独特tokens序列。该序列用来作为水印,以区分AI生成内容和人类原创内容。 2. 如何规避ChatGPT水印? 一种规避方法是使用其他AI模型改写ChatGPT生成的文本。这会破坏水…...
Android 6.0 Settings中添加虚拟键开关
添加系统默认键值 b/frameworks/base/packages/SettingsProvider/res/values/defaults.xml-212,4 212,7 <!-- Default for Settings.Secure.NFC_PAYMENT_COMPONENT --><string name"def_nfc_payment_component"></string><!--mh.modify 2019060…...
Yolov8小目标检测(12):动态稀疏注意力BiFormer | CVPR 2023
💡💡💡本文改进:动态稀疏注意力,cvpr2023。 BiFormer | 亲测在红外弱小目标检测涨点,map@0.5 从0.755提升至0.758 💡💡💡Yolo小目标检测,独家首发创新(原创),适用于Yolov5、Yolov7、Yolov8等各个Yolo系列,专栏文章提供每一步步骤和源码,带你轻松实现小…...
C# VS调试技巧
一.按照条件调试步骤 ①在需要代码执行的行打断点 ②触发此断点,让代码执行到此处 ③鼠标滑至在断点处,点击设置 ④设置断点条件,如下图所示 二、多线程调试技巧 ①在需要代码执行的行打断点 ②触发此断点,让代码执行到此处…...
VS的调试技巧
Visual Studiohttps://visualstudio.microsoft.com/zh-hans/vs/ 目录 1、什么是调试? 2、debug和release 3、调试 3.1、环境 3.2、 快捷键 3.2.1、F10和F11 3.2.2、ctrlF5 3.2.3、F5与F9 3.2.3.1、条件断点 3.3、监视和内存观察 3.3.1、监视 3.3.2、内存 …...
lucene国内镜像 极速下载
文章目录 国内镜像汇总-极速下载【JavaPub版】 lucene国内镜像 https://mirrors.cloud.tencent.com/apache/lucene/ 国内镜像汇总-极速下载【JavaPub版】...
Qt 信号槽连接方式
使用示例: QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()), Qt::AutoConnection); 目录 连接方式 一、AutoConnection 二、DirectConnection 三、QueuedConnection 四、BlockingQueuedConnection 五、UniqueConnection 总结 连接方式 "q…...
(线程池) 100行以内的简单线程池
文章目录 前言CodeThreadPool.hppmain.cpp 简单讲解所需头文件using成员变量构造析构添加任务PS测试效果 END 前言 线程池_百度百科 (baidu.com) 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都…...
Mysql按姓氏从小到大排序的正确sql
一、前言 最近有个需求,要按姓氏从小到大查询数据。(姓名都是中文的) 写了一个sql: select a.* from mytable a order by substr(a.NAME,1,1) asc结果发现这样不行,排序是乱的。 二、解决办法 查询发现,如果mysql字符集是gbk的…...
【C++】详细介绍模版初阶—函数模版、类模板
文章目录 一、泛型编程二、函数模版2.1 函数模版概念2.2 函数模版格式2.3 函数模版的原理2.4 函数模版的实例化2.5 函数模版的匹配原则 三、类模版3.1 类模版定义3.2 类模版实例化 总结 ヾ(๑╹◡╹)ノ" 人总要为过去的懒惰而付出代价ヾ(๑╹◡╹)ノ&…...
BananaPi BPI-6202工业控制板全志科技A40i、24V DC输入、RS485接口
Banana Pi BPI-6202“嵌入式单板计算机”采用工业级全志A40i四核Cortex-A7处理器,工业温度范围和长生命周期,2GB DDR3,8GB eMMC闪存,M.2 SATA插槽等。 这是自 Banana Pi去年推出Banana Pi BPI-M2 Ultra SBC 和BPI-M2 Berry以来&am…...
Python - functools.partial设置回调函数处理异步任务基本使用
一. 前言 在Python中,回调函数是指在一个函数执行完成后,调用另一个函数的过程。通常情况下,回调函数作为参数传递给原始函数,原始函数在执行完自己的逻辑后,会自动调用回调函数并将结果作为参数传递给它。 二. 回调…...