当前位置: 首页 > news >正文

OpenCV车牌识别技术详解

第一部分:图像预处理

车牌识别(License Plate Recognition,LPR)是计算机视觉领域的一个重要应用,它涉及到图像处理、模式识别等多个方面。OpenCV作为一个强大的计算机视觉库,提供了丰富的车牌识别相关功能。本文将详细介绍OpenCV中的车牌识别技术,包括图像预处理、车牌定位、字符分割和字符识别等,并配合Python代码示例来演示如何实现这些功能。

1.1 图像读取与显示

在车牌识别中,首先需要读取和显示车牌图像。OpenCV提供了cv2.imread()函数来读取图像,并使用cv2.imshow()函数来显示图像。

import cv2
import numpy as np# 读取图像
image = cv2.imread('car_plate.jpg')# 显示图像
cv2.imshow('Car Plate', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • cv2.imread()函数读取图像,返回一个NumPy数组。
  • cv2.imshow()函数在窗口中显示图像。
  • cv2.waitKey(0)函数等待按键事件,cv2.destroyAllWindows()函数用于关闭所有OpenCV创建的窗口。

1.2 图像灰度化

车牌识别中,通常需要将彩色图像转换为灰度图像,以减少计算量和提高识别的准确性。OpenCV提供了cv2.cvtColor()函数来实现图像的灰度化。

# 转换图像为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 显示灰度图像
cv2.imshow('Gray Image', gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • cv2.cvtColor()函数接受一个图像数组和一个表示源颜色空间和目标颜色空间的标志,返回一个灰度图像数组。

1.3 图像二值化

二值化是将图像转换为黑白图像的过程,其中白色区域代表感兴趣的区域,黑色区域代表背景。OpenCV提供了cv2.threshold()函数来实现图像的二值化。

# 应用阈值化
_, binary_image = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)# 显示二值图像
cv2.imshow('Binary Image', binary_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • cv2.threshold()函数接受一个图像数组、阈值和最大值,以及一个表示阈值类型的标志,返回一个二值图像数组。

1.4 图像形态学操作

形态学操作是一种基于数学形态学的图像处理方法,包括膨胀、腐蚀、开运算和闭运算等。OpenCV提供了cv2.erode()cv2.dilate()cv2.morphologyEx()等函数来实现形态学操作。

# 创建一个膨胀核
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))# 应用膨胀操作
dilated_image = cv2.dilate(binary_image, kernel, iterations=1)# 显示膨胀后的图像
cv2.imshow('Dilated Image', dilated_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • cv2.getStructuringElement()函数创建一个结构元素,用于形态学操作。
  • cv2.dilate()函数应用膨胀操作,扩大感兴趣区域。

1.5 图像轮廓提取

轮廓提取是图像分析中的一个重要步骤,特别是在车牌识别中,它可以帮助我们识别出车牌的边界。OpenCV提供了cv2.findContours()函数来提取图像的轮廓。

import cv2
import numpy as np# 读取图像
image = cv2.imread('car_plate.jpg')# 转换图像为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 应用阈值化
_, binary_image = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)# 应用形态学操作(例如,开运算)以增强轮廓
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
opening = cv2.morphologyEx(binary_image, cv2.MORPH_OPEN, kernel)# 提取轮廓
contours, _ = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 绘制轮廓
for contour in contours:cv2.drawContours(image, contours, -1, (0, 255, 0), 2)# 显示结果
cv2.imshow('Car Plate with Contours', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • cv2.getStructuringElement()函数创建一个结构元素,用于形态学操作。
  • cv2.morphologyEx()函数应用形态学操作,如开运算,以增强轮廓。
  • cv2.findContours()函数接受一个二值图像数组和一个轮廓检索模式,返回一个轮廓列表和一个轮廓层次结构。
  • cv2.drawContours()函数在原始图像上绘制轮廓。

1.6 车牌定位

车牌定位是车牌识别系统中的第一步,它的目标是找到车牌在图像中的位置。OpenCV提供了多种方法来实现车牌定位,包括基于边缘检测的方法和基于颜色分割的方法。

# 假设我们已经提取了车牌的轮廓
# contours = cv2.findContours(binary_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 假设我们已经有了一个车牌轮廓
contour = np.array([[100, 100], [200, 100], [200, 200], [100, 200]])# 计算轮廓的包围盒
x, y, w, h = cv2.boundingRect(contour)# 绘制车牌位置
cv2.rectangle(image, (x, y), (x+w, y+h), (0, 0, 255), 2)# 显示结果
cv2.imshow('Car Plate Position', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • cv2.boundingRect()函数计算轮廓的包围盒,返回左上角坐标和宽高。
  • cv2.rectangle()函数在原始图像上绘制车牌位置的矩形框。

总结

本节介绍了OpenCV中的图像预处理技术,包括图像读取与显示、图像灰度化、图像二值化、图像形态学操作和图像轮廓提取。通过Python代码示例,展示了如何使用这些功能来处理车牌图像,为后续的车牌定位和字符分割做好准备。这些预处理步骤是车牌识别系统中不可或缺的部分,它们有助于提高识别的准确性和效率。后续文章将继续介绍OpenCV的其他功能模块和技术原理。

第二部分:车牌定位

车牌定位是车牌识别系统中的第一步,它的目标是找到车牌在图像中的位置。OpenCV提供了多种方法来实现车牌定位,包括基于边缘检测的方法和基于颜色分割的方法。本节将详细介绍这些方法及其背后的技术原理。

2.1 基于边缘检测的方法

边缘检测是计算机视觉中的一种基本技术,它旨在检测图像中亮度变化明显的点。OpenCV提供了多种边缘检测算法,如Sobel、Canny等。

import cv2
import numpy as np# 读取图像
image = cv2.imread('car_plate.jpg')# 转换图像为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 应用Canny边缘检测
edges = cv2.Canny(gray_image, 100, 200)# 显示边缘检测结果
cv2.imshow('Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • cv2.Canny()函数实现Canny边缘检测算法,它是一种多阶段算法,用于消除噪声并精确地找到边缘。

2.2 基于颜色分割的方法

颜色分割是根据图像的颜色信息来分割图像的一种方法。OpenCV提供了cv2.inRange()函数来实现颜色分割。

import cv2.cv2 as cv2
import numpy as np# 读取图像
image = cv2.imread('car_plate.jpg')# 转换图像为HSV格式
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)# 定义颜色范围
lower_blue = np.array([90, 50, 50])
upper_blue = np.array([130, 255, 255])# 应用颜色分割
blue_mask = cv2.inRange(hsv_image, lower_blue, upper_blue)# 显示颜色分割结果
cv2.imshow('Blue Mask', blue_mask)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • cv2.inRange()函数根据指定的颜色范围,创建一个二值图像,其中在颜色范围内的像素值为255,其余像素值为0。

2.3 车牌定位技术的应用

车牌定位技术在人脸识别系统中具有广泛的应用,例如交通监控、违章检测等。通过准确快速地定位车牌位置,可以进一步进行车牌字符分割和识别等高级处理。

总结

本节介绍了OpenCV中的车牌定位技术,包括基于边缘检测的方法和基于颜色分割的方法。通过Python代码示例,展示了如何使用这些方法来定位车牌在图像中的位置。车牌定位是人脸识别系统中的关键步骤,为后续的字符分割和识别提供了重要的支持。后续文章将继续介绍OpenCV的其他功能模块和技术原理。

第三部分:字符分割

字符分割是将车牌图像中的字符区域从背景中分离出来,以便进行字符识别。OpenCV提供了多种字符分割方法,包括基于边缘检测的方法、基于连通域的方法和基于形态学的方法。本节将详细介绍这些方法及其背后的技术原理。

3.1 基于边缘检测的方法

在车牌识别中,字符通常具有清晰的边缘,可以使用边缘检测方法来分割字符区域。OpenCV提供了多种边缘检测算法,如Sobel、Canny等。

import cv2
import numpy as np# 读取图像
image = cv2.imread('car_plate.jpg')# 转换图像为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 应用Canny边缘检测
edges = cv2.Canny(gray_image, 100, 250)# 显示边缘检测结果
cv2.imshow('Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • cv2.Canny()函数实现Canny边缘检测算法,它是一种多阶段算法,用于消除噪声并精确地找到边缘。

3.2 基于连通域的方法

连通域是指图像中具有相同像素值的相邻像素点的集合。OpenCV提供了cv2.connectedComponentsWithStats()函数来检测图像中的连通域。

import cv2
import numpy as np# 读取图像
image = cv2.imread('car_plate.jpg')# 转换图像为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 应用阈值化
_, binary_image = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)# 检测连通域
num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(binary_image, connectivity=8)# 显示连通域统计信息
for i in range(1, num_labels):x, y, w, h = stats[i]cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)# 显示结果
cv2.imshow('Connected Components', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • cv2.connectedComponentsWithStats()函数检测图像中的连通域,并返回连通域的数量、标签、边界框统计信息等。

3.3 基于形态学的方法

形态学方法是一种基于数学形态学的图像处理方法,包括膨胀、腐蚀、开运算和闭运算等。OpenCV提供了cv2.morphologyEx()函数来实现形态学操作。

import cv2.cv2 as cv2
import numpy as np# 读取图像
image = cv2.imread('car_plate.jpg')# 转换图像为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 应用阈值化
_, binary_image = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)# 创建一个结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))# 应用开运算
opening = cv2.morphologyEx(binary_image, cv2.MORPH_OPEN, kernel)# 显示开运算结果
cv2.imshow('Opening', opening)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • cv2.morphologyEx()函数应用形态学操作,如开运算,以分割字符区域。

3.4 字符分割技术的应用

字符分割技术在人脸识别系统中具有广泛的应用,例如交通监控、违章检测等。通过准确快速地分割字符区域,可以进行字符识别、车牌识别等高级处理。

3.5 基于边缘检测的连通域分析

在实际应用中,我们通常会结合使用边缘检测和连通域分析来更准确地分割字符区域。通过边缘检测,我们可以得到字符的大致轮廓,然后使用连通域分析来进一步细化这些轮廓。

import cv2
import numpy as np# 读取图像
image = cv2.imread('car_plate.jpg')# 转换图像为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 应用Canny边缘检测
edges = cv2.Canny(gray_image, 100, 250)# 应用阈值化
_, binary_image = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)# 检测连通域
num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(binary_image, connectivity=8)# 显示连通域统计信息
for i in range(1, num_labels):x, y, w, h = stats[i]cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)# 显示结果
cv2.imshow('Connected Components', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • cv2.connectedComponentsWithStats()函数结合了边缘检测和连通域分析,它返回连通域的数量、标签、边界框统计信息等。

3.6 基于形态学的连通域细化

在使用连通域分析之后,我们可能需要进一步细化连通域的边界,以提高字符分割的准确性。OpenCV的形态学操作可以用来细化连通域的边界。

import cv2.cv2 as cv2
import numpy as np# 读取图像
image = cv2.imread('car_plate.jpg')# 转换图像为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 应用阈值化
_, binary_image = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)# 创建一个结构元素
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))# 应用开运算
opening = cv2.morphologyEx(binary_image, cv2.MORPH_OPEN, kernel)# 显示开运算结果
cv2.imshow('Opening', opening)
cv2.waitKey(0)
cv2.destroyAllWindows()
  • cv2.morphologyEx()函数应用形态学操作,如开运算,以细化连通域的边界。

