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 系统优化策略
为了提高车牌识别系统的性能,我们可以采取以下优化策略:
- 特征选择:选择最有效的特征,如SIFT、SURF或ORB,以提高字符识别的准确性。
- 模型训练:使用大量标注数据对深度学习模型进行训练,以提高模型对各种车牌字符的识别能力。
- 实时处理:优化图像预处理和字符识别的步骤,以提高整个系统的处理速度。
- 错误处理:添加错误处理机制,以处理可能出现的识别错误,例如字符识别不准确或车牌定位失败。
总结
本节介绍了如何将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 欢迎来到我的主页,我是博主英杰,…...

怎样在 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() 方法是一个强大的工具,适合于需要将数组中的每个元素转换为新形式的情况。然而,对于性能敏感的应用或需要更复杂控制逻辑的场景,可能需要考虑其他方法。 优点: 函数式编程风格:…...

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

基于微信小程序+SpringBoot+Vue的自习室选座与门禁系统(带1w+文档)
基于微信小程序SpringBootVue的自习室选座与门禁系统(带1w文档) 基于微信小程序SpringBootVue的自习室选座与门禁系统(带1w文档) 本课题研究的研学自习室选座与门禁系统让用户在小程序端查看座位,预定座位,支付座位价格,该系统让用户预定座位…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...