無法正確識別車牌(Python、OpenCv、Tesseract)

我正在嘗試識別車牌,但出現了錯誤,例如錯誤/未讀取字符

以下是每個步驟的可視化:

從顏色閾值+變形關閉獲得遮罩

以綠色突出顯示的車牌輪廓過濾器

將板輪廓粘貼到空白遮罩上

Tesseract OCR的預期結果

BP 1309 GD

但我得到的結果是

BP 1309 6D

我試著把輪廓切成3片

是的,它是有效的,但如果我在這個方法中插入差異圖像,一些圖像就無法識別,比如這個

字母N不可識別,但如果使用第一種方法,它會起作用

這是程序

import numpy as np
import pytesseract
import cv2
import ospytesseract.pytesseract.tesseract_cmd = r"C:\Program Files\Tesseract-OCR\tesseract.exe"
image_path = "data"for nama_file in sorted(os.listdir(image_path)):print(nama_file)# Load image, create blank mask, convert to HSV, define thresholds, color thresholdI = cv2.imread(os.path.join(image_path, nama_file))dim = (500, 120)I = cv2.resize(I, dim, interpolation = cv2.INTER_AREA)(thresh, image) = cv2.threshold(I, 127, 255, cv2.THRESH_BINARY)result = np.zeros(image.shape, dtype=np.uint8)result = 255 - resulthsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)lower = np.array([0,0,0])upper = np.array([179,100,130])mask = cv2.inRange(hsv, lower, upper)slices = []slices.append(result.copy())slices.append(result.copy())slices.append(result.copy())i = 0j = 0xs = []# Perform morph close and merge for 3-channel ROI extractionkernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))close = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel, iterations=1)extract = cv2.merge([close,close,close])# Find contours, filter using contour area, and extract using Numpy slicingcnts = cv2.findContours(close, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)cnts = cnts[0] if len(cnts) == 2 else cnts[1]boundingBoxes = [cv2.boundingRect(c) for c in cnts](cnts, boundingBoxes) = zip(*sorted(zip(cnts, boundingBoxes),key=lambda b:b[1][0], reverse=False))for c in cnts:x,y,w,h = cv2.boundingRect(c)area = w * hras = format(w / h, '.2f')if h >= 40 and h <= 70 and w >= 10 and w <= 65 and float(ras) <= 1.3:cv2.rectangle(I, (x, y), (x + w, y + h), (36,255,12), 3)result[y:y+h, x:x+w] = extract[y:y+h, x:x+w]# Slicexs.append(x)if i > 0:if (xs[i] - xs[i-1]) > 63:j = j+1i = i + 1slices[j][y:y+h, x:x+w] = extract[y:y+h, x:x+w]# Split throw into Pytesseractj=0for s in slices:cv2.imshow('result', s)cv2.waitKey()if j != 1 :data = pytesseract.image_to_string(s, lang='eng',config='--psm 6 _char_whitelist=ABCDEFGHIJKLMNOPQRTUVWXYZ')else :data = pytesseract.image_to_string(s, lang='eng',config='--psm 6 _char_whitelist=1234567890')print(data)# Block throw into Pytesseractdata = pytesseract.image_to_string(result, lang='eng',config='--psm 6')print(data)cv2.imshow('image', I)cv2.imshow('close', close)cv2.imshow('extract', extract)cv2.imshow('result', result)cv2.waitKey()

我嘗試了很多方法,找到了一些解決方案:

應用擴張形態學操作使字母變薄:

# Split throw into Pytesseract
j=0
for s in slices:cv2.imshow('result', s)cv2.waitKey(1)if j != 1:data = pytesseract.image_to_string(s, config="-c tessedit""_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890""  psm 6"" ")if data=='':            s = cv2.dilate(s, cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5)))cv2.imshow('cv2.dilate(s)', s)cv2.waitKey(1)data = pytesseract.image_to_string(s, config="-c tessedit""_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890""  psm 6"" ")else:pytesseract.pytesseract.tessedit_char_whitelist = '1234567890'data = pytesseract.image_to_string(s, lang='eng',config=' psm 6 _char_whitelist=1234567890')print(data)

這種行為很奇怪。
有很多投訴,建議的解決方案不起作用

