机器视觉初步8:特征提取专题

news2024/12/24 0:39:45

文章目录

  • 1.角点检测
  • 2.纹理特征提取
  • 3.特征描述符匹配
    • 3.1 Harris角点描述符
    • 3.2 SIFT(尺度不变特征变换)描述符
    • 3.3 SURF(加速稳健特征)描述符
  • 4.基于深度学习的特征提取

在机器视觉中,特征提取是从目标图像中提取有用的视觉信息以供后续处理和识别的过程。
在这里插入图片描述
以下是图像处理中常见的一些特征提取技术:

  1. 边缘检测:边缘检测是一种常见的图像特征提取技术,它可以检测图像中的局部边缘信息。常用的边缘检测算子包括Roberts算子、Prewitt算子、Sobel算子和Canny算子等。
    可参考:机器视觉初步6-1:基于梯度的图像分割

  2. Harris角点检测:Harris角点检测是一种基于局部二阶导数的特征检测技术,它可以检测图像中的角点特征。角点是图像中具有较大能量的特征点,在图像匹配、姿态估计等领域具有广泛的应用。

  3. SIFT(尺度不变特征变换):SIFT是一种流行的图像特征提取技术,它可以检测图像中的尺度、旋转、亮度等变化下的特征点。SIFT具有较强的尺度不变性,因此在图像匹配、计算机视觉等领域具有广泛的应用。

  4. SURF(加速稳健特征变换):SURF是一种基于FAST(快速近似角点检测)和ORB(ORiented FAST and Rotated BRIEF)的特征提取技术,它在SIFT的基础上加速了特征检测的速度,并提高了特征的鲁棒性。

  5. Faster R-CNN(快速区域卷积神经网络):Faster R-CNN是一种基于卷积神经网络的目标检测技术,它通过训练一个卷积神经网络来同时实现特征提取和目标检测。Faster R-CNN具有较快的检测速度,并且在目标检测领域表现优秀。

在这里插入图片描述
接下来我们从技术层面逐个介绍。

1.角点检测

角点检测(Corner Detection):角点是图像中亮度发生明显变化的地方,它们具有良好的旋转不变性。Harris角点检测算子可以用来检测图像中的角点。Halcon中的算子为:cornerHarris()。
在这里插入图片描述
用python实现:

import cv2
import numpy as np

def corner_detection(image_path):
    gray = cv2.cvtColor(image_path, cv2.COLOR_BGR2GRAY)

    # Harris角点检测
    corners, _ = cv2.cornerHarris(gray, 2, 3, 0.04)
    
    # Sobel 边缘检测
    sobel_x = cv2.Sobel(gray, cv2.CV_32F, 1, 0, ksize=3)
    sobel_y = cv2.Sobel(gray, cv2.CV_32F, 0, 1, ksize=3)

    # Prewitt 边缘检测
    prewitt_x = cv2.Sobel(gray, cv2.CV_32F, 1, 0, ksize=3)
    prewitt_y = cv2.Sobel(gray, cv2.CV_32F, 0, 1, ksize=3)

    # convert sobel x, sobel y, prewitt x and prewitt y to float
    sobel_x = cv2.convertScaleAbs(sobel_x)
    sobel_y = cv2.convertScaleAbs(sobel_y)
    prewitt_x = cv2.convertScaleAbs(prewitt_x)
    prewitt_y = cv2.convertScaleAbs(prewitt_y)

    # merge sobel x and sobel y and prewitt x and prewitt y
    combined = np.concatenate((sobel_x, sobel_y), axis=0)
    combined = np.concatenate((prewitt_x, prewitt_y), axis=0)

    # merge and reduce combined
    combined = np.amax(combined)

    # filter out zeros
    combined = np.where(combined == 0, 0, combined)

    # Detect corners using cv2.cornerSubPix method
    corners = cv2.cornerSubPix(gray, (5, 5), (-1, -1), cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 11, 2)

    return combined, corners

image_path = "path/to/your/image.jpg"
combined, corners = corner_detection(image_path)
cv2.imshow("corners", combined)
cv2.waitKey(0)
cv2.destroyAllWindows()

