1. 项目概述
车牌识别作为计算机视觉领域的经典应用场景,在智能交通、停车场管理等领域有着广泛需求。这个项目将带大家从零开始实现一个完整的车牌识别系统,涵盖从摄像头图像采集到最终字符识别的全流程。不同于直接调用现成API的方案,我们将深入每个技术环节,理解底层原理并动手实现。
2. 核心流程拆解
2.1 图像采集与预处理
使用普通USB摄像头或树莓派摄像头模块采集原始图像。关键参数设置:
- 分辨率建议不低于1280×720
- 帧率设置为30fps
- 曝光模式选择自动或根据环境调整
预处理流程:
- 图像缩放:将大尺寸图像按比例缩小,加快处理速度
python复制def resize_image(img, scale_percent):
width = int(img.shape[1] * scale_percent / 100)
height = int(img.shape[0] * scale_percent / 100)
return cv2.resize(img, (width, height))
- 灰度化转换:将BGR图像转为单通道灰度图
python复制gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
- 直方图均衡化:增强图像对比度
python复制equ = cv2.equalizeHist(gray)
2.2 车牌区域定位
采用多方法融合的定位策略:
- 边缘检测定位法:
python复制edges = cv2.Canny(gray, 100, 200)
contours, _ = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
- 颜色特征定位法(针对蓝底车牌):
python复制hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower_blue = np.array([100,50,50])
upper_blue = np.array([140,255,255])
mask = cv2.inRange(hsv, lower_blue, upper_blue)
- 形态学处理优化结果:
python复制kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
closed = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
2.3 车牌矫正与分割
- 透视变换矫正倾斜:
python复制def perspective_transform(img, pts):
rect = order_points(pts)
(tl, tr, br, bl) = rect
width = max(np.linalg.norm(br - bl), np.linalg.norm(tr - tl))
height = max(np.linalg.norm(tr - br), np.linalg.norm(tl - bl))
dst = np.array([[0,0], [width-1,0],
[width-1,height-1], [0,height-1]], dtype="float32")
M = cv2.getPerspectiveTransform(rect, dst)
warped = cv2.warpPerspective(img, M, (int(width), int(height)))
return warped
- 字符分割算法:
- 垂直投影法分割单个字符
- 自适应阈值处理:
python复制thresh = cv2.adaptiveThreshold(plate_gray, 255,
cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY_INV, 11, 2)
3. 字符识别实现
3.1 特征提取方法
- 网格特征提取:
python复制def extract_grid_feature(char_img, grid_size=(4,4)):
h, w = char_img.shape
cell_h, cell_w = h//grid_size[0], w//grid_size[1]
feature = []
for i in range(grid_size[0]):
for j in range(grid_size[1]):
cell = char_img[i*cell_h:(i+1)*cell_h, j*cell_w:(j+1)*cell_w]
feature.append(np.sum(cell)/255)
return np.array(feature)
- 投影直方图特征
3.2 分类器选择
- SVM分类器实现:
python复制from sklearn.svm import SVC
svm = SVC(kernel='rbf', gamma=0.5, C=1)
svm.fit(train_features, train_labels)
- CNN深度学习方案:
python复制model = Sequential([
Conv2D(32, (3,3), activation='relu', input_shape=(20,20,1)),
MaxPooling2D((2,2)),
Flatten(),
Dense(128, activation='relu'),
Dense(num_classes, activation='softmax')
])
4. 系统优化技巧
4.1 性能提升方案
- 多线程处理框架:
python复制import threading
class CaptureThread(threading.Thread):
def run(self):
while True:
ret, frame = cap.read()
if ret:
queue.put(frame)
- 基于运动检测的触发机制
4.2 准确率优化
- 多帧验证机制
- 字符上下文校验算法
- 基于车牌规则的纠错方法
5. 完整实现示例
提供基于OpenCV的完整代码框架:
python复制import cv2
import numpy as np
class LPRSystem:
def __init__(self):
self.plate_cascade = cv2.CascadeClassifier('haarcascade_russian_plate_number.xml')
def process_frame(self, frame):
# 完整处理流程
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
plates = self.plate_cascade.detectMultiScale(gray, 1.1, 4)
for (x,y,w,h) in plates:
plate_img = frame[y:y+h, x:x+w]
# 后续处理流程...
return plate_info
6. 部署与测试
实际部署时的注意事项:
- 光照条件测试方案
- 不同角度车牌测试
- 性能基准测试方法
这个项目完整展示了车牌识别系统的实现过程,通过逐步优化可以达到实用级的识别效果。建议先实现基础版本,再逐步添加高级功能。
