☰
基于Python+OpenCV的车牌识别系统实战:从图像处理到模板匹配
2026/10/1 19:17:20 网站建设 项目流程

简介:这是一套基于Python和OpenCV开发的数字图像处理车牌识别系统,面向高校毕业设计、课程设计及项目开发场景。项目覆盖车牌图像预处理、字符分割与识别等完整流程,并利用图形界面库搭建了可交互的演示程序,适合有Python基础、希望深入掌握图像处理技术的开发者参考。压缩包共19个文件,包含5个Python源码、若干界面截图和测试车牌图片、数据文件、项目说明文档以及验收汇报用的演示文稿,整体大小约4.79MB。目录按照数字图像处理过程、车牌图片、程序界面图等模块分类存放,结构清晰,便于快速定位与学习。已有242人学习下载,可用作课程设计完整方案或毕业设计基础框架。资源提供了可运行的源码和配套文档,还保留了图像处理各步骤的中间结果,方便对照理解算法细节;演示文稿和说明文档能辅助答辩汇报或项目展示,开发者可在此基础上自由扩展功能。

1. 从课程设计到上线,一套车牌识别系统到底能走到哪一步

基于Python+OpenCV开发的车牌识别系统,几乎是数字图像处理方向最经典的综合性实战题目。它不像人脸识别那样有现成的高层接口可调,也不像目标检测那样依赖重型框架,而是把图像处理的预处理、特征提取、形态学操作、边缘检测、轮廓分析这套基本功从头到尾串了一遍。做这套东西的人通常有三类:正在准备毕业设计的学生,想拿一个完整项目充实简历的开发者,以及需要在实验室或小型场景里做车牌识别验证的工程师。

很多人上来就问识别率能不能到95%以上,其实这个问题的答案取决于一个更基础的问题:你的图像是在什么条件下拍的。固定机位的停车场入口、手持手机拍摄的路侧车辆、监控视频里的运动车辆,这三类场景的处理难度完全是三个量级。本文按课程设计和毕设最常见的落地路径来讲——固定或半固定机位、单张图片或短视频帧、蓝底白字为主的车牌,这也是OpenCV方案最能发挥优势的场景。全文会给出可复现代码,并把参数选择和踩坑点讲透。

2. 跑通最小系统:环境、流程与项目骨架

2.1 为什么用Python+OpenCV而不是MATLAB或深度学习

数字图像处理课设/毕设里,还有一条常见路线是基于MATLAB OOP架构的多算法融合数字图像处理系统设计。MATLAB在算法验证上确实快,但到了交付阶段会碰两个问题:一是GUI打包后的运行环境折腾人,二是你没法把识别服务嵌到别的程序里。Python+OpenCV的最大优势是中间产物透明——每一步处理的图像你都能用imwrite存下来看,这对写论文和答辩准备太重要了,你能直接给出每一步的中间结果图。

另一个常被问的问题是:为什么不直接上YOLO之类深度学习模型?技术上进阶完全可行,但这取决于你做的是毕设还是实际项目。如果是毕设,题目里写着"数字图像处理",老师要看到的是你在用图像处理的手段解决问题,模板匹配和几何分析才是核心考察点;如果是实际项目且算力允许,深度学习方案单独开一个项目做效果确实更好。本文以传统图像处理为主线,这也是绝大多数"车牌识别系统"课程设计的标准技术路线。

2.2 环境安装与版本选择

环境安装是大多数新手的第一个翻车点。常见问题是在没装NumPy的情况下直接装OpenCV,或者把opencv-python和opencv-contrib-python装混了。以下是课程设计最常用的组合:

pip install numpy==1.24.3 pip install opencv-python==4.8.1.78 pip install matplotlib

参数说明:opencv-python是OpenCV的官方Python发行包,包含核心图像处理和cv2.imshow等GUI功能;opencv-contrib-python多包含一些扩展模块,如SIFT、SURF等特征算子,本系统用不到,所以只装核心包即可。numpy版本锁在1.24.3是因为OpenCV 4.8在部分平台上对numpy 2.x有二进制兼容性问题,装完报错再降版本很浪费时间。matplotlib用来在调试时绘制中间结果,比cv2.imshow更好用,尤其在远程开发环境里。