用C++实现

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;

void detectCorners(Mat& image) {
    Mat gray;
    cvtColor(image, gray, COLOR_BGR2GRAY);

    int cornersNum = 0;
    Mat corners;
    cornerSubPix(gray, corners, Size(-1, -1), Size(-1, -1), TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 10, 0.1), 3, 4);

    printf("Corners found: %d\n", cornersNum);
}

int main() {
    Mat image = imread("path/to/your/image.jpg");
    if (image.empty()) {
        std::cout << "Could not load image..." << std::endl;
        return -1;
    }

    detectCorners(image);

    imshow("Corner Detection Result", image);
    waitKey(0);

    return 0;
}

2.纹理特征提取

纹理特征提取(Texture Feature Extraction):纹理是图像中与光照、形状、大小无关的特征,用于描述图像的复杂性。
在这里插入图片描述

Laplacian算子、Gabor滤波器等算子可以用来提取纹理特征。(数学原理较复杂,之后深究)
Python实现:

import cv2
import numpy as np
from skimage import morphology

# 读取图像
img = cv2.imread('input.jpg')

# 将图像转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 使用Laplacian算子对图像进行边缘检测
edges = cv2.Canny(gray, 50, 150)

# 计算二阶导数
diff_x = cv2.diff(edges, edges)
diff_y = cv2.diff(edges, edges)

# 计算梯度幅值和方向
gradient_magnitude, gradient_orientation = cv2.Sobel(diff_y, cv2.CV_64F, 1, 0, ksize=3)

# 计算各向异性扩散
gradient_ac = cv2.kaze_uniform(gradient_magnitude)

# 计算标准化直方图
normalized_hist = cv2.calcHist([gradient_magnitude], [0], None, [256], [0, 256])
normalized_hist = 255 * np.log10(normalized_hist)

# 计算L1范数、L2范数和L_inf范数
norm1 = cv2.norm(diff_x, cv2.NORM_L1, dtype=cv2.CV_64F)
norm2 = cv2.norm(diff_x, cv2.NORM_L2, dtype=cv2.CV_64F)
norm_inf = cv2.norm(gradient_magnitude, cv2.NORM_INF, dtype=cv2.CV_64F)

# 计算L1范数比值
L1_ratio = norm1 / norm2

# 计算L2范数比值
L2_ratio = norm1 / norm_inf

# 计算L_inf范数比值
L_inf_ratio = norm_inf / norm1

# 使用HSV颜色空间提取各向同性纹理特征
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# 计算各向同性纹理指数
erosion = cv2.erode(hsv, None, iterations=2)
dilation = cv2.dilate(erosion, None, iterations=2)
texture = cv2.convexHull(dilation)
texture_signature = cv2.GaussianBlur(texture, (9, 9), 0)

# 计算各向同性纹理指数比值
rate = L1_ratio * L2_ratio / L_inf_ratio

# 将结果显示在窗口中
cv2.imshow('Texture Feature Extracted', gray)
cv2.imshow('L1 Ratio', rate)
cv2.imshow('L2 Ratio', rate)
cv2.imshow('L_inf Ratio', rate)
cv2.waitKey(0)
cv2.destroyAllWindows()

这个脚本首先读取一张图像,将其转换为灰度图像,然后使用Canny算子检测边缘。接着,计算图像的二阶导数,并使用各向同性扩散算法1计算直方图。对直方图进行归一化处理,计算L1范数2、 L2范数和L_inf范数,并计算它们的比值。最后,使用HSV颜色空间3提取各向同性纹理特征,并计算各向同性纹理指数比值。

3.特征描述符匹配

3.1 Harris角点描述符

Harris角点描述符用于检测图像中的角点。角点是图像中具有较大梯度值的区域,这使得图像边缘或曲线等平滑区域对描述符的贡献较小。Harris角点检测的基本原理是通过计算图像中每个像素点的局部自相关函数的峰值,来检测角点。

import cv2
import numpy as np

