对含高亮文本的图像生成OCR识别边界框时OpenCV报错如何解决
问题原因分析
- 通道不匹配:执行
img = img[:,:,2]提取V通道后,图像从三通道变为单通道灰度图,而你调用cv2.rectangle时传入的是三通道BGR颜色值(255,0,0),单通道图像无法兼容三通道颜色绘制,直接触发参数不兼容报错。 - 坐标规则不匹配:pytesseract的
image_to_boxes返回的坐标以图像左下角为原点,OpenCV绘图API以图像左上角为原点,就算通道问题解决,直接用返回坐标绘制的框位置也会完全错位。
修复后的完整代码
import cv2 import pytesseract as pyt pyt.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' # 保留原始三通道图像用于绘制边界框 origin_img = cv2.imread('Image Pasted at 2021-10-21 13-31.png') # 单独生成OCR用的处理图像 hsv_img = cv2.cvtColor(origin_img, cv2.COLOR_BGR2HSV) v_channel = hsv_img[:,:,2] hImg, wImg = v_channel.shape boxes = pyt.image_to_boxes(v_channel) for b in boxes.splitlines(): b = b.split(' ') x, y, w, h = int(b[1]), int(b[2]), int(b[3]), int(b[4]) # 转换坐标适配OpenCV左上角原点规则 y = hImg - y h = hImg - h # 在三通道原图上绘制边界框 cv2.rectangle(origin_img, (x, h), (w, y), (255,0,0), 1) # 可选:在框上方标注识别到的字符,方便验证结果 cv2.putText(origin_img, b[0], (x, h-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255,0,0), 1) cv2.imshow('Result', origin_img) cv2.waitKey(0) cv2.destroyAllWindows()
核心修改说明
- 拆分了OCR处理图像和绘制用图像,保留原始三通道图像作为绘制载体,彻底解决通道不兼容问题
- 调整坐标计算逻辑,适配OpenCV的坐标规则,保证边界框位置和识别字符完全对应
- 补充了资源释放逻辑,避免窗口残留占用内存
内容的提问来源于stack exchange,提问作者mgr1134
相关产品推荐
相关产品推荐