提示:用VSCode做Python开发时,选好解释器路径。终端里pip install装到了哪个Python环境,VSCode里就得选同一个环境,否则import cv2会报ModulenotFoundError。这是vscode python环境配置里最常见的错误来源。

安装完成后用一行命令验证:

python -c "import cv2; print(cv2.__version__)"

如果输出4.8.1,说明OpenCV已可用。常见的安装报错还有pip下载慢、超时,解决方案是换国内镜像源,在pip install后面加 -i https://pypi.tuna.tsinghua.edu.cn/simple。

2.3 系统整体流程与源码骨架

整个系统的核心处理链路可以拆成四段:图像预处理、车牌定位、字符分割、字符识别。这是数字图像处理实验课里一个标准完整的综合案例,和冈萨雷斯《数字图像处理》教材里关于分割与形态学的章节是对应得上的。但在动手写算法前,先把项目文件组织好,这对接下来的调试和最后写文档都很有帮助。

一个常见的目录组织方式是这样:

plate_recognition/ ├── main.py # 主流程,串联各步骤 ├── preprocess.py # 预处理:灰度、去噪、增强 ├── locate.py # 车牌定位:颜色/边缘 + 形态学 ├── segment.py # 字符分割 ├── recognize.py # 字符识别 ├── test_images/ # 测试图片 ├── output/ # 中间结果与最终输出 └── docs/ # 设计文档、使用说明

main.py的主流程如下:

import cv2 from preprocess import preprocess_image from locate import locate_plate from segment import segment_characters from recognize import recognize_characters def main(image_path): # 1. 读取图像 img = cv2.imread(image_path) if img is None: print(f"无法读取图像: {image_path}") return # 2. 预处理 processed = preprocess_image(img) # 3. 定位车牌区域 plate_region, plate_mask = locate_plate(processed) if plate_region is None: print("未定位到车牌区域") return # 4. 字符分割 char_images = segment_characters(plate_region) # 5. 字符识别 plate_text = recognize_characters(char_images) print(f"识别结果: {plate_text}") # 6. 在原图上画框并保存结果 cv2.rectangle(img, plate_region_box, (0, 255, 0), 2) cv2.imwrite("output/result.jpg", img) if __name__ == "__main__": main("test_images/car.jpg")

逻辑说明:函数式模块划分让每一步都可以单独运行和调试。定位模块返回车牌区域图像和对应的坐标框,分割模块返回字符小图列表,识别模块把字符小图转成字符串。这种结构对毕设答辩很有利——你可以现场单独跑某一步,展示中间结果。

参数说明:如果要加GUI界面,可以在main.py里加一个简单的tkinter窗口,实现"选择图片→显示结果"的交互,或者用OpenCV的滑动条在线调节HSV阈值参数。大部分课程设计的源码都会附带这么一层界面,但核心逻辑仍然在这五步里。

3. 车牌定位:颜色空间与形态学操作

3.1 为什么首选用HSV提取而不是RGB

车牌定位是整套系统里最见功力的环节,能不能快速定位到车牌,直接决定了后面的识别是否还有意义。定位方法里最常用的是颜色特征,因为中国车牌有非常醒目的底色——蓝底白字、黄底黑字、绿底白字(新能源)。如果用RGB做颜色判断,蓝色区域分割会遇到一个问题:RGB三个通道的相关性很强,光照一变,蓝色的RGB值分布范围就飘,阈值很难定。

这时候要转到HSV颜色空间。H是色调,S是饱和度,V是明度。色调对光照变化不敏感,你只需要在H通道上框出蓝色的范围,再配合S和V把过亮过暗的像素排除掉,比直接在RGB里定阈值稳定得多。OpenCV里用cvtColor转换后,H的范围是0到179,S和V是0到255,这一点和很多教材里写的0到360不一样,初学者常在这里翻车。

蓝色车牌的典型HSV范围如下,这个范围也兼容大部分监控视频里的颜色漂移:

蓝色: H 95-125, S 80-255, V 80-255 黄色: H 20-35, S 80-255, V 80-255 绿色: H 35-80, S 80-255, V 80-255

3.2 颜色掩膜与形态学闭运算

