话不多说,先出效果图

在这里插入图片描述

录屏_20250519_221242

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

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

我对代码进行了以下优化,使其能够显示原始图片、检测框和识别结果:

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

这个优化后的车牌识别系统不仅功能完整,而且具有现代感的 UI 设计和流畅的用户体验。

image-20250519222531941

image-20250519222548241

image-20250519222617015

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

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

image-20250519223056185

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

然后继续改正:

# 车牌号正则表达式(兼容中间的·符号)
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 获取源码地址。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