总结

本节介绍了OpenCV中的字符分割技术,包括基于边缘检测的方法、基于连通域的方法和基于形态学的方法。通过Python代码示例,展示了如何使用这些方法来分割车牌图像中的字符区域。字符分割是人脸识别系统中的关键步骤,为后续的字符识别和车牌识别提供了重要的支持。后续文章将继续介绍OpenCV的其他功能模块和技术原理。

第四部分:字符识别

字符识别是人脸识别系统中的最后一步,它的目标是识别出车牌图像中的字符。OpenCV提供了多种字符识别方法,包括基于特征的方法和基于深度学习的方法。本节将详细介绍这些方法及其背后的技术原理。

4.1 基于特征的方法

基于特征的方法是通过提取图像的特征来识别字符。常见的特征包括SIFT、SURF和ORB等。

import cv2
import numpy as np# 读取字符图像
character_image = cv2.imread('character.jpg')# 创建SIFT对象
sift = cv2.SIFT_create()# 检测关键点和计算描述子
kp, des = sift.detectAndCompute(character_image, None)# 显示关键点和描述子
cv2.imshow('Keypoints', cv2.drawKeypoints(character_image, kp, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS))
cv2.waitKey(0)
cv2.destroyAllWindows()
  • cv2.SIFT_create()函数创建一个SIFT对象。
  • sift.detectAndCompute()函数在字符图像上检测关键点并计算描述子。
  • cv2.drawKeypoints()函数用于绘制关键点。