定位的第一步是先做一个蓝色掩膜,把图像里所有接近蓝色的像素挑出来:

import cv2 import numpy as np def locate_plate_by_color(img): # 转为HSV颜色空间 hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 蓝色车牌范围 lower_blue = np.array([95, 80, 80]) upper_blue = np.array([125, 255, 255]) # 生成二值掩膜,是蓝色为255,否则为0 mask = cv2.inRange(hsv, lower_blue, upper_blue) # 形态学闭运算:填充车牌内部字符产生的空洞 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (15, 5)) mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel) # 再做一个开运算,去掉零星噪声 kernel_open = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel_open) # 查找轮廓 contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) return mask, contours

逻辑说明:整张图里蓝色的像素可能来自天空、蓝色车身、路牌等多个地方,所以先通过inRange得到候选像素集合,再用形态学把相邻的蓝色区域连通成块。闭运算能弥补字符间隙——车牌字符是白色的,字符区域在掩膜上是黑色空洞,如果不做闭运算,一个完整的车牌会被拆成多个碎片。

参数说明:闭运算的核大小(15, 5)是根据车牌的宽高比经验设置的。车牌是长条形,横向跨度大、纵向跨度小,所以核的宽度远大于高度。如果核太小,字符间隙填不上;如果太大,会把车身大面积蓝色区域都连进来,增加误检。这个参数是定位效果最敏感的参数,值得花时间调。

3.3 边缘检测辅助验证候选区域

颜色掩膜的一个弱点是:当车身也是蓝色时,候选区域会非常大,甚至比车牌还显眼。这时候需要用几何特征和边缘密度来筛选。

车牌的几何特征很稳定:宽高比大约在3到4之间,面积占比不会太大也不会太小,而且车牌区域内有大量字符边缘,所以边缘密度很高。做法是先把候选区域转成灰度图,做Canny边缘检测,统计边缘像素占比,把低于阈值的候选直接淘汰。这个过程里可以用到OpenCV的Canny算子和霍夫直线检测来辅助判断边界。

def validate_plate_region(img, contour): # 获取外接矩形 x, y, w, h = cv2.boundingRect(contour) # 几何条件筛选:宽高比、面积 aspect_ratio = w / h area = w * h img_area = img.shape[0] * img.shape[1] if aspect_ratio < 2.0 or aspect_ratio > 5.5: return None if area < 500 or area > img_area * 0.3: return None # 边缘密度验证:车牌区域应有大量字符边缘 roi_gray = cv2.cvtColor(img[y:y+h, x:x+w], cv2.COLOR_BGR2GRAY) edges = cv2.Canny(roi_gray, 100, 200) edge_density = cv2.countNonZero(edges) / (w * h) if edge_density < 0.05: return None return (x, y, w, h)

逻辑说明:这里的几何筛选顺序很关键,先用计算量最小的宽高比和面积过滤掉明显不对的轮廓,再做边缘密度计算,避免对每个候选都跑一遍Canny。边缘密度阈值取0.05是因为字符本身只占车牌面积的一小部分,阈值设太高容易漏检。

参数说明:Canny的两个阈值100和200是OpenCV里常用的入门值。100控制弱边缘的下限,200控制强边缘的上限,如果车牌的边缘出现了大量断断续续的线,可以适当把下限降到80再看效果。如果环境里噪声特别大,阈值反而要往高了调。我的经验是先取默认,然后看canny输出图的效果再微调。

4. 字符分割与识别:从连通域到模板匹配

4.1 精定位:把车牌从原图里切出来并纠正倾斜

定位做的只是把车牌区域找出来,但找到框和目标区域真正的边界往往还有偏差。特别是从侧面拍的车牌,外接矩形是斜的,直接把矩形区域切出来,字符是歪的,识别会受影响。

角度修正的常见做法有两种:一是用霍夫直线检测车牌的上下边缘,计算倾斜角后做仿射变换;二是对二值图做最小外接矩形,拿到旋转角度再旋转。课程设计里用第二种更简单可靠,矩形的minAreaRect就能返回角度。

