基于OpenCV的图像文本检测脚本优化及任意方向检测方法咨询
任意方向文本检测识别解决方案
现有代码问题排查
- 未加入文本方向检测与校正逻辑,Tesseract默认仅支持识别水平正向文本,旋转/倾斜的文本无法正确识别
- 固定阈值二值化适配性差,不同亮度的图像容易丢失文本特征
- 未做文本区域定位,直接将整张含大量干扰的图像输入识别模型,准确率极低
方案1:基于Tesseract优化,支持0/90/180/270度旋转文本检测
你可以启用Tesseract自带的方向检测能力,配合OpenCV旋转校正,修改后代码如下:
import cv2 import pytesseract import numpy as np from pytesseract import Output pytesseract.pytesseract.tesseract_cmd = 'C:/Program Files/Tesseract-OCR/tesseract' def rotate_image(image, angle): h, w = image.shape[:2] center = (w // 2, h // 2) M = cv2.getRotationMatrix2D(center, angle, 1.0) rotated = cv2.warpAffine(image, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE) return rotated img = cv2.imread('your_image_path.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 自适应阈值处理,适配不同亮度 thresh = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV,11,2) # 检测文本方向 osd = pytesseract.image_to_osd(thresh, output_type=Output.DICT) rotate_angle = osd['rotate'] corrected = rotate_image(thresh, rotate_angle) # 识别文本及位置,支持多行多文本 d = pytesseract.image_to_data(corrected, output_type=Output.DICT) n_boxes = len(d['text']) result_img = rotate_image(img.copy(), rotate_angle) for i in range(n_boxes): if int(d['conf'][i]) > 60: # 只保留置信度高于60的结果 (x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i]) cv2.rectangle(result_img, (x, y), (x + w, y + h), (0, 255, 0), 2) print(f"文本内容:{d['text'][i]},位置:({x},{y},{w},{h})") cv2.imshow("校正后识别结果", result_img) cv2.waitKey(0)
注意:使用该方案需要你安装Tesseract时勾选了OSD(方向和脚本检测)组件。
方案2:支持任意角度倾斜文本检测
如果需要识别任意角度倾斜、甚至是弯曲的文本,推荐使用预训练的文本检测模型搭配识别引擎:
- 可以调用OpenCV自带的EAST文本检测模型,先定位所有任意方向的文本框,再对每个文本框单独做校正后送Tesseract识别
- 也可以直接使用PaddleOCR等端到端OCR工具,内置支持任意方向文本检测识别,无需自己做预处理和校正逻辑,开箱即可获取文本内容和对应坐标。
内容的提问来源于stack exchange,提问作者Abdo Abdelaziz
相关产品推荐
相关产品推荐