def cornerHarris(image):
    # 归一化
    image = cv2.normalize(image, 0, 255, cv2.NORM_MINMAX, cv2.CV_8U, 0)
    
    # 计算Harris角点响应函数
    M = cv2.getRotationMatrix2D((image.shape[1] / 2, image.shape[0] / 2), 0.6, 1)
    
    # 设置检测角点数量
    k = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=5)
    # 计算图像自相关函数
    corners = cv2.cornerHarris(k, 2, 3)
    # 角点响应值阈值
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.01)
    
    # 匹配并绘制角点
    drawn_corners = cv2.drawChessboardCorners(image, (rows, cols), corners, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
    
    return cv2.cvtColor(np.uint8(drawn_corners), cv2.COLOR_BGR2GRAY), corners

halcon实现

* 导入图像
dev_update_window ('off')
dev_close_window ()
read_image (Image, 'holly.jpg')

* 提取Harris角点响应函数
cornerHarris := cornerHarris_Gaussian(Image, 0.01, 0.04)

* 角点响应值阈值
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)

* 绘制角点
draw_chessboard_corners (WindowHandle, 9, 3, [], [], [], [], RowSmallest, ColumnSmallest, RadiusSmallest, RadiusLargest, 1, 0, 3)

3.2 SIFT(尺度不变特征变换)描述符

SIFT(尺度不变特征变换)描述符是一种用于检测和描述图像中关键点(特征)的方法。SIFT描述符可以检测尺度变化、旋转和光照变化等不变性。它的主要思想是在尺度空间中寻找极值点,并将这些极值点转换为关键点。
Python实现

import cv2
import numpy as np

def sift_detection(image):
    # 归一化
    image = cv2.normalize(image, 0, 255, cv2.NORM_MINMAX, cv2.CV_8U, 0)
    
    # 获取尺度空间
    scale_ranges = cv2.convertScaleAbs(np.uint8(np.array([cv2.minMaxLoc(image, 0)[1] for _ in range(3)])))
    
    # 选择尺度和方向
    scale_x = scale_ranges[0]
    scale_y = scale_ranges[1]
    direction = (scale_ranges[2] - scale_ranges[1]) / (scale_ranges[0] - scale_ranges[1])
    
    # 计算尺度空间
    scaled_image = cv2.pyrDown(image)
    for i in range(10):
        scaled_image = cv2.pyrDown(scaled_image * 2 + cv2.GaussianBlur(scaled_image, (11, 11), 0))
    
    # 在尺度空间中搜索极值点
    keypoints, descriptors = cv2.sift(scaled_image, feature_params=None, loc_params=None, contrast_threshold=0.6, n_features=200)
    
    return keypoints, descriptors

halcon实现

dev_update_window ('off')
dev_close_window ()
read_image (Image, 'holly.jpg')

* 提取尺度空间
gen_contrast_image (Image, Image, 70, 255, 10)
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)

* 计算尺度空间
gen_contrast_image (Image, Image, -70, 255, 10)
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)

* 在尺度空间中搜索极值点
gen_keypoints_std_threshold_3x3 (Keypoints, 10, 0.1, 9, 'nearest_neighbor')

* 描述符
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
gen_contour_xld (Keypoints, Contours, 'reverse', 1)
convert_contour_xld_to_polygon (Contours, Polygons)
contour_descriptor (Polygons, TransposedKeypoints, 'COUNTERCLOCKWISE', 1, 'uniform_scale')

return Keypoints, TransposedKeypoints

3.3 SURF(加速稳健特征)描述符

SURF(加速稳健特征)描述符是一种高效的尺度不变特征变换(SIFT)描述符,它通过引入Hessian矩阵的方向因子来加速计算。
Python实现

import cv2
import numpy as np

def surf_detection(image):
    # 归一化
    image = cv2.normalize(image, 0, 255, cv2.NORM_MINMAX, cv2.CV_8U, 0)
    
    # 获取尺度空间
    scale_ranges = cv2.convertScaleAbs(np.uint8(np.array([cv2.minMaxLoc(image, 0)[1] for _ in range(3)])))
    
    # 选择尺度和方向
    scale_x = scale_ranges[0]
    scale_y = scale_ranges[1]
    direction = (scale_ranges[2] - scale_ranges[1]) / (scale_ranges[0] - scale_ranges[1])
    
    # 计算尺度空间
    surf_image = cv2.pyrDown(image)
    for i in range(10):
        surf_image = cv2.pyrDown(surf_image * 2 + cv2.GaussianBlur(surf_image, (11, 11), 0))
    
    # 在尺度空间中搜索极值点
    surf_keypoints, surf_descriptors = cv2.surfDetector(surf_image, SurfFeatureParams(200, 25), False)
    
    return surf_keypoints, surf_descriptors