4.2 基于深度学习的方法

深度学习方法是一种强大的机器学习技术,它可以处理复杂的特征表示。OpenCV提供了多种深度学习模型,如Haar级联分类器、LBP级联分类器和深度学习模型。

import cv2
import numpy as np# 加载预训练的深度学习模型
model = cv2.dnn.readNetFromTensorflow('character_recognition_model.pb')# 预处理图像
blob = cv2.dnn.blobFromImage(character_image, 1.0, (227, 227), (104.0, 177.0, 123.0), swapRB=True, crop=False)# 设置模型的输入
model.setInput(blob)# 进行预测
prediction = model.forward()# 打印预测结果
print('Predicted Character:', prediction)
  • cv2.dnn.readNetFromTensorflow()函数加载预训练的深度学习模型。
  • cv2.dnn.blobFromImage()函数将图像预处理为模型所需的格式。
  • model.setInput()函数设置模型的输入。
  • model.forward()函数进行预测。

总结

本节介绍了OpenCV中的字符识别技术,包括基于特征的方法和基于深度学习的方法。通过Python代码示例,展示了如何使用这些方法来识别车牌图像中的字符。字符识别是人脸识别系统中的最后一步,通过准确识别出字符,我们可以得到完整的车牌信息。后续文章将继续介绍OpenCV的其他功能模块和技术原理。

