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
相关产品推荐
相关产品推荐

