《------往期经典推荐------》
二、机器学习实战专栏【链接】 ,已更新31期,欢迎关注,持续更新中~~
三、深度学习【Pytorch】专栏【链接】
四、【Stable Diffusion绘画系列】专栏【链接】
五、YOLOv8改进专栏【链接】,持续更新中~~
六、YOLO性能对比专栏【链接】,持续更新中~
《------正文------》
目录
引言
在本文中,我们将探索如何在Python中使用YOLO(You Only Look Once)和EasyOCR(Optical Character Recognition)实现视频文件的车牌检测与识别。
1.安装库
在开始之前,请确保安装了以下Python包:
python
pip install opencv-python ultralytics easyocr Pillow numpy
2.具体步骤
步骤1:初始化库
我们将从导入必要的库开始。我们将使用OpenCV进行视频处理,使用YOLO进行对象检测,使用EasyOCR阅读检测到的车牌上的文本。
python
import cv2
from ultralytics import YOLO
import easyocr
from PIL import Image
import numpy as np
# 初始化 EasyOCR 读取器
reader = easyocr.Reader(['ch_sim'], gpu=False)
# 加载你的 YOLO 模型(替换为你模型的路径)
model = YOLO('best_float32.tflite', task='detect')
# 打开视频文件(替换为你的视频文件路径)
video_path = 'sample4.mp4'
cap = cv2.VideoCapture(video_path)
# 创建一个 VideoWriter 对象(可选,如果你希望保存输出)
output_path = 'output_video.mp4'
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter(output_path, fourcc, 30.0, (640, 480)) # 如有必要,调整帧大小
步骤2:处理视频帧
我们将从视频文件中读取每一帧,对其进行处理以检测车牌,然后应用OCR识别车牌上的文本。为了提高性能,我们可以每三帧处理一次,加快检测速度。
python
# 帧跳过因子(根据性能需求进行调整)
frame_skip = 3 # 跳过每第3帧
frame_count = 0
while cap.isOpened():
ret, frame = cap.read() # 从视频中读取一帧
if not ret:
break # 如果没有剩余帧,则退出循环
# 跳过帧
if frame_count % frame_skip != 0:
frame_count += 1
continue # 跳过处理这一帧
# 调整帧大小(可选,根据需要调整大小)
frame = cv2.resize(frame, (640, 480)) # 调整为640x480
# 在当前帧上进行预测
results = model.predict(source=frame)
# 遍历结果并绘制预测框
for result in results:
boxes = result.boxes # 获取模型预测的边界框
for box in boxes:
class_id = int(box.cls) # 获取类别ID
confidence = box.conf.item() # 获取置信度分数
coordinates = box.xyxy[0] # 获取边界框坐标作为张量
# 提取并转换边界框坐标为整数
x1, y1, x2, y2 = map(int, coordinates.tolist()) # 将张量转换为列表,然后再转换为整数
# 在帧上绘制边界框
cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) # 绘制矩形
# 尝试对检测区域应用OCR
try:
# 确保坐标在帧范围内
r0 = max(0, x1)
r1 = max(0, y1)
r2 = min(frame.shape[1], x2)
r3 = min(frame.shape[0], y2)
# 裁剪车牌区域
plate_region = frame[r1:r3, r0:r2]
# 转换为与EasyOCR兼容的格式
plate_image = Image.fromarray(cv2.cvtColor(plate_region, cv2.COLOR_BGR2RGB))
plate_array = np.array(plate_image)
# 使用EasyOCR从车牌中读取文本
plate_number = reader.readtext(plate_array)
concat_number = ' '.join([number[1] for number in plate_number])
number_conf = np.mean([number[2] for number in plate_number])
# 在帧上绘制检测到的文本
cv2.putText(
img=frame,
text=f"Plate: {concat_number} ({number_conf:.2f})",
org=(r0, r1 - 10),
fontFace=cv2.FONT_HERSHEY_SIMPLEX,
fontScale=0.7,
color=(0, 0, 255),
thickness=2
)
except Exception as e:
print(f"OCR Error: {e}")
pass
# 显示带有检测结果的帧
cv2.imshow('Detections', frame)
# 将帧写入输出视频(可选)
out.write(frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break # 如果按下 'q' 键,则退出循环
frame_count += 1 # 增加帧计数
# 释放资源
cap.release()
out.release() # 释放VideoWriter对象(如果使用了)
cv2.destroyAllWindows()
步骤说明
- 初始化EasyOCR:EasyOCR初始化为中文文本识别。
- 加载YOLO模型:从指定路径加载YOLO模型。请确保将此路径替换为您的模型路径。
- 读取视频帧 :使用OpenCV打开视频文件,如果要保存输出,则会初始化
VideoWriter
。 - 帧处理:读取每个帧并调整大小。用模型预测车牌位置。
- 绘制预测:在帧上绘制检测到的边界框。包含车牌的区域被裁剪以进行OCR处理。
- 应用OCR:EasyOCR从裁剪的车牌图像中读取文本。检测到的文本和置信度分数显示在检测框上。
- 输出视频:处理后的帧可以显示在窗口中,也可以选择保存到输出视频文件中。
结论
此代码提供了一种使用YOLO和EasyOCR从视频文件中检测和识别车牌的方法。通过遵循这些步骤,我们可以在自己的应用程序实现类似的系统。
好了,这篇文章就介绍到这里,喜欢的小伙伴感谢给点个赞和关注,更多精彩内容持续更新~~
关于本篇文章大家有任何建议或意见,欢迎在评论区留言交流!