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

Python+pytesseract文本检测:移除空字符串后列表索引错误解决

解决pytesseract结果中空字符串移除后无法按字典访问的问题

你的问题出在对image_data字典的处理逻辑上:list(filter(lambda x: x != '', image_data))会迭代字典的键(比如"text"、"left"这类字段名),过滤后得到的是原字典的键列表,自然没法用new_list["text"]这种字典方式访问。

要保留字典结构并移除空字符串对应的检测结果,需要同步过滤所有字段的列表,保证每个字段的元素索引对应同一个有效文本。具体解决方案如下:

修正后的代码

import cv2
from pytesseract import pytesseract, Output

pytesseract.tesseract_cmd = r"C:\\Program Files\\Tesseract-OCR\\tesseract.exe"

# 摄像头捕获部分逻辑不变
camera = cv2.VideoCapture(0)
while True:
    _, image = camera.read()
    cv2.imshow("Text detection", image)
    if cv2.waitKey(1) & 0xFF == ord("s"):
        cv2.imwrite("Capture.jpg", image)
        break
camera.release()
cv2.destroyAllWindows()

img = cv2.imread("Capture.jpg")
image_data = pytesseract.image_to_data(img, output_type=Output.DICT)

# 第一步:收集所有非空文本对应的索引
valid_indices = [i for i, word in enumerate(image_data["text"]) if word.strip() != ""]

# 第二步:构建过滤后的字典,同步保留所有字段的有效元素
filtered_data = {}
for key in image_data.keys():
    filtered_data[key] = [image_data[key][i] for i in valid_indices]

# 绘制识别框(用有效索引遍历,避免处理空文本)
for i in valid_indices:
    word = image_data["text"][i]
    x, y, w, h = image_data["left"][i], image_data["top"][i], image_data["width"][i], image_data["height"][i]
    cv2.rectangle(img, (x,y), (x+w, y+h), (0, 255, 0), 3)
    cv2.putText(img, word, (x,y-16), cv2.FONT_HERSHEY_COMPLEX, 1, (0, 0, 255), 2)

# 现在可以正常按字典方式访问过滤后的数据
if filtered_data["text"]:
    print(filtered_data["text"])

cv2.imshow("Window", img)
cv2.waitKey(0)

关键说明

  • 同步索引过滤:先收集非空文本的索引,保证left、top等字段和text字段的元素一一对应,不会出现错位。
  • 保留字典结构:遍历原字典的所有字段,对每个字段的列表只保留有效索引的元素,最终得到的filtered_data仍是字典,可正常用键访问。
  • 原代码的filter逻辑错误在于处理了字典的键而非键对应的列表元素,这是导致变量类型变为列表的核心原因。

内容的提问来源于stack exchange,提问作者kabloeyyy23

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 07:15:27