第五部分:车牌识别系统的集成与优化

在完成了图像预处理、车牌定位、字符分割和字符识别之后,我们需要将这些步骤集成到一个完整的车牌识别系统中,并进行优化以提高系统的性能。本节将介绍如何将这些步骤集成到一个Python脚本中,并讨论一些优化的策略。

5.1 集成车牌识别系统

集成车牌识别系统意味着将所有的步骤(图像预处理、车牌定位、字符分割和字符识别)组合在一起,形成一个完整的流程。

import cv2
import numpy as npdef recognize_license_plate(image_path):# 读取图像image = cv2.imread(image_path)# 图像预处理gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)_, binary_image = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)# 车牌定位# 假设我们已经有了一个车牌轮廓contour = np.array([[100, 100], [200, 100], [200, 200], [100, 200]])x, y, w, h = cv2.boundingRect(contour)# 字符分割# 假设我们已经有了一个分割的字符区域characters = [cv2.imread('character1.jpg'), cv2.imread('character2.jpg'), cv2.imread('character3.jpg')]# 字符识别# 假设我们已经有了一个字符识别模型model = cv2.dnn.readNetFromTensorflow('character_recognition_model.pb')for i, character in enumerate(characters):blob = cv2.dnn.blobFromImage(character, 1.0, (227, 227), (104.0, 177.0, 123.0), swapRB=True, crop=False)model.setInput(blob)prediction = model.forward()print(f'Character {i+1}: {prediction}')# 使用车牌识别系统
image_path = 'car_plate.jpg'
recognize_license_plate(image_path)
  • recognize_license_plate函数接受一个图像路径,并执行车牌识别的完整流程。
  • cv2.imread()函数读取图像。
  • cv2.cvtColor()函数转换图像颜色空间。
  • cv2.threshold()函数应用阈值化。
  • cv2.boundingRect()函数计算轮廓的包围盒。
  • cv2.dnn.blobFromImage()函数将图像预处理为模型所需的格式。
  • cv2.dnn.readNetFromTensorflow()函数加载预训练的深度学习模型。

5.2 系统优化策略

为了提高车牌识别系统的性能,我们可以采取以下优化策略:

  1. 特征选择:选择最有效的特征,如SIFT、SURF或ORB,以提高字符识别的准确性。
  2. 模型训练:使用大量标注数据对深度学习模型进行训练,以提高模型对各种车牌字符的识别能力。
  3. 实时处理:优化图像预处理和字符识别的步骤,以提高整个系统的处理速度。
  4. 错误处理:添加错误处理机制,以处理可能出现的识别错误,例如字符识别不准确或车牌定位失败。

总结

本节介绍了如何将OpenCV中的车牌识别技术集成到一个完整的系统中,并讨论了一些优化策略以提高系统的性能。通过这些步骤,我们可以构建一个高效、准确的车牌识别系统,用于各种实际应用,如交通监控、违章检测等。后续文章将继续介绍OpenCV的其他功能模块和技术原理,以帮助读者更深入地理解和应用计算机视觉技术。

总结

在本系列的OpenCV车牌识别技术详解中,我们深入探讨了OpenCV在人脸识别领域的功能和技术。从图像预处理、车牌定位、字符分割到字符识别,我们通过Python代码示例展示了如何使用OpenCV库来实现这些功能。

  • 图像预处理:我们介绍了如何读取和显示图像,以及如何将图像转换为灰度图像、二值图像,应用形态学操作和提取轮廓。
  • 车牌定位:我们探讨了基于边缘检测和颜色分割的方法,以及如何使用连通域分析和形态学方法来更准确地定位车牌位置。
  • 字符分割:我们介绍了基于边缘检测、连通域分析和形态学的方法,以及如何结合使用这些方法来分割字符区域。
  • 字符识别:我们介绍了基于特征的方法和基于深度学习的方法,以及如何使用这些方法来识别车牌图像中的字符。
  • 系统集成与优化:我们介绍了如何将所有的步骤集成到一个完整的车牌识别系统中,并讨论了一些优化的策略以提高系统的性能。

通过这些技术和策略,OpenCV可以帮助我们构建高效、准确的车牌识别系统。这些技术在交通监控、违章检测等应用中有着广泛的应用。随着计算机视觉技术的不断发展,OpenCV将继续提供更多强大的功能,以满足不断增长的应用需求。后续文章将继续介绍OpenCV的其他功能模块和技术原理,帮助读者更好地理解和应用计算机视觉技术。

