You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在嵌套列表推导式中使用早期列表变量(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)

说明

  1. 最内层推导式[b.split() for b in pytesseract.image_to_boxes(i).splitlines()]:将每行识别结果拆分为包含字符和坐标的列表a(a[0]是字符,a[1]-a[4]是坐标字符串)。
  2. 中间层推导式[(a[0], int(a[1]), int(a[2]), int(a[3]), int(a[4])) ...]:将坐标字符串转为整数,同时把字符和坐标打包成元组,这样外层循环可以直接解构出char, x, y, w, h。
  3. 最外层循环直接使用解构后的变量调用cv2.putText,避免了作用域问题,同时实现了在每个字符位置绘制对应字符的需求。

内容的提问来源于stack exchange,提问作者The SP Show

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 02:31:16