跳到主要内容

车牌检测

前言

本节学习使用OpenCV对图像车牌位置检测(非识别)。

实验目的

检测图像中的车牌位置画矩形框显示。

实验讲解

这里前面介绍过的级联分类器使用方法,本节使用车牌检测级联分类器 haarcascade_russian_plate_number.xml ,代码编写流程如下:


参考代码

参考代码如下:

import cv2

img = cv2.imread('car.png') #读取图像

#加载车牌检测级联分离器,注意路径不能含有中文字符
plateFaceCascade = cv2.CascadeClassifier('data/haarcascade_russian_plate_number.xml')

#检测出所有车牌
plates = plateFaceCascade.detectMultiScale(img, 1.15)

#遍历所有结果
for (x, y, w, h) in plates:
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 3) #画框

cv2.imshow('result', img) #显示图像

cv2.waitKey() #等待键盘任意按键按下
cv2.destroyAllWindows() #关闭窗口

实验结果

在核桃派运行上面代码,实验结果如下:

plate_detection

使用USB摄像头识别

结合前面USB摄像头使用方法可以通过USB摄像头实时识别,参考代码如下:

参考代码

import cv2, time

#加载车牌检测级联分离器,注意路径不能含有中文字符
plateFaceCascade = cv2.CascadeClassifier('data/haarcascade_russian_plate_number.xml')

cam = cv2.VideoCapture(1) # 打开USB摄像头

#降低分辨率能提高识别速度,可以设置为480x320或320x240
cam.set(3,480) # 设置采集图像宽为480
cam.set(4,320) # 设置采集图像高为320

#计算FPS(每秒帧率参数)
start = 0
end = 0

while True:

start = time.time() #记录开始时间

retval, img = cam.read() # 从摄像头中实时读取图像

#检测出所有车牌
plates = plateFaceCascade.detectMultiScale(img, 1.15)

#遍历所有结果
for (x, y, w, h) in plates:
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 3) #画框

end = time.time() #记录结束时间

#计算FPS(每秒帧率),结果取整数
fps = round(1/(end-start))
print('FPS: ', fps)

#图像上写字符
cv2.putText(img, "FPS: "+ str(fps), (20, 70), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 0), 5)

cv2.imshow('result', img) #显示图像

key = cv2.waitKey(1) # 窗口的图像刷新时间为1毫秒,防止阻塞
if key == 32: # 如果按下空格键,打断退出
break

cam.release() # 关闭摄像头
cv2.destroyAllWindows() # 销毁显示摄像头视频的窗口

实验结果

plate_detection