車牌識別與標注:基于百度OCR與OpenCV的實現(一)

在這里插入圖片描述

車牌識別與標注:基于百度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路由 重定向 首頁默認訪問 希望訪…