相关文章:

OpenCV车牌识别技术详解

第一部分:图像预处理 车牌识别(License Plate Recognition,LPR)是计算机视觉领域的一个重要应用,它涉及到图像处理、模式识别等多个方面。OpenCV作为一个强大的计算机视觉库,提供了丰富的车牌识别相关功能…...

解决llama_index中使用Ollama出现timed out 问题

现象: File "~/anaconda3/envs/leo_py38/lib/python3.8/site-packages/httpx/_transports/default.py", line 86, in map_httpcore_exceptionsraise mapped_exc(message) from exc httpx.ReadTimeout: timed out代码: from llama_index.core …...

Python爬虫技术 第14节 HTML结构解析

HTML 结构解析是 Web 爬虫中的核心技能之一,它允许你从网页中提取所需的信息。Python 提供了几种流行的库来帮助进行 HTML 解析,其中最常用的是 BeautifulSoup 和 lxml。 1. 安装必要的库 首先,你需要安装 requests(用于发送 HTT…...

【vue3|第18期】Vue-Router路由的三种传参方式

日期:2024年7月17日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^ 1.01365 = 37.7834;0.99365 = 0.0255 1.02365 = 1377.408…...

ElasticSearch(六)— 全文检索

一、match系列查询 前面讲到的query中的查询,都是精准查询。可以理解成跟在关系型数据库中的查询类似。match系列的查询,是全文检索的查询。会通过分词进行评分,匹配,再返回搜索结果。 1.1 match 查询 "query": {&qu…...

Oracle核心进程详解并kill验证

Oracle核心进程详解并kill验证 文章目录 Oracle核心进程详解并kill验证一、说明二、核心进程详解2.1.PMON-进程监控进程2.2.SMON-系统监控进程2.3.DBWn-数据库块写入进程2.4. LGWR-日志写入器进程2.5. CKPT-检查点进程 三、Kill验证3.1.kill ckpt进程3.2.kill pmon进程3.3.kill…...

【BUG】已解决:SyntaxError:positional argument follows keyword argument

SyntaxError:positional argument follows keyword argument 目录 SyntaxError:positional argument follows keyword argument 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰&#xff0c…...

怎样在 Nginx 中配置基于请求客户端 Wi-Fi 连接状态的访问控制?

🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会! 文章目录 怎样在 Nginx 中配置基于请求客户端 Wi-Fi 连接状态的访问控制一、理解请求客户端 Wi-Fi 连接状态二、Nginx 中的访问控制基础知识三、获取客户端 Wi-Fi 连接状态…...

逆向案例二十九——某品威客登录,请求头参数加密,简单webpack

网址:登录- 一品威客网,创新型知识技能共享服务平台 抓到登陆包分析,发现请求头有参数加密,直接搜索 定位到加密位置,打上断点,很明显是对象f的a方法进行了加密。 往上找f,可以发现f被定义了,是…...

河道高效治理新策略:视频AI智能监控如何助力河污防治

一、背景与现状 随着城市化进程的加快,河道污染问题日益严重,对生态环境和居民生活造成了严重影响。为了有效治理河道污染,提高河道管理的智能化水平,TSINGSEE青犀提出了一套河污治理视频智能分析及管理方案。方案依托先进的视频…...

[React]如何提高大数据量场景下的Table性能?

[React]如何提高大数据量场景下的Table性能? 两个方向:虚拟列表,发布订阅 虚拟列表 虚拟列表实际上只对可视区域的数据项进行渲染 可视区域(visibleHeight): 根据屏幕可视区域动态计算或自定义固定高度数据渲染项&…...

基于Vision Transformer的mini_ImageNet图片分类实战

【图书推荐】《PyTorch深度学习与计算机视觉实践》-CSDN博客 PyTorch计算机视觉之Vision Transformer 整体结构-CSDN博客 mini_ImageNet数据集简介与下载 mini_ImageNet数据集节选自ImageNet数据集。ImageNet是一个非常有名的大型视觉数据集,它的建立旨在促进视觉…...

JS中map()使用记录

优点和缺点 总的来说,map() 方法是一个强大的工具,适合于需要将数组中的每个元素转换为新形式的情况。然而,对于性能敏感的应用或需要更复杂控制逻辑的场景,可能需要考虑其他方法。 优点: 函数式编程风格&#xff1a…...

JavaWeb学习——请求响应、分层解耦

目录 一、请求响应学习 1、请求 简单参数 实体参数 数组集合参数 日期参数 Json参数 路径参数 总结 2、响应 ResponseBody&统一响应结果 二、分层解耦 1、三层架构 三层架构含义 架构划分 2、分层解耦 引入概念 容器认识 3、IOC&DI入门 4、IOC详解 …...

Vue中!.和?.是什么意思

在Vue(或更广泛地说,在JavaScript和TypeScript中),!. 和 ?. 是两个与可选链(Optional Chaining)和断言非空(Non-null Assertion)相关的操作符,它们分别用于处理可能为nu…...

秋招突击——7/22——复习{堆——前K个高频元素}——新作{回溯——单次搜索、分割回文串。链表——环形链表II,合并两个有序链表}

文章目录 引言复习堆堆——前K个高频元素个人实现复习实现二参考实现 新作单词搜索个人实现参考实现 分割回文串个人实现参考实现 环形链表II个人实现参考实现 两个有序链表个人实现 总结 引言 又是充满挑战性的一天,继续完成我们的任务吧!继续往下刷&a…...

android13禁用某个usb设备

总纲 android13 rom 开发总纲说明 目录 1.前言 2.触摸设备查看 3.功能修改 3.1 禁用usb触摸 3.2 禁用usb键盘 3.3 禁用usb遥感 4.查看生效与否 5.彩蛋 1.前言 用户想要禁止使用某些usb设备,需要系统不能使用相关的usb设备,例如usb触摸屏,usb键盘,usb遥感等等usb…...

tmux相关命令

tmux相关命令 1、tmux介绍2、会话(session)、窗口(windows)、窗格(pane)3、会话相关命令4、窗口相关命令5、窗格相关命令6、内容查看7、tmux配置文件 1、tmux介绍 略 2、会话(session&#xf…...

初创小程序公司怎么选服务器合作商

初创小程序公司怎么选服务器合作商?在移动互联网的浪潮中,小程序以其轻量、便捷、即用即走的特点,成为了众多初创企业快速触达用户、展现创意与服务的理想平台。然而,对于初创小程序公司而言,如何在纷繁复杂的服务器市…...

基于微信小程序+SpringBoot+Vue的自习室选座与门禁系统(带1w+文档)

基于微信小程序SpringBootVue的自习室选座与门禁系统(带1w文档) 基于微信小程序SpringBootVue的自习室选座与门禁系统(带1w文档) 本课题研究的研学自习室选座与门禁系统让用户在小程序端查看座位,预定座位,支付座位价格,该系统让用户预定座位…...

【Linux】进程IO|重定向|缓冲区|dup2|dup|用户级缓冲区|模拟缓冲区

目录 前言 重定向 实验一 为什么log.txt文件的文件描述符是1 为什么向stdout打印的信息也出现在文件中 实验二 用户级缓冲区 为什么要有用户级缓冲区 系统调用 dup 为什么close(fd1)之后还能向log.txt写入数据? dup2 缓冲区 观察现象 测试1 测试2 测…...

bug bug bug

importError: DLL load failed while importing _multiarray_umath: 找不到指定的模块。 Traceback (most recent call last): File "D:\yolov8_about\ultralytics-main3\trainCPU.py", line 4, in <module> from ultralytics import YOLO File "…...

医疗器械上市欧美,需要什么样的网络安全相关申报文件?

医疗器械在欧美上市时&#xff0c;需要提交的网络安全相关申报文件主要包括以下几个方面&#xff0c;这些要求基于欧美地区的法律法规和监管机构的指导文件。 一、美国FDA要求 1. 网络安全管理计划 内容&#xff1a;制造商需要提交一份网络安全管理计划&#xff0c;该计划应包含…...

【UbuntuDebian安装Nginx】在线安装Nginx

云计算&#xff1a;腾讯云轻量服务器 操作系统&#xff1a;Ubuntu-v22 1.更新系统软件包列表 打开终端并运行以下命令来确保你的系统软件包列表是最新的&#xff1a; sudo apt update2.安装 Nginx 使用以下命令安装 Nginx&#xff1a; sudo apt install nginx3.启动 Nginx…...

Jacoco 单元测试配置

前言 编写单元测试是开发健壮程序的有效途径&#xff0c;单元测试写的好不好可以从多个指标考量&#xff0c;其中一个就是单元测试的覆盖率。单元测试覆盖率可以看到我们的单元测试覆盖了多少代码行、类、分支等。查看单元测试覆盖率可以使用一些工具帮助我们计算&#xff0c;…...

App Instance 架构示例

前言 在Unity程序设计过程中&#xff0c;我们处理的第一个对象是Application Instance。 它的主要职责是启动流程管理、卸载流程管理&#xff0c;次要职责是管理在内部的子系统生命周期。其他职责&#xff0c;提供或桥接应用程序的配置信息、及其他第三方接口。 它通常以单例的…...

【论文速读】| MoRSE:利用检索增强生成技术填补网络安全专业知识的空白

本次分享论文&#xff1a;MoRSE: Bridging the Gap in Cybersecurity Expertise with Retrieval Augmented Generation 基本信息 原文作者&#xff1a;Marco Simoni, Andrea Saracino, Vinod Puthuvath, Maurco Conti 作者单位&#xff1a;意大利比萨国家研究委员会信息学与…...

pip install albumentations安装下载超级细水管

albumentations 是一个用于图像增强的 Python 库&#xff0c;它提供了丰富的图像变换功能&#xff0c;可以用于数据增强&#xff0c;从而提高深度学习模型的泛化能力。 直接安装命令&#xff1a; pip install albumentations但是如果半夜遇到这种19kB/s的下载速度 为头发着想&…...

驱动开发系列07 - 驱动程序如何分配内存

一:概述 Linux 内核提供了丰富的内存分配函数、在本文中,我们将介绍在设备驱动程序中分配和使用内存的方法,以及如何优化系统的内存资源。由于内核为驱动程序提供了统一的内存管理接口。所以我们不会去讨论不同架构是如何管理内存的,文本不涉及分段、分页等问题,此外在本文…...

【Jackson】注解及其使用

Jackson库提供了多种注解&#xff08;annotations&#xff09;&#xff0c;可以用来控制JSON序列化和反序列化的行为。这些注解允许你灵活地映射Java对象与JSON数据之间的关系。下面将详细介绍一些常用的Jackson注解及其用法。 1. JsonProperty 作用: 用于指定JSON属性与Java…...

LeetCode24 两两交换链表中的节点

前言 题目&#xff1a; 24. 两两交换链表中的节点 文档&#xff1a; 代码随想录——两两交换链表中的节点 编程语言&#xff1a; C 解题状态&#xff1a; 没画图&#xff0c;被绕进去了… 思路 思路还是挺清晰的&#xff0c;就是简单的模拟&#xff0c;但是一定要搞清楚交换的…...

AI OS

一&#xff0c;概念 AI OS, 或AI for OS&#xff0c;也就是近一年来伴随着人工智能的热度而衍生出的一个新的概念 - 人工智能操作系统。 为什么提出AI OS的概念&#xff1f; 这是因为人工智能技术的发展势头太过迅猛&#xff0c;尤其在深度学习、大模型等AI技术的突破后&…...

Dubbo 黑白名单机制详解

在微服务架构中&#xff0c;服务间的安全和流量控制是非常重要的。在众多 Java 微服务框架中&#xff0c;Apache Dubbo 作为一款高性能的 RPC 框架&#xff0c;提供了丰富的功能来管理服务调用。在 Dubbo 中&#xff0c;黑白名单机制是保障服务安全性和可控性的一个重要手段。本…...

配电房智能巡检机器人怎么选?

智能巡检机器人行业发展现状 2022年中国智能巡检机器人市场规模达到了15.66亿元。其中&#xff1a;电力智能巡检机器人规模14.88亿元&#xff0c;其他智能巡检机器人规模为0.78亿元。2023年中国智能巡检机器人市场规模约为19.71亿元。其中&#xff1a;电力智能巡检机器人规模…...

husky引发git commit报错的解决方案

在git commit的时候&#xff0c;有可能会遇到这样的报错&#xff0c;husky - pre-commit hook exited with code 1 (error) 出现这个问题的原因主要是&#xff0c;假如项目中采用 husky和lint-staged结合进行代码校验&#xff0c;那么&#xff0c;只要项目代码中有不规范的地方…...

韩顺平0基础学Java——第37天

p736-758 MySQL三层结构 1.所谓安装Mysql数据库&#xff0c;就是在主机安装一个数据库管理系统(DBMS)&#xff0c;这个管理程序可以管理多个数据库。DBMS(database manage system) 2.一个数据库中可以创建多个表,以保存数据(信息)。 3.数据库管理系统(DBMS)、数据库和表的关系…...

Layer2区块链扩容方案(1)——总述

写在前面 这篇文章作为一个简单介绍&#xff0c;很多技术只是大致提及或者引用&#xff0c;之后会在详细学习后逐项解释。 补充知识 在了解扩容方案之前&#xff0c;我们最好了解一些相关的知识概念 EVM “EVM” 是“Ethereum Virtual Machine”&#xff08;以太坊虚拟机&…...

AWS监控工具,监控性能指标

执行AWS监视是为了跟踪在AWS环境中主动运行的应用程序工作负载和资源&#xff0c;AWS监视器跟踪各种AWS云指标&#xff0c;以帮助提高在其上运行的应用程序的整体性能。 借助阈值突破警报系统&#xff0c;AWS应用程序监控在识别性能瓶颈来源方面起着至关重要的作用&#xff0c…...

义务外贸wordpress独立站主题

健身器材wordpress网站模板 跑步机、椭圆机、划船机、动感单车、健身车、深蹲架、龙门架、健身器材wordpress网站模板。 https://www.jianzhanpress.com/?p4251 农业机械wordpress网站模板 植保机械、畜牧养殖机械、农机配件、土壤耕整机械、农业机械wordpress网站模板。 …...

初等数论精解【4】

文章目录 算术基本定理基础理论整数运算规则1. 加法性质2. 减法性质3. 乘法性质4. 除法性质5. 其他性质 整数运算的性质整数构成域吗 参考文献 算术基本定理 基础 任何一个大于1的整数可以被分解为素因数的连乘积。 a p 1 p 2 . . . . p n ≥ 1 ap_1\times p_2....\times…...

MongoDB教程(二十二):MongoDB固定集合

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、固定集…...

20240724----idea的Java环境卸载与安装

1.删除旧有的jdk https://blog.csdn.net/weixin_42168713/article/details/112162099 &#xff08;补充&#xff1a;我把用户变量和java有关的都删了&#xff09; 2.下载新的jdk百度网盘链接 链接&#xff1a;https://pan.baidu.com/s/1gkuLoxBuRAtIB1IzUTmfyQ 提取码&#xf…...

C语言 ——— 函数指针数组的讲解及其用法

目录 前言 函数指针数组的定义 函数指针数组的使用 前言 数组是存放一组相同类型数据的存储空间 关于指针数组的知识请见&#xff1a;C语言 ——— 指针数组 & 指针数组模拟二维整型数组-CSDN博客 那么要将多个函数的地址存储到数组中&#xff0c;这个数组该如何定义…...

鸿蒙仓颉语言【cryptocj 库】(介绍与SHA、MD5、HMAC摘要算法)

cryptocj 库 介绍 cryptocj 是一个安全的密码库&#xff0c;包括常用的密码算法、常用的密钥生成和签名验证。 该库是对 C 语言的 openSSL 封装的仓颉加密算法 1 提供SHA、MD5、HMAC摘要算法。 前置条件&#xff1a;NA 场景&#xff1a; OHOS&#xff0c; Linux&#xff…...

设计App的后端接口分类以及环境依赖包详情

目录 App的后端接口分类 1. 用户登录与注册 2. 设备初始化 3. 广告与推广 4. 应用配置与功能 5. 支付系统 6. 内容分发 7. 资源下载 8. 视频内容 9. 用户行为分析 10. 安全与合规 设计建议 基于Easyswoole&#xff0c;可以在系统中引入需要的一些常见依赖包&#…...

接入百度文心一言API教程

然后&#xff0c;编辑文章。点击AI识别摘要&#xff0c;然后保存即可 COREAIPOWER设置 暂时只支持经典编辑器.古腾堡编辑器等几个版本后支持.在比期间,你可以自己写点摘要 摘要内容 AL识别摘要 清空 若有收获&#xff0c;就点个赞吧 接入文心一言 现在百度文心一言&…...

classfinal太强了,再也不怕被反编译了

这段时间在辛辛苦苦的编写一个算法程序&#xff0c;担心部署到客户服务器&#xff0c;客户反编译jar包&#xff0c;破解程序&#xff0c;那努力就白费了&#xff01; 在网上查询&#xff0c;发现个好东东&#xff0c;classfinal可以加密jar包&#xff0c;防止反编译&#xff0…...

DP-适配器模式代码重新理解

package com.designpatterns.adapter;/*** 定义鸭子接口*/ public interface Duck {/*** 定义鸭子呱呱叫(quack)*/public void quack();public void fly(); }package com.designpatterns.adapter;/*** 实现一个绿头鸭*/ public class MallarDuck implements Duck{Overridepubl…...

minio安装小计一则

安装minio并且使用api方式对文件进行操作 本文使用docker安装 docker pull minio/minio docker pull minio/mc &#xff08;mc为minio文件运行命令行工具&#xff09; 使用如下命令运行Minio服务器容器&#xff1a; windwos powershell运行命令 docker run -p 9000:9000…...

# Redis 入门到精通(九)-- 主从复制(1)

Redis 入门到精通&#xff08;九&#xff09;-- 主从复制&#xff08;1&#xff09; 一、redis 主从复制 – 主从复制简介 1、互联网“三高”架构 高并发高性能高可用 2、你的“Redis”是否高可用&#xff1f; 1&#xff09;单机 redis 的风险与问题 问题1.机器故障  现…...