当前位置: 首页 > 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文档) 本课题研究的研学自习室选座与门禁系统让用户在小程序端查看座位,预定座位,支付座位价格,该系统让用户预定座位…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

快速排序算法改进:随机快排-荷兰国旗划分详解

随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...

【java面试】微服务篇

【java面试】微服务篇 一、总体框架二、Springcloud(一)Springcloud五大组件(二)服务注册和发现1、Eureka2、Nacos (三)负载均衡1、Ribbon负载均衡流程2、Ribbon负载均衡策略3、自定义负载均衡策略4、总结 …...

Axure Rp 11 安装、汉化、授权

Axure Rp 11 安装、汉化、授权 1、前言2、汉化2.1、汉化文件下载2.2、windows汉化流程2.3、 macOs汉化流程 3、授权 1、前言 Axure Rp 11官方下载链接:https://www.axure.com/downloadthanks 2、汉化 2.1、汉化文件下载 链接: https://pan.baidu.com/s/18Clf…...

【Zephyr 系列 16】构建 BLE + LoRa 协同通信系统:网关转发与混合调度实战

🧠关键词:Zephyr、BLE、LoRa、混合通信、事件驱动、网关中继、低功耗调度 📌面向读者:希望将 BLE 和 LoRa 结合应用于资产追踪、环境监测、远程数据采集等场景的开发者 📊篇幅预计:5300+ 字 🧭 背景与需求 在许多 IoT 项目中,单一通信方式往往难以兼顾近场数据采集…...

第2课 SiC MOSFET与 Si IGBT 静态特性对比

2.1 输出特性对比 2.2 转移特性对比 2.1 输出特性对比 器件的输出特性描述了当温度和栅源电压(栅射电压)为某一具体数值时,漏极电流(集电极电流...

多模态学习路线(2)——DL基础系列

目录 前言 一、归一化 1. Layer Normalization (LN) 2. Batch Normalization (BN) 3. Instance Normalization (IN) 4. Group Normalization (GN) 5. Root Mean Square Normalization(RMSNorm) 二、激活函数 1. Sigmoid激活函数(二分类&…...

可下载旧版app屏蔽更新的app市场

软件介绍 手机用久了,app越来越臃肿,老手机卡顿成常态。这里给大家推荐个改善老手机使用体验的方法,还能帮我们卸载不需要的app。 手机现状 如今的app不断更新,看似在优化,实则内存占用越来越大,对手机性…...