掘金 人工智能 05月20日 10:03
使用Trae基于 PaddleOCR 技术实现车牌识别系统
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文分享了使用PaddleOCR技术构建车牌识别系统的实践过程。作者首先通过Cursor和豆包等工具描述需求、优化代码,实现了原始图像显示、检测框和识别结果展示等功能,并构建了现代化的前端界面。随后,作者使用Trae工具解决代码错误,最终完成了车牌识别系统的开发。整个过程耗时约两小时,并提供了源码获取方式。

💡 **需求定义与初步实现**: 作者利用Cursor和豆包等工具,快速定义了基于PaddleOCR的车牌识别系统需求,并生成了初步的代码框架。

🖼️ **核心功能完善**: 作者通过优化代码,实现了原始图片显示、检测框绘制以及识别结果的展示,使得系统功能更加完善,便于用户理解。

🛠️ **工具辅助与问题解决**: 作者使用Trae工具解决了代码中的版本兼容、依赖冲突等问题,确保了系统的稳定性和可用性。

🎨 **用户界面优化**: 系统设计了现代化的前端界面,包括拖放上传、卡片式布局、加载状态和错误处理等功能,提升了用户体验。

话不多说,先出效果图

最近浏览博客的时候,总是刷到关于OCR技术,于是就想做一个车牌识别的软件,我首先使用了Cursor描述了我的需求,给的指令:帮我实现一个基于PaddleOCR 的车牌识别系统。然后给了一些代码格式,因为没有付费,体验权限用完了,紧接着用豆包做了一些需求描述

我给代码贴了过去,让他帮我优化一下代码:帮我优化一下代码 使其实现显示原始图片、检测框和识别结果。

我对代码进行了以下优化,使其能够显示原始图片、检测框和识别结果:1. **添加了图像处理功能**:创建了`draw_boxes_and_texts`函数,在原始图像上绘制检测框和识别文本,并保存处理后的图像。2. **改进了识别结果处理**:   - 现在会返回所有识别结果,并特别标记出符合车牌格式的文本   - 优化了结果数据结构,使其包含更多信息3. **更新了 API 响应格式**:返回原始图片 URL 和处理后图片 URL,以及详细的识别结果4. **创建了现代化的前端界面**:   - 使用 Tailwind CSS 构建了响应式、美观的界面   - 添加了拖放上传功能   - 设计了卡片式布局展示识别结果   - 实现了加载状态和错误处理   - 添加了平滑过渡动画和微交互效果5. **增强了用户体验**:   - 提供清晰的视觉反馈   - 显示识别置信度条形图   - 支持不同类型车牌的样式区分   - 提供直观的重试机制这个优化后的车牌识别系统不仅功能完整,而且具有现代感的 UI 设计和流畅的用户体验。

给出了一系列的基础代码,这个时候已经成型

接下来我将代码导入到 Trae工具,让他帮我解决一系列的错误,如:版本兼容问题、依赖冲突、返回的结果结构处理等。

但是在车牌识别的时候,车牌的正则有点问题,识别的时候中间有点·,导致内容错误

然后继续改正:

# 车牌号正则表达式(兼容中间的·符号)PLATE_PATTERN = r'^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z]·?[A-Z0-9]{4,5}[A-Z0-9挂学警港澳]$'  # 修改点:添加·?匹配可选的中间点

核心代码:

def detect_plate(image_path):    """检测并识别车牌"""    try:        # 读取图片        img = cv2.imread(image_path)        if img is None:            return None, "无法读取图片"        # 使用PaddleOCR进行文字识别        result = ocr.ocr(img, cls=True)        print(f"OCR Result: {result}")  # 打印OCR结果                # 检查OCR结果是否有效        if not isinstance(result, list) or len(result) == 0:            return {                'plates': [],                'message': '未识别到任何文本',                'output_image_url': None            }, None                    # 生成输出图片路径        filename = os.path.basename(image_path)        output_path = os.path.join(app.config['OUTPUT_FOLDER'], f"output_{filename}")                # 绘制检测框和文本        output_image_path, error = draw_boxes_and_texts(image_path, result, output_path)        if error:            return None, error                # 提取识别结果        plates = []        for line in result:            for item in line:  # 每个 item 包含 [检测框坐标, (文本, 置信度)]                box = item[0]  # 检测框坐标(四边形)                text, confidence = item[1]  # 识别文本和置信度                                print(f"检测到文本:{text},置信度:{confidence}")  # 打印每个检测结果                # 校验是否为有效车牌(使用新正则)                if re.match(PLATE_PATTERN, text):                    plates.append(                        {                            'plate_number': text,                            'confidence': float(confidence),                            'is_valid_plate': True                        }                    )                    # 如果没有找到有效车牌,返回所有识别结果        if not plates:            for line in result:                if len(line) >= 2 and len(line[1]) >= 2:                    plates.append({                        'plate_number': line[1][0],                        'confidence': float(line[1][1]),                        'is_valid_plate': False                    })                        message = '未识别到有效车牌,但检测到以下文本' if plates else '未识别到有效车牌'        else:            message = '成功识别到车牌'                    return {            'plates': plates,            'message': message,            'output_image_url': f'/static/output/output_{filename}'        }, None    except Exception as e:        import traceback        print(traceback.format_exc())  # 打印完整的错误堆栈        return None, f"处理过程中出错: {str(e)}"

最后形成成品,耗时两个小时,收工!!!示例源码:关注公众号“Harry技术”,回复 ocr 获取源码地址。

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

PaddleOCR 车牌识别 OCR技术 人工智能 Python
相关文章