文章目录
- import cv2 import numpy as np # 读取图像并扩充画布(避免边缘截断) 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) # 霍夫圆检测(关键参数调节) 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] # 取首个检测到的圆 关键点: 图像扩充:避免圆弧靠近边缘导致检测失败。 参数调节:param2(累加器阈值)控制圆检测灵敏度,值越小检测越多(可能包含噪声)。
- # 截取圆弧区域ROI roi = new_img[int(y-radius):int(y+radius), int(x-radius):int(x+radius)] center_roi = (radius, radius) # ROI内圆心坐标 # 极坐标变换(300×600为输出图像尺寸) 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) # 旋转为水平文本 cv2.imwrite(“polar_transformed.jpg”, polar_img) 效果:弧形文字被展开为水平方向,如:https://example.com/polar_demo.jpg(图示:弧形文字→水平文本的转换结果)
- # 使用PaddleOCR识别水平文本 from paddleocr import PaddleOCR ocr = PaddleOCR(use_angle_cls=True, lang=”ch”) result = ocr.ocr(polar_img, cls=True) # 解析识别结果 texts = [line[1][0] for line in result[0]] print(“识别结果:”, “”.join(texts)) # 反极坐标变换(可选:将结果框映射回原图) 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选型建议: 中文场景:优先选PaddleOCR(对中文支持更好)。 英文场景:Tesseract + –psm 6(识别整块文本)。
目录
- 🔍 一、技术原理
- 🛠 二、实现步骤与代码详解
- 📌 1. 图像预处理:扩充与圆检测
- 📌 2. 极坐标变换:弧形转水平
- 📌 3. OCR识别与结果映射
- ⚙ 三、优化技巧与常见问题
- 💎 四、不同形状文字识别方案对比
以下是基于OpenCV与OCR实现弧形文字识别的完整技术方案,结合了图像预处理、几何变换与OCR引擎调用等关键步骤,并提供优化技巧:
弧形文字识别的核心在于将弯曲文本转换为水平直线,便于OCR引擎处理:
- 几何变换:通过霍夫圆检测定位弧形文字的圆心与半径,利用极坐标变换(
warpPolar)将弧形展开为矩形。 - OCR适配:展开后的水平文本可直接输入OCR引擎(如Tesseract或PaddleOCR)进行识别。
import cv2
import numpy as np
# 读取图像并扩充画布(避免边缘截断)
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)
# 霍夫圆检测(关键参数调节)
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] # 取首个检测到的圆
关键点:
- 图像扩充:避免圆弧靠近边缘导致检测失败。
- 参数调节:
param2(累加器阈值)控制圆检测灵敏度,值越小检测越多(可能包含噪声)。
# 截取圆弧区域ROI
roi = new_img[int(y-radius):int(y+radius), int(x-radius):int(x+radius)]
center_roi = (radius, radius) # ROI内圆心坐标
# 极坐标变换(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) # 旋转为水平文本
cv2.imwrite("polar_transformed.jpg", polar_img)
效果:弧形文字被展开为水平方向,如:
https://example.com/polar_demo.jpg
(图示:弧形文字→水平文本的转换结果)
# 使用PaddleOCR识别水平文本
from paddleocr import PaddleOCR
ocr = PaddleOCR(use_angle_cls=True, lang="ch")
result = ocr.ocr(polar_img, cls=True)
# 解析识别结果
texts = [line[1][0] for line in result[0]]
print("识别结果:", "".join(texts))
# 反极坐标变换(可选:将结果框映射回原图)
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选型建议:
- 中文场景:优先选PaddleOCR(对中文支持更好)。
- 英文场景:Tesseract +
--psm 6(识别整块文本)。
-
圆心检测失败:
- 调整
cv2.HoughCircles的param1(边缘梯度阈值)和param2(累加器阈值)。
- 手动指定圆心:若图像中圆弧不完整,可直接标注圆心坐标。
-
文字扭曲矫正:
- 若极坐标变换后文字倾斜,添加旋转校正(
cv2.getRotationMatrix2D + cv2.warpAffine)。
-
识别精度提升:
- 预处理:对展开后的图像进行锐化(
cv2.filter2D)或对比度增强(cv2.equalizeHist)。
- OCR配置:Tesseract启用
--oem 3(LSTM引擎)+ 语言模型微调。
圆心检测失败:
- 调整
cv2.HoughCircles的param1(边缘梯度阈值)和param2(累加器阈值)。 - 手动指定圆心:若图像中圆弧不完整,可直接标注圆心坐标。
文字扭曲矫正:
- 若极坐标变换后文字倾斜,添加旋转校正(
cv2.getRotationMatrix2D+cv2.warpAffine)。
识别精度提升:
- 预处理:对展开后的图像进行锐化(
cv2.filter2D)或对比度增强(cv2.equalizeHist)。 - OCR配置:Tesseract启用
--oem 3(LSTM引擎)+ 语言模型微调。
| 文字形状 | 核心技术 | 适用OCR引擎 | 难度 |
|---|---|---|---|
| 弧形文字 | 霍夫圆检测 + 极坐标变换 | PaddleOCR/Tesseract | ⭐⭐⭐⭐ |
| 环形文字 | 圆心扩展 + 极坐标变换 | Tesseract | ⭐⭐⭐ |
| 直线文本 | 透视变换(仿射变换) | 任意OCR引擎 | ⭐⭐ |
| 扭曲文本 | 薄板样条变换(TPS) | CRNN + 语言模型 | ⭐⭐⭐⭐⭐ |
注:实际应用中需根据图像分辨率动态调整霍夫圆参数与ROI大小。对于复杂背景,建议先使用语义分割(如U-Net)提取文字区域再处理。
到此这篇关于OpenCV+OCR实现弧形文字识别的文章就介绍到这了,更多相关OpenCV OCR弧形文字识别内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!
您可能感兴趣的文章:
- Opencv实现身份证OCR识别的示例详解
- OpenCV使用KNN完成OCR手写体识别
- Python Opencv实战之文字检测OCR
- 使用Python+OpenCV进行卡类型及16位卡号数字的OCR功能
- Opencv 图片的OCR识别的实战示例