halcon实现

dev_update_window ('off')
dev_close_window ()
read_image (Image, 'holly.jpg')

* 提取尺度空间
gen_contrast_image (Image, Image, 70, 255, 10)
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)

* 计算尺度空间
gen_contrast_image (Image, Image, -70, 255, 10)
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)

* 在尺度空间中搜索极值点
gen_keypoints_std_threshold_3x3 (Keypoints, 10, 0.1, 9, 'nearest_neighbor')

* 描述符
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
gen_contour_xld (Keypoints, Contours, 'reverse', 1)
convert_contour_xld_to_polygon (Contours, Polygons)
contour_descriptor (Polygons, TransposedKeypoints, 'COUNTERCLOCKWISE', 1, 'uniform_scale')

return Keypoints, TransposedKeypoints

4.基于深度学习的特征提取

基于深度学习的特征提取(Deep Learning-based Feature Extraction):深度学习可以自动学习图像中的高层语义特征。常用的深度学习模型包括卷积神经网络(CNN)、生成对抗网络(GAN)等。Python中常用的深度学习框架包括TensorFlow和PyTorch。
在这里插入图片描述

深度学习中常用的特征提取算法包括卷积神经网络(CNN)和循环神经网络(RNN)。这里有一个使用CNN提取手写数字识别任务特征的例子:
假设我们需要使用CNN提取手写数字识别任务的特征,可以使用MNIST数据集。数据集包含了大量手写数字的图像和对应的标签。我们可以构建一个简单的CNN模型,如下所示:

import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Conv2D, MaxPooling2D

# 加载并预处理数据集
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape((60000, 28, 28, 1))  # 转换为适合卷积神经网络的形状
x_test = x_test.reshape((10000, 28, 28, 1))
x_train = x_train.astype('float32')  # 转换为浮点数
x_test = x_test.astype('float32')
x_train /= 255  # 归一化
x_test /= 255

# 定义模型
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))

# 编译模型
model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

# 训练模型
model.fit(x_train, y_train, epochs=10, validation_data=(x_test, y_test))

假设我们要处理的图像是一组水果的照片,我们的目标是将这些水果分类为苹果、香蕉、橙子等。我们可以使用以下代码来构建一个卷积神经网络模型:

  1. 数据预处理:首先,我们需要对图像数据进行预处理,包括对图像进行归一化、调整图像尺寸、填充等。此外,我们还需要将标签数据(苹果、香蕉、橙子等)转换为数字标签。
  2. 构建卷积神经网络模型:我们可以使用以下代码构建一个更复杂的卷积神经网络模型:
import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense
from tensorflow.keras.layers import GlobalAveragePooling2D, Dropout
from tensorflow.keras.optimizers import Adam

# 加载并预处理数据集
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape((60000, 28, 28, 1))  # 转换为适合卷积神经网络的形状
x_test = x_test.reshape((10000, 28, 28, 1))
x_train = x_train.astype('float32')  # 转换为浮点数
x_test = x_test.astype('float32')
x_train /= 255  # 归一化
x_test /= 255

