如何用OpenCV循环提取鼠标选中的ROI并用于Tesseract OCR
循环提取ROI并用于Tesseract OCR识别
核心思路
你的ROI数据中,每个条目包含两个坐标点(x1,y1)、(x2,y2),对应OpenCV图像裁剪格式为img[y1:y2, x1:x2]。只需遍历ROI列表,逐个提取区域,再根据类型(文本/复选框)用Tesseract或自定义逻辑处理即可。
完整代码示例
import cv2 import pytesseract # 若Tesseract未加入系统环境变量,需指定路径 # pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' # 加载目标图像并转灰度(提升OCR识别率) img = cv2.imread('your_image_file.jpg') gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 你的ROI数据 roi = [[(276, 756), (940, 828), 'text', 'name'], [(1572, 764), (2332, 824), 'text', 'cnic'], [(1996, 692), (2052, 752), 'box', 'corporate'], [(2300, 692), (2356, 756), 'box', 'individual']] # 存储结果的字典 results = {} # 循环处理每个ROI for roi_item in roi: # 解包ROI的坐标、类型、名称 (x1, y1), (x2, y2), roi_type, roi_name = roi_item # 提取ROI区域 current_roi = gray_img[y1:y2, x1:x2] if roi_type == 'text': # 用Tesseract识别文本,可根据需求指定语言(比如lang='eng+urd') recognized_text = pytesseract.image_to_string(current_roi, lang='eng').strip() results[roi_name] = recognized_text print(f"{roi_name}: {recognized_text}") elif roi_type == 'box': # 处理复选框:通过灰度均值判断是否勾选(阈值可根据实际图像调整) avg_brightness = cv2.mean(current_roi)[0] is_checked = avg_brightness < 150 # 灰度值越低,区域越暗,大概率是勾选状态 results[roi_name] = is_checked print(f"{roi_name} 勾选状态: {is_checked}")
关键说明
- 坐标对应:OpenCV图像的索引顺序是
[y_start:y_end, x_start:x_end],和你给出的name区域裁剪格式完全匹配,直接解包坐标即可使用。 - 灰度转换:Tesseract对单通道灰度图的识别效果优于彩色图,所以先转灰度是常规操作。
- 复选框判断:示例用像素均值做简单判断,若你的复选框样式复杂,可改用轮廓检测等方法优化。
内容的提问来源于stack exchange,提问作者Jawad Mansoor
相关产品推荐
相关产品推荐

