如何在嵌套列表推导式中使用早期列表变量(OpenCV&Tesseract)
问题解决:在列表推导式中保留字符信息实现OpenCV文本绘制
首先贴出原始代码:
import cv2 import pytesseract pytesseract.pytesseract.tesseract_cmd="D:\\Tesseract\\tesseract.exe" i = cv2.imread('1.png') himg,wimg,_ = i.shape [cv2.putText(i, b[0], (x, himg - y + 25), cv2.FONT_HERSHEY_SIMPLEX, 1, (50, 50, 255), 2) for x,y,w,h in [[int(x) for x in n ]for n in [[a[1],a[2],a[3],a[4]] for a in [b.split(' ') for b in pytesseract.image_to_boxes(i).splitlines()]]]] cv2.imshow('',i) cv2.waitKey(0)
问题原因
报错是因为你在最外层的cv2.putText里引用的b变量,在嵌套列表推导式的作用域中已经不可访问——内层推导式只提取了坐标信息并转换为整数,丢失了原始行b中的字符内容(b[0])。而cv2.rectangle能运行,是因为它只需要坐标,不需要用到字符信息。
解决方案(保持列表推导式写法)
调整嵌套推导式的结构,在最内层同时保留字符和转换后的坐标,让外层循环能同时获取到字符和坐标参数。修改后的代码如下:
import cv2 import pytesseract pytesseract.pytesseract.tesseract_cmd="D:\\Tesseract\\tesseract.exe" i = cv2.imread('1.png') himg,wimg,_ = i.shape # 调整推导式,同时保留字符和坐标 [cv2.putText(i, char, (x, himg - y + 25), cv2.FONT_HERSHEY_SIMPLEX, 1, (50, 50, 255), 2) for char, x, y, w, h in [(a[0], int(a[1]), int(a[2]), int(a[3]), int(a[4])) for a in [b.split() for b in pytesseract.image_to_boxes(i).splitlines()]]] cv2.imshow('',i) cv2.waitKey(0)
说明
- 最内层推导式
[b.split() for b in pytesseract.image_to_boxes(i).splitlines()]:将每行识别结果拆分为包含字符和坐标的列表a(a[0]是字符,a[1]-a[4]是坐标字符串)。 - 中间层推导式
[(a[0], int(a[1]), int(a[2]), int(a[3]), int(a[4])) ...]:将坐标字符串转为整数,同时把字符和坐标打包成元组,这样外层循环可以直接解构出char, x, y, w, h。 - 最外层循环直接使用解构后的变量调用
cv2.putText,避免了作用域问题,同时实现了在每个字符位置绘制对应字符的需求。
内容的提问来源于stack exchange,提问作者The SP Show
相关产品推荐
相关产品推荐

