在这里插入图片描述

车牌识别与标注:基于百度OCR与OpenCV的实现

在计算机视觉领域,车牌识别是一项极具实用价值的技术,广泛应用于交通监控、智能停车场管理等领域。本文将介绍如何在macOS系统下,利用百度OCR API进行车牌识别,并结合OpenCV库在图片上绘制标注框和车牌号码,实现一个完整的车牌识别与标注流程。整个工程将使用PyCharm进行组织和开发 。

一、系统环境与工程结构

系统环境

  • 操作系统:macOS
  • 开发工具:PyCharm
  • Python版本:Python 3.x

工程结构

project-root/
├── src/
│   └── main.py
├── test5.jpg
└── STHeiti Light.ttc
  • src/main.py:包含车牌识别与标注的代码。
  • test5.jpg:用于测试的图片文件。
  • STHeiti Light.ttc:从/System/Library/Fonts/STHeiti拷贝的中文字体文件,用于在图片上绘制中文文本。

二、百度OCR车牌识别API简介

百度OCR(Optical Character Recognition,光学字符识别)提供了强大的车牌识别功能。通过向其API发送图片数据,我们可以获取车牌号码、车牌颜色、车牌位置等信息。API返回的数据格式如下:
https://ai.baidu.com/tech/ocr_cars/plate
在这里插入图片描述

{"words_result": [{"number": "粤A7Z0K0","vertexes_location": [{"x": 145,"y": 482},{"x": 302,"y": 511},{"x": 294,"y": 569},{"x": 137,"y": 539}],"color": "blue","probability": [0.9999998808,1,1,0.9999991655,0.9999996424,0.9999986887,0.9999991655]}],"log_id": "1937791826711303139"
}

其中,number字段表示识别到的车牌号码;vertexes_location字段是一个包含四个坐标的数组,表示车牌在图片中的位置;color字段表示车牌颜色;probability字段是一个数组,表示每个字符识别的置信度。

三、使用OpenCV绘制车牌标注

在获取到车牌信息后,我们需要在图片上绘制标注框并显示车牌号码。这里我们使用了OpenCV库,它是一个功能强大的计算机视觉库,提供了丰富的图像处理功能。

以下是绘制车牌标注的代码实现:

import cv2
import numpy as np
import math
from PIL import Image, ImageDraw, ImageFontdef draw_parallelogram_with_text(image_path, coords, text="车牌区域", width_ratio=0.60, font_path="STHeiti Light.ttc"):"""在图片上绘制平行四边形并添加对齐且宽度按比例缩放的中文文本:param image_path: 图片路径:param coords: 平行四边形的四个坐标点,格式为[(x1, y1), (x2, y2), (x3, y3), (x4, y4)]:param text: 要添加的文本,默认为"车牌区域":param width_ratio: 文本宽度占平行四边形宽度的比例,默认为 0.6:param font_path: 中文字体文件路径:return: 处理后的图片"""# 读取图片image = cv2.imread(image_path)if image is None:raise FileNotFoundError(f"无法加载图片:{image_path}")# 绘制平行四边形cv2.fillPoly(image, [np.array(coords)], (255, 0, 0))  # 蓝色填充# 计算平行四边形宽度(取前两点之间的距离作为参考宽度)p1, p2 = coords[0], coords[1]parallelogram_width = math.hypot(p2[0] - p1[0], p2[1] - p1[1])# 获取包围盒x_coords = [p[0] for p in coords]y_coords = [p[1] for p in coords]min_x, max_x = min(x_coords), max(x_coords)min_y, max_y = min(y_coords), max(y_coords)# 居中位置(先估算)pil_image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))draw = ImageDraw.Draw(pil_image)# 初始字体大小init_font_size = 30font = ImageFont.truetype(font_path, init_font_size)# 【关键修改】获取文本宽度(新方法)init_text_width = font.getlength(text)init_text_height = font.getmetrics()[0]  # 获取字体高度(ascent)# 根据比例调整字体大小scale = (parallelogram_width * width_ratio) / init_text_widthfont_size = int(init_font_size * scale)font = ImageFont.truetype(font_path, font_size)# 再次获取实际文本尺寸text_width = font.getlength(text)text_height = font.getmetrics()[0]# 居中计算text_x = min_x + (max_x - min_x - text_width) // 2text_y = min_y + (max_y - min_y - text_height) // 2# 创建空白图像用于绘制文字text_layer = Image.new("RGBA", pil_image.size, (0, 0, 0, 0))draw = ImageDraw.Draw(text_layer)draw.text((text_x, text_y), text, fill=(255, 255, 255, 255), font=font)# 计算旋转角度def get_angle(p1, p2):dx = p2[0] - p1[0]dy = p2[1] - p1[1]return math.degrees(math.atan2(dy, dx))angle = get_angle(coords[0], coords[1])# 旋转文本图层rotated_text = text_layer.rotate(-angle, center=(text_x + text_width // 2, text_y + text_height // 2), expand=0)# 合并到原图pil_image.paste(rotated_text, mask=rotated_text.split()[3])  # 使用 alpha 通道做透明融合# 转回 OpenCV 格式result_image = cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR)return result_image# 示例使用
if __name__ == "__main__":image_path = "../test5.jpg"  # 替换为你的图片路径# 示例坐标  test3# coords = [(417, 531), (583, 519), (586, 569), (420, 581)]  # 替换为你的坐标值# test5coords = [(145, 482), (302, 511), (294, 569), (137, 539)]  # 替换为你的坐标值result_image = draw_parallelogram_with_text(image_path, coords)# 显示结果cv2.imshow("Result", result_image)cv2.waitKey(0)cv2.destroyAllWindows()# 保存结果图片cv2.imwrite("result_image.jpg", result_image)

运行效果:
在这里插入图片描述

代码解析

  1. 图片读取与绘制平行四边形:使用cv2.imread读取图片,然后通过cv2.fillPoly函数根据车牌的四个坐标点绘制平行四边形。
  2. 计算平行四边形宽度与包围盒:通过计算两个相邻点之间的距离来估算平行四边形的宽度,并获取包围盒的坐标范围。
  3. 文本绘制与字体大小调整:使用Pillow库(PIL)绘制文本。首先根据平行四边形宽度和指定的比例调整字体大小,然后计算文本的居中位置。
  4. 文本旋转与融合:计算文本旋转角度,将文本图层旋转后与原图融合,实现文本与平行四边形的对齐。

四、实际应用与优化

实际应用场景

  1. 交通监控系统:在交通监控中,车牌识别可以用于车辆的自动识别与追踪,帮助交通管理部门更好地管理交通流量,打击交通违法行为。
  2. 智能停车场管理:通过车牌识别,停车场可以实现自动计费、车辆进出管理等功能,提高停车场的运营效率和用户体验。

优化建议

  1. 性能优化:在实际应用中,车牌识别和标注的性能至关重要。可以通过多线程或异步处理来提高处理速度,同时优化代码逻辑,减少不必要的计算。
  2. 准确性提升:虽然百度OCR提供了较高的识别准确率,但在一些复杂场景下(如车牌污损、遮挡等)仍可能出现识别错误。可以通过增加预处理步骤(如图像增强、去噪等)来提高识别的准确性。
  3. 用户体验优化:在展示结果时,可以考虑添加更多的交互功能,如车牌信息的详细展示、历史记录查询等,提升用户的使用体验。

五、总结

本文介绍了在macOS系统下,基于百度OCR和OpenCV的车牌识别与标注技术。通过调用百度OCR API获取车牌信息,并使用OpenCV在图片上绘制标注框和车牌号码,实现了一个完整的车牌识别与标注流程。整个工程使用PyCharm进行组织和开发,代码源文件位于src/main.py,资源文件如test5.jpgSTHeiti Light.ttc位于工程根目录。在实际应用中,可以根据具体需求进行优化和扩展,以满足不同的应用场景。希望本文能够为从事相关工作的开发者提供一定的参考和帮助。