def deskew_plate(plate_img): # 转为灰度并二值化 gray = cv2.cvtColor(plate_img, cv2.COLOR_BGR2GRAY) _, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) # 找最小外接矩形 contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) if not contours: return plate_img all_points = np.vstack(contours) rect = cv2.minAreaRect(all_points) angle = rect[2] # 角度修正 if angle > 45: angle = angle - 90 # 以中心为基准旋转 center = (plate_img.shape[1] // 2, plate_img.shape[0] // 2) matrix = cv2.getRotationMatrix2D(center, angle, 1.0) rotated = cv2.warpAffine(plate_img, matrix, (plate_img.shape[1], plate_img.shape[0])) return rotated

逻辑说明:minAreaRect返回的角度是指矩形相对于水平轴的偏转角度,但根据矩形的长边方向不同,返回值可能是一个绝对值很大的锐角,所以需要一个if判断把它归一化到0到45度之间。旋转后还要再做一次外接矩形裁剪,因为旋转会产生黑边。

参数说明:OTSU大津法在这里做二值化比固定阈值稳得多,尤其是不同图片亮度差异大的情况。OpenCV里threshold传入cv2.THRESH_BINARY + cv2.THRESH_OTSU时,阈值参数填0即可,算法会自己在灰度直方图上找最佳分界点,这是数字图像处理实验里最常见的自适应阈值方案。

4.2 字符分割的连通域方案

分割这一步的输入是精确定位后的车牌图,输出是单个字符的小图。分割的关键在于连通域分析和字符的物理特征:车牌有7个字符,第2和第3个字符之间有间隔,或第2个字符后有小圆点。理想情况下,每个字符的宽度接近车牌宽度的十分之一左右。

def segment_characters(plate_img): # 转灰度并二值化(字符为白色,背景为黑色) gray = cv2.cvtColor(plate_img, cv2.COLOR_BGR2GRAY) _, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) # 查找每个字符的轮廓 contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) chars = [] for contour in contours: x, y, w, h = cv2.boundingRect(contour) # 字符宽高比和面积筛选 if h < plate_img.shape[0] * 0.3: continue if w > plate_img.shape[1] * 0.2: continue if w / h > 1.0: continue # 字符宽度下限 if w < 8: continue chars.append((x, y, w, h, binary[y:y+h, x:x+w])) # 按x坐标从左到右排序 chars.sort(key=lambda c: c[0]) return chars

逻辑说明:做完OTSU反相二值化后,字符是白色连通域。用RETR_EXTERNAL只取外部轮廓,不会出现字符内圈的孔洞干扰。筛选条件里的高度下限0.3可以让汉字和字母通过,但过滤掉车牌边框残留和噪声;宽度上限0.2是为了过滤掉由多个字符粘连形成的大块区域。

参数说明:字符宽高比上限1.0是个重要约束。正常车牌字符(汉字、字母、数字)的宽高比都在0.2到0.9之间,如果出现宽高比大于1的区域,大概率是两个字符被粘连在一起了,需要额外处理。项目里最常见的分割翻车现场就是这里——螺杆、车牌的白色边框被当成字符切出来,或者"京"字的左右部分被切开成了两个字符。

4.3 模板匹配识别与置信度判断

模板匹配是课程设计里最主流的字符识别方式,原因是接地气:收集或制作好字符模板图,用每个模板在待识别字符上计算匹配度,最高分对应的字符就是结果。不需要训练数据集,不需要标注,对数字和字母效果尤其好。

import os import cv2 import numpy as np def recognize_characters(char_images, template_dir="templates"): # 加载模板,文件名即字符标签,如 "0.jpg", "A.jpg", "京.jpg" templates = {} for filename in os.listdir(template_dir): label = os.path.splitext(filename)[0] template_path = os.path.join(template_dir, filename) template = cv2.imread(template_path, cv2.IMREAD_GRAYSCALE) _, template_bin = cv2.threshold(template, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) templates[label] = template_bin result = "" for char_img in char_images: # 统一尺寸到模板大小 char_img = cv2.resize(char_img, (20, 32)) best_score = -1 best_label = "?" for label, template_bin in templates.items(): # 统一尺寸后直接逐像素比较 template_resized = cv2.resize(template_bin, (20, 32)) score = np.sum(char_img == template_resized) / (20 * 32) if score > best_score: best_score = score best_label = label result += best_label return result