# 定义模型
model = Sequential()
model.add(Conv2D(64, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(GlobalAveragePooling2D())

model.add(Dense(128, activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(3, activation='softmax'))

# 编译模型
model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

# 训练模型
model.fit(x_train, y_train, epochs=10, validation_data=(x_test, y_test))

  1. 同性扩散算法是一种用于图像分割的非空穴算法,由李周芳和曹秀武于2020年提出。
    同性扩散算法的基本原理是基于同性相互排斥的原理,即同性个体之间有强烈的相互排斥,会倾向于在空间中寻找一种平衡的状态,这种状态会在不同的同性个体之间传递,形成一个扩散过程。在这个过程中,同性个体会不断地调整自己的位置,直到达到一种稳定的状态。
    同性扩散算法采用了一种基于染色体的编码方式,将图像中的每个像素都表示成一个染色体,其中包含了该像素的颜色信息和位置信息。然后,算法通过生成一系列新的染色体,不断地将同性个体之间的排斥力传递下去,直到达到一个稳定的状态。
    同性扩散算法具有较好的稳定性和鲁棒性,适用于多种图像分割任务,如基于边缘的图像分割、基于纹理的图像分割等。同时,由于同性扩散算法在分割过程中不需要计算梯度信息,因此其计算速度也相对较快。
    同性扩散算法包括以下几个步骤:
    1 初始化:在图像中随机选取一些像素点作为种子点,作为同性扩散算法的起始点。然后,将这些种子点作为同性个体,根据同性个体之间的距离,计算相互排斥的力度。
    2 生成新的染色体:根据同性个体之间的排斥力度,生成一系列新的染色体。这些染色体包含了同性个体的位置和排斥力度。
    3 扩散染色体:将生成的新染色体按照同性个体之间的距离,逐一传递到同性个体之间,使得排斥力度不断增强。同时,将排斥力度最小的染色体作为稳定的染色体。
    4 更新种子点:将稳定的染色体中的种子点替换为同性个体,并重复步骤1和2,直到没有新的染色体可以生成。
    5 结果输出:将稳定的染色体中的像素点作为图像的分割结果,输出给用户。
    同性扩散算法的优点是计算速度快、鲁棒性好、稳定性高,适用于多种图像分割任务,如基于边缘的图像分割、基于纹理的图像分割等。同时,由于同性扩散算法在分割过程中不需要计算梯度信息,因此其计算速度也相对较快。 ↩︎

  2. 范数是一种线性代数的概念,用于度量一个向量空间中的每个向量的大小,即度量向量的长度。在向量空间中,每个向量都可以用范数来表示。范数可以有不同的定义方式,但以下是最常见的三种:
    1 L1范数(绝对范数):也被称为曼哈顿范数,用向量的各个元素的绝对值之和表示,即||x||1 = ∑|x_i|。L1范数可以使得向量中元素为非零值的个数最多为1。
    2 L2范数(欧几里得范数):也被称为海明范数,用向量的各个元素平方和的平方根表示,即||x||2 = √(x_1^2 + x_2^2 + … + x_n^2)。L2范数可以使得向量中元素的平方和最小。
    3 Lp范数(p-范数):也被称为列维森范数,用向量的各个元素的p次方和的1/p次方表示,即||x||p = (1/p) ∑(x_i^p)。Lp范数可以使得向量中元素的p次方和最小。
    在机器学习和统计中,范数通常用于距离度量和矩阵分析。例如,范数可以用于计算两个向量之间的相似度,也可以用于优化问题中的目标函数。范数还可以应用于稀疏编码和奇异值分解等领域。 ↩︎

  3. HSV(Hue,Saturation,Value)颜色空间是一种常用的颜色表示方式,它将颜色分为三个部分:色调(Hue)、饱和度(Saturation)和明度(Value)。
    1 色调(Hue):色调是指颜色的基本方向,通常表示为红色、绿色或蓝色。在HSV颜色空间中,色调通常以角度表示,范围从0度(红色)到360度(蓝色)。
    2 饱和度(Saturation):饱和度是指颜色的纯度,表示颜色的鲜艳程度。在HSV颜色空间中,饱和度通常用一个0到100的值表示,其中0表示完全灰色,100表示完全饱和。
    3 明度(Value):明度是指颜色的明暗程度,表示颜色在黑色和白色之间的差异。在HSV颜色空间中,明度通常用一个0到100的值表示,其中0表示完全黑色,100表示完全白色。
    HSV颜色空间在图像处理、计算机视觉等领域有广泛的应用。例如,在图像编辑、颜色选择、肤色检测等任务中,HSV颜色空间可以帮助我们更好地理解和分析颜色数据。 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/681403.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言:打印菱形(输入菱形上半部分行数)

题目&#xff1a; 用C语言在屏幕上输入以下图案&#xff1a; 思路&#xff1a; 总体思路&#xff1a; &#xff08;一&#xff09;. 输入菱形上半部分行数 -- scanf()函数 &#xff08;二&#xff09;. 使用 for循环 进行 菱形上半部分三角形 的打印&#xff0c; 菱形上半部分…

基于5G网络的视频远程操控应用实践——低延迟视频技术及应用

本次分享将分为三个部分&#xff1a;第一部分介绍低延迟视频所涉及到的关键技术&#xff0c;包括低延迟视频编解码、视频传输、视频处理低延时框架、视频采集和显示&#xff1b;第二部分重点介绍5G环境下低延迟视频对抗弱网提出的要求&#xff0c;包括&#xff1a;弱网状态的探…

Vulcanexus-一体化ROS2工具集

Vulcanexus机器人操作系统ROS2一站式工具集&#xff08;GalacticHumble&#xff09;2022 Humble Hierro v2 x86_64 arm64 Ubuntu Jammy (22.04) Vulcanexus是ROS 2的一站式工具集&#xff0c;用于构建机器人应用程序。它固定了DDS中间件&#xff0c;使用了Fast DDS&#xff…

word文件未保存 如何恢复

问题 word文件未保存 如何恢复 详细问题 笔者关闭已编辑完成的word文件&#xff0c;误触不保存&#xff0c;再次打开文件恢复至编辑前的状态&#xff0c;如何恢复至编辑完成后的状态 解决方案 文件 → \rightarrow →打开 → \rightarrow →恢复未保存的文件 或 1、打开 …

Spring关于@Configuration配置处理流程解析

Configuration配置处理流程解析 AnnotationConfigApplicationContext基于注解配置ApplicationContext启动刷新流程Spring关于Configuration解析处理流程那些年被忽略问题 AnnotationConfigApplicationContext基于注解配置 Spring通过上下文应用AnnotationConfigApplicationCon…

10- c语言复合数据类型 (C语言)

一 结构体 1.1 引入 1、在自然界中 任何一个物体&#xff0c;都有多个属性&#xff0c;如果用计算机语言来描述的话&#xff0c;一个属性也许可以用某一个基本数据类型来表示&#xff0c;但是当有多个属性的时候&#xff0c;一个基本数据类型就不能表示了。例如&#xff1a;学…

ML算法——线代预备知识随笔【机器学习】

文章目录 数学预备知识3、线性代数3.1、矩阵奇异值分解&#xff08;SVD&#xff09;3.2、广义逆矩阵&#xff08;Moore-Penrose &#xff09;3.3、数据白化&#xff08;Data Whitening&#xff09;3.4、向量导数 4、其它 数学预备知识 3、线性代数 3.1、矩阵奇异值分解&#…

最小化暗数据风险的 5 个步骤

超过一半的公司数据存储库包含哪些内容&#xff0c;但大多数人甚至不知道自己拥有什么&#xff1f;这是暗数据&#xff0c;是公司在不知不觉中收集的信息&#xff0c;它们不是日常业务交互的组成部分&#xff0c;因此通常位于后台。 虽然这些数据对于大多数公司来说似乎是不必…

C语言——数据的输入输出

数据的输入输出 前言&#xff1a;一、格式输入输出函数1.格式输出函数printf&#xff08;&#xff09;2.格式输入函数scanf&#xff08;&#xff09; 二、字符输入输出函数1.字符输出函数putchar&#xff08;&#xff09;2.字符输入函数getchar&#xff08;&#xff09; 三、字…

JUC并发工具类--阻塞队列BlockingQueue

JUC并发工具类--阻塞队列BlockingQueue 队列队列&#xff08;Queue接口&#xff09;提供的方法 阻塞队列阻塞队列&#xff08;BlockingQueue接口&#xff09;提供的方法应用场景JUC包下的阻塞队列如何选择适合的阻塞队列选择策略线程池对于阻塞队列的选择 队列 是限定在一端进…

Servlet技术实现服务端,Android平台作为客户端,实现一个个人店铺

背景&#xff1a; 使用Servlet技术实现服务端&#xff0c;使用Android平台作为客户端&#xff0c;实现一个个人店铺&#xff0c;店铺商品不限。功能要求如下&#xff1a; 1. 提供登录、注册功能&#xff1b;&#xff08;10分&#xff09; 2. 首页面包括“商品列表”子页面、“…

ATA-8000系列射频功率放大器——在生物医学中的应用

ATA-8000系列射频功率放大器——在生物医学研究中的应用 ATA-8000系列是一款射频功率放大器。其P1dB输出功率500W&#xff0c;饱和输出功率最大1000W。增益数控可调&#xff0c;一键保存设置&#xff0c;提供了方便简洁的操作选择&#xff0c;可与主流的信号发生器配套使用&…

VulnHub靶机渗透:SKYTOWER: 1

SKYTOWER: 1 靶机环境介绍nmap扫描端口扫描服务扫描漏洞扫描总结 80端口目录爆破 3128端口获取立足点获取立足点2提权总结 靶机环境介绍 https://www.vulnhub.com/entry/skytower-1,96/ 靶机IP&#xff1a;192.168.56.101 kali IP&#xff1a;192.168.56.102 nmap扫描 端口扫…

h5手写签名示例

前言 业务中需要用户进行签字&#xff0c;如何让用户在手机端进行签字&#xff1f; 示例如下 代码已分享至Gitee: https://gitee.com/lengcz/qianming 原示例&#xff1a; https://www.jq22.com/jquery-info13488 H5实现手写签字 创建一个html页面 <!DOCTYPE html> …

<Oracle>《Linux 下安装Oracle数据库 - Oracle 19C By CentOS 8 》(第一部分)

《Linux 下安装Oracle数据库 - Oracle 19C By CentOS 8 》&#xff08;第一部分&#xff09; 1 说明1.1 前言1.2 资源下载 2 安装步骤2.1 上传安装包2.2 下载数据库预安装包2.3 安装数据库预安装包 1 说明 1.1 前言 本文是Linux系统命令行模式安装Oracle数据库的学习实验记录…

【American English】实验室常用口语对话

不懂不丢人&#xff0c;不懂装懂才丢人。最近有点犯这毛病&#xff0c;多写一些东西消除一下。 无论什么知识都是多了才能成体系&#xff0c;更多自己在美国的小总结可见专栏&#xff1a;English。 文章目录 初次见面日常问候找寻某个东西找寻某个人 初次见面 Nice to meet you…

Linux之tar安装

目录 Linux之tar安装 定义 工作过程 语法格式 参数及用法 使用源代码安装软件的优点 注意&#xff1a;源代码编译环境 操作流程 解包 —— tar 配置 —— ./configure 编译 —— make 安装 —— make install 案例 --- 安装Apache服务 1.获取安装包地址并下载 2…

衣服面料相关基础

总结自 BiliBili视频&#xff1a;原来衣服的面料还能这么选&#xff0c;几个方法教你买到优质的短袖&#xff0c;再也不怕买衣服踩坑了 面子里子 既不能皱巴巴 又不能不透气 混纺 涤纶 粘纤 氨纶 涤纶 不变性 挺阔感 氨纶 弹性 粘纤 吸水透气40-50% 怕热 真丝与亚麻 …

Python 进阶(三):Python使用ORM框架SQLAlchemy操作Oracle数据库

Python使用ORM框架SQLAlchemy操作Oracle数据库 前言1. 安装Oracle Instant Client2. 安装依赖库3. 导入模块并创建引擎4. 操作oracle数据库4.1 新增数据4.2 查询数据4.3 更新数据4.4 删除数据 前言 要详细连接Oracle数据库并使用SQLAlchemy进行操作&#xff0c;按照以下步骤进…

云计算与OpenStack简介

文章目录 云计算与OpenStack简介什么是云服务模式部署模型 Openstac概述Openstack服务组件 云计算与OpenStack简介 什么是云 云是一种服务&#xff0c;就像我们去餐厅吃饭一样&#xff0c;只需要点菜&#xff0c;不需要知道厨师怎样烹饪食物。在云中&#xff0c;用户也只需要…