以我之思,借AI之力

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/912809.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912809.shtml
英文地址,请注明出处:http://en.pswp.cn/news/912809.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【系统分析师】2021年真题:论文及解题思路

文章目录 试题一:论面向对象的信息系统分析方法试题二:论静态测试方法及其应用试题三:论富互联网应用的客户端开发技术试题四:论DevSecOps技术及其应用 试题一:论面向对象的信息系统分析方法 信息系统分析是信息系统生…

OFA-PT:统一多模态预训练模型的Prompt微调

摘要 Prompt微调已成为模型微调的新范式,并在自然语言预训练甚至视觉预训练中取得了成功。参数高效的Prompt微调方法通过优化soft embedding并保持预训练模型冻结,在计算成本低和几乎无性能损失方面展现出优势。在本研究中,我们探索了Prompt…

【硬核数学】2.5 “价值标尺”-损失函数:信息论如何设计深度学习的损失函数《从零构建机器学习、深度学习到LLM的数学认知》

欢迎来到本系列硬核数学之旅的第十篇,也是我们对经典数学领域进行深度学习“升级”的最后一站。我们已经拥有了强大的模型架构(基于张量)、高效的学习引擎(反向传播)和智能的优化策略(Adam等)。…

雷卯针对灵眸科技EASY EAI nano RV1126 开发板防雷防静电方案

一、应用场景 1. 人脸检测 2. 人脸识别 3. 安全帽检测 4. 人员检测 5. OCR文字识别 6. 人头检测 7. 表情神态识别 8. 人体骨骼点识别 9. 火焰检测 10. 人脸姿态估计 11. 人手检测 12. 车辆检测 13. 二维码识别 二、 功能概述 1 CPU 四核ARM Cortex-A71.5GHz 2 …

【记录】Ubuntu|Ubuntu服务器挂载新的硬盘的流程(开机自动挂载)

简而言之,看这张图片就好(可以存一下,注意挂载点/data可以自定义,挂载硬盘的位置/dev/sdb要改成步骤1中检查的时候查到的那个位置,不过这个图的自动挂载漏了UUID,可以通过blkid指令查找)&#x…

六、软件操作手册

建议在飞书平台阅读此文。 我将沿着初来乍到的用户的浏览路径介绍“诤略参谋”应用。 目录 一、用户信息1.1 注册、登录、自动登录、忘记密码、修改用户名、修改密码、退出登录与个性化设置1.2 认识主界面与任务系统1.3 语义审查、Knowledge Cutoff 审查1.4 重要内容未保存提醒…

电脑键盘不能打字了怎么解决 查看恢复方法

电脑键盘打不了字,这是我们电脑使用过程中,偶尔会遇到的电脑故障问题。一般来说,电脑键盘打不出字,可能是硬件故障、驱动问题或系统设置错误等多种原因引起。本文将详细介绍一些常见的原因和解决方法,帮助用户恢复正常…

基于STM32的土豆种植自动化灌溉系统设计与实现