逻辑说明:这里是按像素一致率做最朴素的匹配。每个字符图resize到20x32,和每个模板逐像素比较,一致比例最高的就是识别结果。这个方案对模板本身的制作质量要求很高,模板必须和待识别图像的字形接近,否则识别率会明显下降。

参数说明:模板尺寸20x32是一个折中值。太小的模板会丢失笔画细节,导致字形相近的字符区分不开,比如O和0、B和8;太大的模板对resize造成的形变更敏感。如果识别率不理想,优先检查的是模板自身有没有做反相二值化处理。

4.4 模板匹配的短板与轻量级改进

逐像素匹配的问题在于它对位置变化太敏感,字符稍微偏移,匹配度就下降。有个不需要引入深度学习的改进方案是归一化互相关匹配(NCC),OpenCV里对应matchTemplate方法,它对线性光照变化有一定鲁棒性:

def match_ncc(char_img, template_bin): # 统一尺寸 char_img = cv2.resize(char_img, (24, 36)) template_bin = cv2.resize(template_bin, (24, 36)) # 计算归一化互相关 result = cv2.matchTemplate(char_img.astype(np.float32), template_bin.astype(np.float32), cv2.TM_CCOEFF_NORMED) return result[0][0]

逻辑说明:TM_CCOEFF_NORMED是OpenCV里最常用的模板匹配度量,它对亮度和对比度的变化不敏感,计算的是两个图像的归一化相关系数。相关系数越接近1,说明两个图越像。用这个替换逐像素比较,字符偏移和笔画粗细不一致的问题会明显缓解。

参数说明:模板匹配度量一共有6种,TM_SQDIFF是差方和,值越小越好;TM_CCOEFF_NORMED是相关系数,值越大越好,范围在-1到1之间。实际使用时,把字符和模板都resize到相同尺寸再用matchTemplate是惯用操作,因为matchTemplate本身设计场景是在大图里搜小图,单字符匹配时直接作用于同样大小的图即可。

5. 避坑与定位常见问题排查

5.1 inRange选出来的区域全白,或者根本选不出蓝色

现象:HSV掩膜输出要么一整片都是白色,要么全黑,车牌位置没有任何信号。

原因:最常见的是没有把BGR转到HSV就直接用HSV阈值。OpenCV的默认颜色通道顺序是BGR,而inRange判断的是HSV数值,二者混用必然错乱。另一个常见原因是H通道范围写错——HSV在OpenCV里H范围是0到179,从别的教程里直接抄了一个H 0到360的阈值过来,蓝色范围自然匹配不上。

解决:先确认cvtColor的代码在inRange之前执行。然后调试时不要只看最终掩膜,把转出来的HSV图分别输出H、S、V三个通道的伪彩色图,用鼠标在车牌区域采样几个点的HSV值读取实际数值,再把阈值范围设定到采样值的上下浮动区间内。这个采样步骤是调阈值最靠谱的方法,比凭感觉猜高效得多。

5.2 蓝色车身导致定位框巨大

现象:定位结果把整块车身框出来了,车牌只占框的一小部分。

原因:车身颜色和车牌底色相近,inRange把车身大面积像素也当成了候选区域。形态学闭运算的核如果设得过大,会把车身和车牌之间的空隙也填上,加剧这个问题。

解决:闭运算核的尺寸先缩小,避免把不该连通的部分连通。更重要的是利用几何比例筛选,车牌框的宽高比一定在2到5之间,把aspect_ratio的判断放到轮廓遍历里,发现比例明显不合理的轮廓直接跳过。如果车身区域还是能通过筛选,再用边缘密度验证,车身的光滑表面不会产生像字符那样密集的边缘。多条件串行过滤后,误检率能降到很低的水平。

5.3 字符分割时字符粘连,识别结果多了几个字符

现象:7个字符的车牌被切成8个或更多区域,有的切片是一半字符,有的是两个字符连在一起。

原因:字符切片粘连的根因是精定位不准确,车牌边界没有完全贴合字符区域,导致两个字符之间的间隙被噪声或者边框残影填充。还有一种情况是车牌上的铆钉或螺钉被当成了字符。

