OpenCV+OCR實(shí)現(xiàn)弧形文字識(shí)別的示例代碼
以下是基于OpenCV與OCR實(shí)現(xiàn)弧形文字識(shí)別的完整技術(shù)方案,結(jié)合了圖像預(yù)處理、幾何變換與OCR引擎調(diào)用等關(guān)鍵步驟,并提供優(yōu)化技巧:
?? 一、技術(shù)原理
弧形文字識(shí)別的核心在于??將彎曲文本轉(zhuǎn)換為水平直線??,便于OCR引擎處理:
- ??幾何變換??:通過霍夫圓檢測(cè)定位弧形文字的圓心與半徑,利用極坐標(biāo)變換(
warpPolar)將弧形展開為矩形。 - ??OCR適配??:展開后的水平文本可直接輸入OCR引擎(如Tesseract或PaddleOCR)進(jìn)行識(shí)別。
?? 二、實(shí)現(xiàn)步驟與代碼詳解
?? ??1. 圖像預(yù)處理:擴(kuò)充與圓檢測(cè)??
import cv2
import numpy as np
# 讀取圖像并擴(kuò)充畫布(避免邊緣截?cái)啵?
img = cv2.imread("arc_text.png")
new_img = np.zeros((img.shape[0]*3, img.shape[1]*3, 3), dtype=np.uint8)
y_start, x_start = new_img.shape[0]//3, new_img.shape[1]//3
new_img[y_start:y_start+img.shape[0], x_start:x_start+img.shape[1]] = img
# 灰度化 + 中值濾波去噪
gray = cv2.cvtColor(new_img, cv2.COLOR_BGR2GRAY)
gray = cv2.medianBlur(gray, 5)
# 霍夫圓檢測(cè)(關(guān)鍵參數(shù)調(diào)節(jié))
circles = cv2.HoughCircles(
gray, cv2.HOUGH_GRADIENT, dp=1, minDist=100,
param1=200, param2=30, minRadius=300, maxRadius=500
)
x, y, radius = circles[0][0] # 取首個(gè)檢測(cè)到的圓??關(guān)鍵點(diǎn)??:
- ??圖像擴(kuò)充??:避免圓弧靠近邊緣導(dǎo)致檢測(cè)失敗。
- ??參數(shù)調(diào)節(jié)??:
param2(累加器閾值)控制圓檢測(cè)靈敏度,值越小檢測(cè)越多(可能包含噪聲)。
?? ??2. 極坐標(biāo)變換:弧形轉(zhuǎn)水平??
# 截取圓弧區(qū)域ROI
roi = new_img[int(y-radius):int(y+radius), int(x-radius):int(x+radius)]
center_roi = (radius, radius) # ROI內(nèi)圓心坐標(biāo)
# 極坐標(biāo)變換(300x600為輸出圖像尺寸)
polar_img = cv2.warpPolar(
roi, (600, 300), center_roi, radius,
flags=cv2.WARP_POLAR_LINEAR + cv2.INTER_CUBIC
)
polar_img = cv2.rotate(polar_img, cv2.ROTATE_90_CLOCKWISE) # 旋轉(zhuǎn)為水平文本
cv2.imwrite("polar_transformed.jpg", polar_img)??效果??:弧形文字被展開為水平方向,如:
https://example.com/polar_demo.jpg
(圖示:弧形文字→水平文本的轉(zhuǎn)換結(jié)果)
?? ??3. OCR識(shí)別與結(jié)果映射??
# 使用PaddleOCR識(shí)別水平文本
from paddleocr import PaddleOCR
ocr = PaddleOCR(use_angle_cls=True, lang="ch")
result = ocr.ocr(polar_img, cls=True)
# 解析識(shí)別結(jié)果
texts = [line[1][0] for line in result[0]]
print("識(shí)別結(jié)果:", "".join(texts))
# 反極坐標(biāo)變換(可選:將結(jié)果框映射回原圖)
polar_inv = cv2.warpPolar(
polar_img, (2*radius, 2*radius), center_roi, radius,
flags=cv2.WARP_INVERSE_MAP + cv2.WARP_POLAR_LINEAR
)
new_img[y_start:y_start+img.shape[0], x_start:x_start+img.shape[1]] = polar_inv??OCR選型建議??:
- ??中文場(chǎng)景??:優(yōu)先選PaddleOCR(對(duì)中文支持更好)。
- ??英文場(chǎng)景??:Tesseract +
--psm 6(識(shí)別整塊文本)。
? 三、優(yōu)化技巧與常見問題
??圓心檢測(cè)失敗??:
- 調(diào)整
cv2.HoughCircles的param1(邊緣梯度閾值)和param2(累加器閾值)。 - 手動(dòng)指定圓心:若圖像中圓弧不完整,可直接標(biāo)注圓心坐標(biāo)。
- 調(diào)整
??文字扭曲矯正??:
- 若極坐標(biāo)變換后文字傾斜,添加旋轉(zhuǎn)校正(
cv2.getRotationMatrix2D+cv2.warpAffine)。
- 若極坐標(biāo)變換后文字傾斜,添加旋轉(zhuǎn)校正(
??識(shí)別精度提升??:
- ??預(yù)處理??:對(duì)展開后的圖像進(jìn)行銳化(
cv2.filter2D)或?qū)Ρ榷仍鰪?qiáng)(cv2.equalizeHist)。 - ??OCR配置??:Tesseract啟用
--oem 3(LSTM引擎)+ 語言模型微調(diào)。
- ??預(yù)處理??:對(duì)展開后的圖像進(jìn)行銳化(
?? 四、不同形狀文字識(shí)別方案對(duì)比
| ??文字形狀?? | ??核心技術(shù)?? | ??適用OCR引擎?? | ??難度?? |
|---|---|---|---|
| 弧形文字 | 霍夫圓檢測(cè) + 極坐標(biāo)變換 | PaddleOCR/Tesseract | ???? |
| 環(huán)形文字 | 圓心擴(kuò)展 + 極坐標(biāo)變換 | Tesseract | ??? |
| 直線文本 | 透視變換(仿射變換) | 任意OCR引擎 | ?? |
| 扭曲文本 | 薄板樣條變換(TPS) | CRNN + 語言模型 | ????? |
??注??:實(shí)際應(yīng)用中需根據(jù)圖像分辨率動(dòng)態(tài)調(diào)整霍夫圓參數(shù)與ROI大小。對(duì)于復(fù)雜背景,建議先使用語義分割(如U-Net)提取文字區(qū)域再處理。
到此這篇關(guān)于OpenCV+OCR實(shí)現(xiàn)弧形文字識(shí)別的文章就介紹到這了,更多相關(guān)OpenCV OCR弧形文字識(shí)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)計(jì)算AUC的示例代碼
AUC(Area?under?curve)是機(jī)器學(xué)習(xí)常用的二分類評(píng)測(cè)手段,直接含義是ROC曲線下的面積。本文將利用Python語言實(shí)現(xiàn)計(jì)算AUC,感興趣的可以學(xué)習(xí)一下2022-07-07
python實(shí)現(xiàn)最大子序和(分治+動(dòng)態(tài)規(guī)劃)
這篇文章主要介紹了python實(shí)現(xiàn)最大子序和(分治+動(dòng)態(tài)規(guī)劃),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
python使用Pycharm創(chuàng)建一個(gè)Django項(xiàng)目
這篇文章主要介紹了python使用Pycharm創(chuàng)建一個(gè)Django項(xiàng)目,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03
78行Python代碼實(shí)現(xiàn)現(xiàn)微信撤回消息功能
這篇文章主要介紹了78行Python代碼實(shí)現(xiàn)現(xiàn)微信撤回消息功能,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-07-07
python+opencv實(shí)現(xiàn)攝像頭調(diào)用的方法
這篇文章主要為大家詳細(xì)介紹了python+opencv實(shí)現(xiàn)攝像頭調(diào)用的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06
Python實(shí)現(xiàn)屬性可修改的裝飾器方式
這篇文章主要介紹了Python實(shí)現(xiàn)屬性可修改的裝飾器方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02