至少我學會了如何使用_char_whitelist選項(您需要添加-c tessedit

我認為該解決方案不夠健壯(可能是偶然工作)。
我認為在當前版本的Tesseract中沒有簡單的解決方案

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/35767.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/35767.shtml
英文地址,請注明出處:http://en.pswp.cn/news/35767.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

騰訊云標準型CVM云服務器詳細介紹

騰訊云CVM服務器標準型實例的各項性能參數平衡&#xff0c;標準型云服務器適用于大多數常規業務&#xff0c;例如&#xff1a;web網站及中間件等&#xff0c;常見的標準型云服務器有CVM標準型S5、S6、SA3、SR1、S5se等規格&#xff0c;騰訊云服務器網來詳細說下云服務器CVM標準…

NAS搭建指南一——服務器的選擇與搭建

一、服務器的選擇 有自己的本地的公網 IP 的請跳過此篇文章按需求選擇一個云服務器&#xff0c;目的就是為了進行 frp 的搭建&#xff0c;完成內網穿透我選擇的是騰訊云服務器&#xff0c;我的配置如下&#xff0c;僅供參考&#xff1a; 4. 騰訊云服務器官網地址 二、服務器…

docker 鏡像的導出與導入 save 與 load

一、鏡像導出 docker save 導出 將系統中的鏡像保存為壓縮包&#xff0c;進行文件傳輸。使用 docker save --help 查看命令各參數&#xff0c;或者去docker官網查看.以 hello-world鏡像為例。 A&#xff1a;將鏡像保存為tar包 docker save image > package.tar docker sa…

day9 10-牛客67道劍指offer-JZ66、19、20、75、23、76、8、28、77、78

文章目錄 1. JZ66 構建乘積數組暴力解法雙向遍歷 2. JZ19 正則表達式匹配3. JZ20 表示數值的字符串有限狀態機遍歷 4. JZ75 字符流中第一個不重復的字符5. JZ23 鏈表中環的入口結點快慢指針哈希表 6. JZ76 刪除鏈表中重復的結點快慢指針三指針如果只保留一個重復結點 7. JZ8 二…

gitblit-使用

1.登入GitBlit服務器 默認用戶和密碼: admin/admin 2.創建一個新的版本庫 點擊圖中的“版本庫”&#xff0c;然后點擊圖中“創建版本庫” 填寫名稱和描述&#xff0c;注意名稱最后一定要加 .git選擇限制查看、克隆和推送勾選“加入README”和“加入.gitignore文件”在圖中的1處…

使用IIS服務器部署Flask python Web項目

參考文章 ""D:\Program Files (x86)\Python310\python310.exe"|"D:\Program Files (x86)\Python310\lib\site-packages\wfastcgi.py"" can now be used as a FastCGI script processor參考文章 請求路徑填寫*&#xff0c;模塊選擇FastCgiModule&…

一鍵部署 Umami 統計個人網站訪問數據

談到網站統計&#xff0c;大家第一時間想到的肯定是 Google Analytics。然而&#xff0c;我們都知道 Google Analytics 會收集所有用戶的信息&#xff0c;對數據沒有任何控制和隱私保護。 Google Analytics 收集的指標實在是太多了&#xff0c;有很多都是不必要的&#xff0c;…

Javascript 深入了解map

map() 是 JavaScript 數組提供的一個高階函數&#xff0c;它用于對數組中的每個元素執行指定的函數&#xff0c;并返回一個新的數組&#xff0c;新數組中的元素是原數組中的每個元素經過函數處理后的結果。 map() 函數的語法如下&#xff1a; javascript array.map(callback(…

Multi-object navigation in real environments using hybrid policies 論文閱讀

論文信息 題目&#xff1a;Multi-object navigation in real environments using hybrid policies 作者&#xff1a;Assem Sadek, Guillaume Bono 來源&#xff1a;CVPR 時間&#xff1a;2023 Abstract 機器人技術中的導航問題通常是通過 SLAM 和規劃的結合來解決的。 最近…

優化堆排序(Java 實例代碼)

目錄 優化堆排序 Java 實例代碼 src/runoob/heap/HeapSort.java 文件代碼&#xff1a; 優化堆排序 上一節的堆排序&#xff0c;我們開辟了額外的空間進行構造堆和對堆進行排序。這一小節&#xff0c;我們進行優化&#xff0c;使用原地堆排序。 對于一個最大堆&#xff0c;首…

【設計模式】-策略模式:優雅處理條件邏輯

Java 策略模式之優雅處理條件邏輯 前言 在軟件開發中&#xff0c;我們經常會遇到根據不同的條件執行不同邏輯的情況。這時&#xff0c;策略模式是一種常用的設計模式&#xff0c;能夠使代碼結構清晰、易于擴展和維護。 本文將詳細介紹策略模式的概念及其在Java中的應用&#x…

flume系列之:監控Systemctl托管的flume agent組

flume系列之:監控Systemctl托管的flume agent組 一、需求背景二、相關技術博客三、遠程登陸flume機器四、發送飛書告警五、監控flume agent組狀態一、需求背景 flume接kafka集群,一個kafka集群對應一個flume agent組,會把一組flume agent用systemctl托管每接一個kafka集群會…

pytest 編寫規范

一、pytest 編寫規范 1、介紹 pytest是一個非常成熟的全功能的Python測試框架&#xff0c;主要特點有以下幾點&#xff1a; 1、簡單靈活&#xff0c;容易上手&#xff0c;文檔豐富&#xff1b;2、支持參數化&#xff0c;可以細粒度地控制要測試的測試用例&#xff1b;3、能夠…

差分升級在物聯網水表上的實現與應用(學習)

摘要 當越來越多的物聯網水表加入抄表系統后&#xff0c;實現了水表數據的信息化&#xff0c;并且當水表終端需要技術更新時&#xff0c;通過網絡方式來升級產品可以高效修復設備面臨的問題&#xff0c;減少用戶損失&#xff0c;降低維護成本&#xff0c;但同時也對有限的網絡…

遍歷集合List的五種方法以及如何在遍歷集合過程中安全移除元素

一、遍歷集合List的五種方法 測試數據 List<String> list new ArrayList<>(); list.add("A");list.add("B");list.add("C");1. 普通for循環 普通for循環&#xff0c;通過索引遍歷 for (int i 0; i < list.size(); i) {Syst…

form中表單切換,導致 relus 中的事件無法觸發,原因:頁面切換不要一直切換DOM,會導致問題,需要都顯示出來

修改前&#xff0c;因為重復渲染DOM導致綁定rules失效 修改前代碼使用 computed 計算出渲染的DOM&#xff0c;影響rules事件<el-formref"form"inline:model"billDetailCopy":rules"rules"size"small"label-position"right&quo…

selenium官網文檔閱讀總結(day 4)

1.selenium的工作原理 selenium的工作原理涉及以下主要組件和步驟&#xff1a; &#xff08;1&#xff09;WebDriver:這是selenium的核心組件&#xff0c;它是一個用于控制瀏覽器的API。WebDriver提供了許多方法&#xff0c;用于在瀏覽器中模擬用戶操作。不同的瀏覽器需要相應…

掌握Python的X篇_39_繼承

本篇將會是本專欄關于python基本語法的最后一個知識點&#xff0c;后期將會談python&#xff0c;就會介紹使用python專題&#xff0c;例如&#xff1a;做爬蟲、有架構的網站。 文章目錄 1. 為什么需要繼承2. 繼承的基本概念3. python中繼承的基礎語法4. 總結 1. 為什么需要繼承…

NLP語言模型概覽

語言模型結構分類 Encoder-Decoder&#xff08;Transformer&#xff09;: Encoder 部分是 Masked Multi-Head Self-Attention&#xff0c;Decoder 部分是 Casual Multi-Head Cross-Attention 和 Casual Multi-Head Self-Attention 兼具。比如T5&#xff0c;BART&#xff0c;MA…

騰訊云輕量服務器和云服務器的CPU處理器有差別嗎?

騰訊云輕量應用服務器和CVM云服務器的CPU處理器性能有差別嗎&#xff1f;創建輕量應用服務器時不支持指定底層物理服務器的CPU型號&#xff0c;騰訊云將隨機分配滿足套餐規格的物理CPU型號&#xff0c;通常優先選擇較新代次的CPU型號。而云服務器CVM的CPU處理器型號、主頻都是有…