解决:在分割前先做一个去除边框的操作。方法是对车牌区域的二值图做竖直方向投影,统计每一列的白色像素数,字符区域的列投影会有明显起落,边框处是持续的高值。找到左右两侧的连续低值区域并裁掉,就能把边框和螺钉的影响降到最低。如果粘连已经发生,在字符宽度判断上加一个"宽度超过正常值1.5倍就尝试从中间切开"的逻辑,是一个常见的补救手段。

5.4 模板匹配把B看成8,把O看成0

现象:字符识别结果中数字和字母混淆,最典型的就是B和8、O和0、D和O。

原因:逐像素模板匹配对形状差异本来就敏感度有限,如果字符模板和待识别字符的字体不一样,或者字符本身做了细化、加粗等预处理,字形接近的符号就更难分开了。这个问题的根源是模板匹配本身区分度不足。

解决:在模板库里同时加入容易混淆的字符变体。比如B可以有粗细两种模板,8也放两个模板,匹配时取最高分。更进一步可以用字符的连通域特征辅助判断,最简单的例子是数字0内部有一个孔洞而字母O没有明显区别时,直接检查字符二值图的洞数来区分。在课程设计的答辩环节,这个逻辑加进去就能体现你确实理解图像特征,而不只是调库。

5.5 新能源绿牌完全不识别

现象:蓝牌车正常识别,但新能源绿牌车定位不到,或定位框偏移严重。

原因:标题里的系统如果默认只处理蓝牌,绿牌的HSV范围不在代码里,定位环节就直接淘汰了这个候选。

解决:在最开始设计系统时,把车牌颜色做成可配置的列表,每种颜色有自己的HSV范围、形态学参数和几何筛选规则。绿牌的H通道范围在35到80之间,这个值在不同光源下波动较大,建议在绿牌的HSV范围上多采集一些不同天气下的图来验证。如果不想加绿牌支持,也要在文档里写明系统的适用边界,避免答辩时被问到"你的系统支持哪些车牌类型"时答不上来。

6. 灰度直方图与形态学参数联动验证法

识别率不稳定的时候,多数人第一反应是改模板、调阈值,但更值得做的是把处理过程的中间图全部落盘,然后逐张检查问题是出在定位、分割还是识别环节。这里有一个我一直在用的验证方法:在主流程里加一个控制参数save_intermediate,为True时把每一步结果都写到output目录下,文件名带步骤前缀。跑完一批测试图后,直接用图像浏览器按批次翻看,一眼就能看出问题集中在哪一环。这个习惯能省下大量"盲调"的时间。

针对预处理环节,有个实用技巧:在灰度化之后先看直方图。用calcHist把车牌区域的灰度直方图画出来,观察峰的分布。如果呈现明显的双峰,用OTSU没问题;如果峰值集中在高亮度端,说明车牌区域过曝,颜色定位的S和V上界要往下调。这个方法听起来原始,但在现场环境里处理真实拍摄的图片时,比反复调参快得多。直方图均化对低对比度的夜间图像有明显收益,相关的参数和效果测试值得在文档里记录一笔。

回到整个系统,模板匹配方案有一个明确的能力边界:足够应付课程设计和入门项目,但拿到真实多变的环境里识别率会掉得很快。如果后续想往工程化方向走,在现有代码基础上把字符识别模块替换成轻量级CNN是最平滑的升级路径,车牌定位和字符分割代码可以原样保留。数据收集上,一个省力的做法是用已有的模板匹配代码批量跑一批图片,把置信度低的样本挑出来人工标注,累积几百张再训练,就能超过模板匹配的准确率。坑是注意标注规范:汉字、字母、数字分别建类别目录,别把训练集和验证集混在一起,否则指标好看但泛化能力不行。

最后提醒一句:写毕设文档时,"系统测试"这一章不要只写识别率一个数。按车牌颜色、拍摄距离、白天夜晚、倾斜角度分维度统计,才能体现你对系统的理解是真的。这也是我在做完第一版后最后悔没做好的事——当时只统计了整体识别率,答辩时评委一问"夜间识别率多少",我只能现场翻车。如果你正在做这个系统,三个月后你一定会感谢自己在测试数据整理上多花的这几个小时。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询