📌 项目简介 随着农业现代化发展及水资源短缺问题日益突出,传统土豆种植方式在浇灌效率与用水科学性方面暴露出诸多问题。本文基于STM32F103C8T6微控制器,设计并实现了一种智能化的土豆种植自动灌溉系统,集成多种环境传感器(温湿度、土壤湿度、光照)、控制设备(水泵、…

第8篇:Gin错误处理——让你的应用更健壮

作者:GO兔 博客:https://luckxgo.cn 分享大家都看得懂的博客 引言 在Web应用开发中,错误处理是保证系统稳定性和用户体验的关键环节。Gin作为高性能的Go Web框架,提供了灵活的错误处理机制,但许多开发者在实际项目中仍会遇到错误处理混乱、异…

【PyCharm】Python安装路径查找

PyCharm应用笔记 第一章 Python安装路径查找 文章目录 PyCharm应用笔记前言一、电脑设置查找二、资源管理器查找 前言 本文主要介绍几种Python安装路径查找的方法。 一、电脑设置查找 简述过程:设置》应用》安装的应用》搜索框输入Python。 注:电脑使用…

数据结构:递归:汉诺塔问题(Tower of Hanoi)

目录 问题描述 第一性原理分析 代码实现 第一步:明确函数要干什么 第二步:写好递归的“结束条件” 第三步:写递归步骤 🌳 递归调用树 🔍复杂度分析 时间复杂度:T(n) 2^n - 1 空间复杂度分析 问题描…

synetworkflowopenrestydpdk

一.skynet 1. Skynet 的核心架构是什么?简述其进程与服务模型。 Skynet 采用多进程多服务架构。主进程负责管理和监控,多个工作进程(worker)负责实际服务运行。每个服务(service)是一个独立的 Lua 虚拟机&…

【甲方安全视角】安全防御体系建设

文章目录 前言一、云安全防护能力第一阶段:搭建安全防护设施第二阶段:安全防护设施的精细化运营第三阶段:安全运营周报输出二、IT安全防护能力(一)办公网安全设施建设(二)办公网安全运营三、基础安全防护能力(一)物理安全(二)运维安全(三)安全应急响应四、总结前言…

计算机组成原理与体系结构-实验一 进位加法器(Proteus 8.15)

目录 一、实验目的 二、实验内容 三、实验器件 四、实验原理 4.1 行波进位加法器 4.2 先行进位加法器 4.3 选择进位加法器(尝试猜测原理) 五、实验步骤与思考题 一、实验目的 1、了解半加器和全加器的电路结构。 2、掌握串行进位加法器和并行进…

react+antd Table实现列拖拽,列拉宽,自定义拉宽列

主要插件Resizable,dnd-kit/core,dnd-kit/sortable,dnd-kit/modifiers 其中官网有列拖拽,主要结合Resizable 实现列拉宽,isResizingRef 很重要防止拖拽相互影响 1.修改TableHeaderCell const isResizingRef useRef(…

光照解耦和重照明

项目地址: GitHub - NJU-3DV/Relightable3DGaussian: [ECCV2024] 可重新照明的 3D 高斯:使用 BRDF 分解和光线追踪的实时点云重新照明 可优化参数 gaussians.training_setup(opt) if is_pbr:: direct_env_light.training_setup…

Kafka 运维与调优篇:构建高可用生产环境的实战指南

🛠️ Kafka 运维与调优篇:构建高可用生产环境的实战指南 导语:在生产环境中,Kafka集群的稳定运行和高性能表现是业务成功的关键。本篇将深入探讨Kafka运维与调优的核心技术,从监控管理到性能优化,再到故障排…

AR 地产互动沙盘:为地产沙盘带来变革​

在科技飞速发展的今天,AR(增强现实)技术应运而生,为解决传统地产沙盘的困境提供了全新的思路和方法。AR 技术,简单来说,是一种将计算机生成的虚拟信息与真实环境相融合的技术。它通过摄像头、传感器等设备获…

端到端自动驾驶系统关键技术

一、感知决策一体化模型架构 单一神经网络整合全流程 端到端神经网络能够直接将传感器输入映射为控制输出,消除了传统模块化架构中感知、规划、控制等独立模块之间的割裂。传统架构中,感知模块负责识别环境信息,决策模块根据感知结果进行路…

Vue Vue-route (2)

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue-route重定向和声明式导航 目录 Vue-route路由 重定向 首页默认访问 不存在匹配 声明式导航 路由原理 使用示例 自定义class类 Tag设置 版本4路由 改变 示例 总结 Vue-route路由 重定向 首页默认访问 希望访…