第八篇【传奇开心果短博文系列】Python的OpenCV技术点案例示例:深度学习

传奇开心果短博文系列

  • 系列短博文目录
    • Python的OpenCV技术点案例示例系列
  • 短博文目录
    • 一、前言
    • 二、OpenCV深度学习介绍
    • 三、OpenCV常用深度学习算法和实现分别示例代码
    • 四、归纳总结

系列短博文目录

Python的OpenCV技术点案例示例系列

短博文目录

一、前言

在这里插入图片描述OpenCV深度学习:包括卷积神经网络、循环神经网络等多种深度学习算法的实现。

二、OpenCV深度学习介绍

在这里插入图片描述OpenCV是一个开源的计算机视觉库,它提供了丰富的图像处理和计算机视觉算法。深度学习是一种机器学习方法,它模拟人脑神经网络的工作原理,通过多层神经网络来学习和提取数据的特征。

在OpenCV中,可以使用深度学习算法来实现各种任务。下面介绍一些常用的深度学习算法及其在OpenCV中的实现:

  1. 卷积神经网络(Convolutional Neural Network,CNN):CNN是一种专门用于图像处理的深度学习算法。它通过卷积层、池化层和全连接层等组件来提取图像的特征并进行分类。在OpenCV中,可以使用dnn模块加载预训练的CNN模型,并进行图像分类或目标检测任务。

  2. 循环神经网络(Recurrent Neural Network,RNN):RNN是一种用于序列数据处理的深度学习算法,适用于自然语言处理、语音识别等任务。在OpenCV中,可以使用dnn模块加载预训练的RNN模型,并进行文本生成、情感分析等任务。

  3. 生成对抗网络(Generative Adversarial Network,GAN):GAN是一种用于生成新样本的深度学习算法。它由一个生成器网络和一个判别器网络组成,两者通过对抗训练的方式相互竞争,使得生成器能够逐渐生成更逼真的样本。在OpenCV中,可以使用dnn模块加载预训练的GAN模型,并利用生成器生成新样本。

  4. 支持向量机(Support Vector Machine,SVM):SVM是一种经典的监督学习算法,用于分类和回归任务。它通过在特征空间中找到一个最优的超平面来进行分类或回归。在OpenCV中,可以使用ml模块中的SVM类来实现支持向量机算法,根据训练数据进行模型训练,并用于对新样本进行分类。

  5. 目标检测算法:OpenCV中的dnn模块支持加载预训练的目标检测模型,包括基于CNN的算法(如Faster R-CNN、YOLO、SSD等)和基于RNN的算法(如CTPN用于文本检测)。这些算法可以用于检测图像或视频中的特定目标,并标记出其位置和类别。

  6. 图像分割算法:OpenCV中的dnn模块也支持加载预训练的图像分割模型,如基于CNN的语义分割算法(如FCN、UNet等)。这些算法可以将图像分割为不同的区域,并对每个区域进行分类或标记。

  7. 人脸识别算法:OpenCV中的dnn模块支持加载预训练的人脸识别模型,如基于CNN的算法(如FaceNet、ArcFace等)。这些算法可以用于识别人脸并进行人脸验证或人脸检索任务。

  8. 姿态估计算法:OpenCV中的dnn模块也支持加载预训练的姿态估计模型,如基于CNN的算法(如OpenPose)。这些算法可以用于识别图像或视频中人体的关节点位置,实现人体姿态估计。

三、OpenCV常用深度学习算法和实现分别示例代码

在这里插入图片描述(一) 卷积神经网络示例代码
以下是一个使用OpenCV中的dnn模块实现卷积神经网络(CNN)的示例代码:

import cv2# 加载预训练的CNN模型
net = cv2.dnn.readNetFromCaffe('deploy.prototxt', 'model.caffemodel')# 加载测试图像
image = cv2.imread('image.jpg')# 对图像进行预处理
blob = cv2.dnn.blobFromImage(image, 1.0, (224, 224), (104.0, 177.0, 123.0))# 将预处理后的图像输入到网络中进行前向传播
net.setInput(blob)
output = net.forward()# 解析输出结果
classes = ['cat', 'dog']  # 分类类别
confidence = output[0][0]  # 置信度# 打印结果
class_index = int(output[0][0])
class_label = classes[class_index]
print('Predicted class:', class_label)
print('Confidence:', confidence)# 显示图像并绘制预测结果
cv2.putText(image, f'{class_label}: {confidence:.2f}', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 0, 255), 2)
cv2.imshow('Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述代码中,需要注意以下几点:

  1. 需要先下载并准备好对应的CNN模型文件(deploy.prototxt和model.caffemodel),这些文件描述了网络的结构和参数。
  2. 使用cv2.dnn.readNetFromCaffe()函数加载预训练的CNN模型。
  3. 使用cv2.dnn.blobFromImage()函数对输入图像进行预处理,包括尺寸调整和颜色归一化等。
  4. 使用net.setInput()函数将预处理后的图像作为网络的输入。
  5. 使用net.forward()函数进行前向传播,获取网络的输出结果。
  6. 解析输出结果,得到最终的分类结果和置信度。
  7. 可以使用OpenCV的绘制函数(如cv2.putText()cv2.imshow())来显示图像和绘制预测结果。

请注意,上述示例代码仅用于说明如何使用OpenCV中的dnn模块实现卷积神经网络,具体的模型和数据准备工作需要根据实际情况进行相应的调整。
(二)循环神经网络示例代码
以下是一个使用OpenCV中的dnn模块实现循环神经网络(RNN)的示例代码:

import cv2# 加载预训练的RNN模型
net = cv2.dnn.readNetFromTensorflow('model.pb')# 加载测试数据
data = ['Hello', 'World']# 对输入数据进行预处理
input_data = []
for word in data:# 将每个单词转换为向量表示vector = [ord(c) for c in word]input_data.append(vector)# 转换为模型所需的输入格式
input_data = cv2.dnn.blobFromImages(input_data, 1.0)# 将预处理后的数据输入到网络中进行前向传播
net.setInput(input_data)
output = net.forward()# 解析输出结果
predictions = []
for i in range(len(output)):# 将输出结果转换为字符串result = ''.join([chr(int(output[i][j])) for j in range(output.shape[1])])predictions.append(result)# 打印预测结果
print('Predictions:', predictions)

在上述代码中,需要注意以下几点:

  1. 需要先下载并准备好对应的RNN模型文件(model.pb),该文件描述了网络的结构和参数。
  2. 使用cv2.dnn.readNetFromTensorflow()函数加载预训练的RNN模型。
  3. 准备测试数据,将每个输入序列转换为相应的向量表示。
  4. 使用cv2.dnn.blobFromImages()函数对输入数据进行预处理,将其转换为模型所需的输入格式。
  5. 使用net.setInput()函数将预处理后的数据作为网络的输入。
  6. 使用net.forward()函数进行前向传播,获取网络的输出结果。
  7. 解析输出结果,将每个输出序列转换为相应的字符串表示。

请注意,上述示例代码仅用于说明如何使用OpenCV中的dnn模块实现循环神经网络,具体的模型和数据准备工作需要根据实际情况进行相应的调整。
(三)生成对抗网络示例代码
以下是一个使用OpenCV中的dnn模块实现生成对抗网络(GAN)的示例代码:

import cv2
import numpy as np# 加载预训练的生成器模型
generator = cv2.dnn.readNetFromTensorflow('generator.pb')# 生成随机噪声作为输入
noise = np.random.uniform(-1, 1, size=(1, 100)).astype(np.float32)# 将噪声输入到生成器中生成图像
generator.setInput(cv2.dnn.blobFromImages(noise))
output = generator.forward()# 解析生成的图像
generated_image = output[0].transpose((1, 2, 0))
generated_image = (generated_image + 1) * 127.5  # 还原图像的像素值范围
generated_image = generated_image.astype(np.uint8)# 显示生成的图像
cv2.imshow('Generated Image', generated_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述代码中,需要注意以下几点:

  1. 需要先下载并准备好对应的生成器模型文件(generator.pb),该文件描述了GAN的生成器结构和参数。
  2. 使用cv2.dnn.readNetFromTensorflow()函数加载预训练的生成器模型。
  3. 生成随机噪声作为输入,噪声大小为(1, 100)。
  4. 使用cv2.dnn.blobFromImages()函数将噪声转换为模型所需的输入格式。
  5. 将预处理后的噪声输入到生成器中,通过调用generator.setInput()generator.forward()实现图像的生成。
  6. 解析生成的图像,将其转换为可显示的格式,还原像素值的范围。
  7. 使用OpenCV的显示函数(如cv2.imshow())显示生成的图像。

请注意,上述示例代码仅用于说明如何使用OpenCV中的dnn模块实现生成对抗网络,具体的模型和输入数据准备工作需要根据实际情况进行相应的调整。
(四)支持向量机示例代码
OpenCV确实提供了支持向量机(SVM)算法的实现。以下是一个使用OpenCV库实现支持向量机的示例代码:

import cv2
import numpy as np# 创建SVM对象
svm = cv2.ml.SVM_create()# 设置SVM的类型和内核函数
svm.setType(cv2.ml.SVM_C_SVC)
svm.setKernel(cv2.ml.SVM_LINEAR)# 生成随机分类数据
X, y = np.random.randn(100, 2), np.random.randint(0, 2, (100, 1))# 将数据转换为32位浮点型
X = np.float32(X)# 训练SVM模型
svm.train(X, cv2.ml.ROW_SAMPLE, y)# 创建测试数据
test_data = np.float32([[1, 1], [2, 2]])# 在测试数据上进行预测
_, result = svm.predict(test_data)# 打印预测结果
print('Predictions:', result)

在上述代码中,需要注意以下几点:

  1. 使用cv2.ml.SVM_create()函数创建SVM对象。
  2. 使用setType()函数设置SVM的类型,这里使用的是C-Support向量分类器。
  3. 使用setKernel()函数设置SVM的内核函数,这里使用的是线性核函数。
  4. 生成随机的二维分类数据,其中X是特征矩阵,y是标签向量。
  5. 将数据转换为32位浮点型,因为OpenCV的SVM模块要求输入数据为这种类型。
  6. 使用train()函数训练SVM模型,其中cv2.ml.ROW_SAMPLE表示每行是一个样本。
  7. 创建测试数据,并将其转换为32位浮点型。
  8. 使用predict()函数在测试数据上进行预测,获取预测结果。

请注意,上述示例代码使用的是OpenCV中的机器学习模块(cv2.ml),它提供了SVM算法的实现。如果您想在OpenCV中使用支持向量机,请参考上述示例代码。
在这里插入图片描述(五)目标检测算法示例代码
以下是一个使用OpenCV库实现目标检测算法的示例代码,基于OpenCV中的Haar特征级联分类器:

import cv2# 加载预训练的级联分类器模型
cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')# 加载图像
image = cv2.imread('image.jpg')# 转换为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 目标检测
faces = cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))# 在图像上绘制检测到的目标框
for (x, y, w, h) in faces:cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)# 显示结果图像
cv2.imshow('Detected Faces', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述代码中,需要注意以下几点:

  1. 需要先下载并准备好对应的级联分类器模型文件(haarcascade_frontalface_default.xml),该文件描述了目标检测算法的特征。
  2. 使用cv2.CascadeClassifier()函数加载预训练的级联分类器模型。
  3. 使用cv2.imread()函数加载待检测的图像。
  4. 使用cv2.cvtColor()函数将图像转换为灰度图像,因为Haar特征级联分类器通常在灰度图像上进行检测。
  5. 使用cascade.detectMultiScale()函数进行目标检测,其中scaleFactor表示每次缩小图像的比例,minNeighbors表示目标候选框的最小邻居数量,minSize表示目标的最小尺寸。
  6. 使用cv2.rectangle()函数在图像上绘制检测到的目标框。
  7. 使用cv2.imshow()函数显示结果图像。

请注意,上述示例代码仅用于说明如何使用OpenCV中的Haar特征级联分类器实现目标检测,具体的模型和输入数据准备工作需要根据实际情况进行相应的调整。同时,OpenCV还提供了其他目标检测算法,如基于深度学习的物体检测器(如SSD、YOLO等),您可以根据需求选择适合的算法进行目标检测。
(六)图像分割算法示例代码
以下是一个使用OpenCV库实现图像分割算法的示例代码,基于GrabCut算法:

import cv2
import numpy as np# 加载图像
image = cv2.imread('image.jpg')# 创建与图像相同大小的掩码
mask = np.zeros(image.shape[:2], np.uint8)# 定义背景和前景模型
bgdModel = np.zeros((1, 65), np.float64)
fgdModel = np.zeros((1, 65), np.float64)# 定义矩形区域,包含待分割的目标
rect = (50, 50, 200, 300)# 运行GrabCut算法进行图像分割
cv2.grabCut(image, mask, rect, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_RECT)# 根据分割结果生成新的掩码,将前景设置为可能的前景(3)或确定的前景(1)
mask2 = np.where((mask == 2) | (mask == 0), 0, 1).astype('uint8')# 将原始图像与新的掩码进行按位与操作,提取前景目标
segmented_image = image * mask2[:, :, np.newaxis]# 显示结果图像
cv2.imshow('Segmented Image', segmented_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述代码中,需要注意以下几点:

  1. 使用cv2.imread()函数加载待分割的图像。
  2. 创建与图像大小相同的掩码,初始值全为0。
  3. 定义背景和前景模型,用于GrabCut算法的迭代优化。
  4. 定义矩形区域,包含待分割的目标,这里使用的是矩形框选方式。
  5. 使用cv2.grabCut()函数运行GrabCut算法进行图像分割,其中传入原始图像、掩码、矩形区域以及背景和前景模型。
  6. 根据分割结果生成新的掩码,将前景设置为可能的前景(3)或确定的前景(1),背景和不确定区域设置为0。
  7. 将原始图像与新的掩码进行按位与操作,提取前景目标。
  8. 使用cv2.imshow()函数显示分割结果图像。

请注意,上述示例代码仅用于说明如何使用OpenCV中的GrabCut算法实现图像分割,具体的输入数据准备和参数调整需要根据实际情况进行相应的调整。同时,OpenCV还提供了其他图像分割算法,如基于深度学习的语义分割模型(如Mask R-CNN、DeepLab等),您可以根据需求选择适合的算法进行图像分割。
(七)人脸识别算法示例代码
以下是一个使用OpenCV库实现人脸识别算法的示例代码,基于Haar特征级联分类器:

import cv2# 加载预训练的级联分类器模型
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')# 加载图像
image = cv2.imread('image.jpg')# 转换为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 人脸检测
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))# 在图像上绘制检测到的人脸框
for (x, y, w, h) in faces:cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)# 显示结果图像
cv2.imshow('Detected Faces', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述代码中,需要注意以下几点:

  1. 需要先下载并准备好对应的级联分类器模型文件(haarcascade_frontalface_default.xml),该文件描述了人脸识别算法的特征。
  2. 使用cv2.CascadeClassifier()函数加载预训练的级联分类器模型。
  3. 使用cv2.imread()函数加载待识别的图像。
  4. 使用cv2.cvtColor()函数将图像转换为灰度图像,因为Haar特征级联分类器通常在灰度图像上进行检测。
  5. 使用face_cascade.detectMultiScale()函数进行人脸检测,其中scaleFactor表示每次缩小图像的比例,minNeighbors表示目标候选框的最小邻居数量,minSize表示人脸的最小尺寸。
  6. 使用cv2.rectangle()函数在图像上绘制检测到的人脸框。
  7. 使用cv2.imshow()函数显示结果图像。

请注意,上述示例代码仅用于说明如何使用OpenCV中的Haar特征级联分类器实现人脸识别,具体的模型和输入数据准备工作需要根据实际情况进行相应的调整。同时,OpenCV还提供了其他人脸识别算法,如基于深度学习的人脸检测器(如MTCNN、Dlib等),您可以根据需求选择适合的算法进行人脸识别。
(八)姿态估计算法示例代码
以下是一个使用OpenCV库实现姿态估计算法的示例代码,基于Dlib库和68个关键点:

import cv2
import dlib# 加载预训练的人脸检测器和关键点检测器模型
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')# 加载图像
image = cv2.imread('image.jpg')# 转换为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 人脸检测
faces = detector(gray)# 对每张人脸进行关键点检测和姿态估计
for face in faces:# 关键点检测landmarks = predictor(gray, face)# 获取关键点坐标shape = []for i in range(68):x = landmarks.part(i).xy = landmarks.part(i).yshape.append((x, y))# 在图像上绘制关键点cv2.circle(image, (x, y), 3, (0, 255, 0), -1)# 姿态估计image_points = np.array(shape, dtype='double')model_points = np.array([(6.825897, 6.760612, 4.402142),     # 左眼角(1.330353, 7.122144, 6.903745),     # 右眼角(-1.330353, 7.122144, 6.903745),    # 鼻尖(-6.825897, 6.760612, 4.402142),    # 左嘴角(6.825897, 6.760612, 4.402142)      # 右嘴角])focal_length = image.shape[1]center = (image.shape[1] / 2, image.shape[0] / 2)camera_matrix = np.array([[focal_length, 0, center[0]], [0, focal_length, center[1]], [0, 0, 1]], dtype='double')dist_coeffs = np.zeros((4, 1))(success, rotation_vector, translation_vector) = cv2.solvePnP(model_points, image_points, camera_matrix, dist_coeffs)# 投影姿态估计结果(nose_end_point2D, jacobian) = cv2.projectPoints(np.array([(0.0, 0.0, 1000.0)]), rotation_vector, translation_vector, camera_matrix, dist_coeffs)p1 = (int(image_points[2][0]), int(image_points[2][1]))p2 = (int(nose_end_point2D[0][0][0]), int(nose_end_point2D[0][0][1]))cv2.line(image, p1, p2, (255, 0, 0), 2)# 显示结果图像
cv2.imshow('Pose Estimation', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上述代码中,需要注意以下几点:

  1. 需要先下载并准备好对应的人脸检测器模型(shape_predictor_68_face_landmarks.dat),该模型用于人脸关键点检测。
  2. 使用dlib.get_frontal_face_detector()函数加载预训练的人脸检测器模型。
  3. 使用dlib.shape_predictor()函数加载预训练的关键点检测器模型。
  4. 使用cv2.imread()函数加载待识别的图像。
  5. 使用cv2.cvtColor()函数将图像转换为灰度图像,因为人脸检测和关键点检测通常在灰度图像上进行。
  6. 使用人脸检测器模型检测图像中的人脸。
  7. 对每张人脸使用关键点检测器模型获取关键点坐标,并在图像上绘制关键点。
  8. 使用姿态估计算法(cv2.solvePnP()函数)估计人脸的姿态。
  9. 将姿态估计结果投影到图像上,绘制一个从鼻尖到图像外围的线段,以显示人脸的朝向。
  10. 使用cv2.imshow()函数显示结果图像。

请注意,上述示例代码仅用于说明如何使用OpenCV和Dlib库实现姿态估计算法,具体的模型和输入数据准备工作需要根据实际情况进行相应的调整。同时,还有其他姿态估计算法和模型可供选择,如基于深度学习的3D人脸姿态估计模型(如PRNet、3DDFA等),您可以根据需求选择适合的算法进行姿态估计。

四、归纳总结

在这里插入图片描述OpenCV是一个功能强大的计算机视觉库,它不仅支持传统的计算机视觉算法,还提供了对深度学习模型的集成和支持。下面是关于OpenCV深度学习的一些归纳总结:

  1. 深度学习模块:OpenCV通过"DNN"(Deep Neural Networks)模块提供对深度学习模型的支持。该模块可以加载和运行训练好的深度学习模型,包括各种网络架构和预训练模型,如Caffe、TensorFlow、Torch等。

  2. 模型加载与推理:OpenCV可以加载各种深度学习模型的权重和配置文件,并进行推理。它提供了函数来加载模型、设置输入数据、运行前向传播,并获取输出结果。通过这些函数,可以轻松地将深度学习模型集成到OpenCV的计算机视觉流程中。

  3. 预训练模型支持:OpenCV支持许多常用的预训练深度学习模型,如图像分类(如AlexNet、VGG、ResNet)、目标检测(如SSD、YOLO)和语义分割(如DeepLab),这些模型在大规模数据集上进行了训练,并具有强大的性能。

  4. 模型优化:OpenCV提供了一些优化技术,如模型量化(Model Quantization)和模型压缩(Model Compression),以减小深度学习模型的体积和推理时的计算量,从而提高模型在嵌入式设备上的性能和效率。

  5. 模型部署:OpenCV支持将训练好的深度学习模型部署到各种平台和设备上,包括桌面、移动设备和嵌入式系统。这使得开发者可以方便地将深度学习模型应用于各种实际场景中。在这里插入图片描述

总之,OpenCV的深度学习模块为开发者提供了方便且高效的工具,使他们能够在计算机视觉任务中充分利用深度学习的优势。通过OpenCV,开发者可以轻松加载、运行和部署深度学习模型,从而加速开发过程并实现更高水平的计算机视觉应用。

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

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

相关文章

【UVM源码】UVM Config_db机制使用总结与源码解析

UVM Config_db机制使用总结与源码解析 UVM Config_db机制介绍UVM Config_db 机制引入的背景基本介绍使用方法优缺点: UVM Config_db机制使用示例:UVM Config_db使用高阶规则Config_db资源优先级 UVM Config_db 源码解析 UVM Config_db机制介绍 UVM Conf…

idea引入ojdbc包报错

网上下载或者让同事传两个jar过来,ojdbc6-11.2.0.7.0.jar 以及jconn3.0.jar 放入同一个文件夹中: 在此文件夹中cmd如下:回车,进入cmd控制台。 输入如下两个命令: mvn install:install-file -DgroupIdcom.oracle -Dar…

【网络】:网络套接字

网络套接字 一.网络字节序二.端口号三.socket1.常见的API2.封装UdpSocket 网络通信的本质就是进程间通信。 一.网络字节序 我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分, 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分,网络数据流同样有大…

可曾听闻Nginx?

目录 一.简介 二.Nginx的优点 三.反向代理 四.负载均衡 五.动静分离 六.总结 说起Nginx,耳边好像经常听到,但是不知道用来干嘛的。最近用到了,所以我就大概总结了基本知识,它经常与一个词出现在一起——反向代理。那接下来…

配置华为交换机环路检测案例

知识改变命运,技术就是要分享,有问题随时联系,免费答疑,欢迎联系! 厦门微思网络​​​​​​https://www.xmws.cn 华为认证\华为HCIA-Datacom\华为HCIP-Datacom\华为HCIE-Datacom 思科认证\CCNA\CCNP\CCIE Linux\RHCE…

YOLOv5可视化热力图 | 支持自定义模型、置信度选择等功能(论文必备)

一、本文介绍 本文给大家带来的机制是的可视化热力图功能,热力图作为我们论文当中的必备一环,可以展示出我们呈现机制的有效性,本文的内容支持YOLOv5最新版本,同时支持视频讲解,本文的内容是根据检测头的输出内容,然后来绘图。 在开始之前给大家推荐一下我的专栏,本专…

Vue服务器端渲染(SSR)是不是技术的倒退?

一、什么是服务器端渲染,是不是技术退步? Vue服务器端渲染(Vue Server-Side Rendering,简称SSR)是一种将Vue组件在服务器端进行渲染,生成最终的HTML页面,然后将其发送给客户端的技术。 传统的V…

烧录软件(Renesas Flash Programmer)瑞萨RL78G12系列单片机下载工具(E2)的软件配置与硬件链接说明

一、单片机与仿真器连接 E1引脚接线图 RL78系列单片机的GND接仿真器的pin2、pin12、pin14 RL78系列单片机的VDD接仿真器的pin8 RL78系列单片机的Tool0接仿真器的pin5 RL78系列单片机的Reset接仿真器的pin10、pin13 二、确认接线完成后,开始烧录 1、打开RFPV软件…

C 练习实例50-使用Dev-C++创建项目(圆形体体积计算器)

项目展示 项目案例&#xff1a;圆形体体积计算器 vol.h文件 #include <stdio.h> #include <math.h> #define PI 3.141592654 void cal(int sel); //函数声明 double vol_ball(void); double vol_cylind(void); double vol_cone(void); main.c文件 #include &quo…

【数字通信】数字带通传输

数字调制和数字带通传输系统 数字调制解调 数字调制 用数字基带信号控制载波&#xff0c;把数字基带信号变换为数字带通信号的过程 目的&#xff1a;数字基带信号含大量低频分量&#xff0c;无法通过具有带通特性的信道传输。需对数字基带信号进行数字调制使信号与信道的特…

网际协议 IP、IP地址

目录 网际协议 IP 虚拟互连网络 使用中间设备进行互连 IP 地址 IP 地址及其表示方法 ​编辑 IP 地址采用 2 级结构 IP 地址的编址方法 分类的 IP 地址 各类 IP 地址的指派范围 一般不使用的特殊的 IP 地址 IPv4网络中的地址类型 分类的 IP 地址的优点和缺点 划分子网…

数字媒体技术基础之:声波及其测量

声音始于空气中的振动&#xff0c;如吉他弦、人的声带或扬声器纸盆产生的振动。 这些振动一起推动邻近的空气分子&#xff0c;从而轻微增加空气压力。 压力下的空气分子随后推动周围的空气分子&#xff0c;后者又推动下一组分子&#xff0c;依此类推。 高压区域穿过空气时&…

链表中倒数第k个结点

题目描述 输入一个链表&#xff0c;输出该链表中倒数第k个结点。 这道题首先按照普通的方法用一个栈来存放链表数据然后在取出第k的数就可以了,但是这种方法的时间复杂度是O(n),不提倡; 现在我介绍一种时间复杂度为O(n-k)的方法,老规矩-->先贴源码,在分析: /*public clas…

SpringSecurity笔记

SpringSecurity 本笔记来自三更草堂&#xff1a;https://www.bilibili.com/video/BV1mm4y1X7Hc/?spm_id_from333.337.search-card.all.click&#xff0c;仅供个人学习使用 简介 Spring Security是Spring家族中的一个安全管理框架。相比与另外一个安全框架Shiro&#xff0c;…

Leetcode刷题笔记题解(C++):1117. H2O 生成(多线程)

思路&#xff1a; 解法二&#xff1a;生产者-消费者解法 1.把 hydrogen 线程看作生产者&#xff0c;oxygen 线程看作消费者&#xff0c;缓冲队列大小为2。 2.hydrogen 把生成的氢放入队列&#xff1b;oxygen 线程每次从队列里消费两个氢元素。 3.生产者生产两个氢元素后会因为…

【极数系列】Linux环境搭建Flink1.18版本 (03)

文章目录 引言01 Linux部署JDK11版本1.下载Linux版本的JDK112.创建目录3.上传并解压4.配置环境变量5.刷新环境变量6.检查jdk安装是否成功 02 Linux部署Flink1.18.0版本1.下载Flink1.18.0版本包2.上传压缩包到服务器3.修改flink-config.yaml配置4.启动服务5.浏览器访问6.停止服务…

二叉树--199. 二叉树的右视图/medium 理解度C

199. 二叉树的右视图 1、题目2、题目分析3、复杂度最优解代码示例4、适用场景 1、题目 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出…

贪吃蛇项目(基于C语言和数据结构中的链表)

建立文件 首先先建立3个文件。 Snake.h 函数的声明 Snake.c 函数的定义 Test.c 贪吃蛇的测试 分析项目 我们分析这整个项目 建立节点 首先在我们实现游戏开始的部分之前&#xff0c;我们要先创建贪吃蛇的节点&#xff0c;再由此创建整个贪吃蛇所包含的一些信息&#…

基于对比学习的信息抽取

Label Refinement via Contrastive Learning for Distantly-Supervised Named Entity Recognition NAACL 2022&#xff1b;做的远程监督NER&#xff0c;通过知识库构建 伪标签&#xff0c;通过对比学习构建负样本&#xff0c;负样本是entity的多余部分或其他不相关部分。即对e…

【Vite+Vue3+TS】基于Vite+Vue3+TypeScript+ESLint+Prettier+Stylelint搭建项目(亲测超详细)

目 录 项目搭建步骤确定node版本使用Vite创建Vue3项目规范目录结构配置环境修改Vite配置文件集成路由工具Vue Router集成状态管理工具Pinia集成CSS预编译器Sassvite-plugin-svg-icons图标组件集成UI框架Element Plus集成HTTP 请求工具 Axios 项目代码规范集成ESLint配置集成Pre…