import io
import os
os.environ["GOOGLE_APPLICATION_CREDENTIALS"]="future-shuttle-323208-1e6aebdb018d.json"
# Imports the Google Cloud client library
from google.cloud import vision
from PIL import Image
import cv2
write1=[]
write2=[]
for i in range(0,235):
# Instantiates a client
client = vision.ImageAnnotatorClient()
# The name of the image file to annotate
file_name = os.path.abspath("v2i/%d.png"%(i))
# Loads the image into memory
with io.open(file_name, 'rb') as image_file:
content = image_file.read()
image = vision.Image(content=content)
response = client.text_detection(image=image)
texts = response.text_annotations
i_str=str(i)
filename='i2tvision/'+i_str+'.txt'
for text in texts:
write1.append('\n"{}"'.format(text.description))
vertices = (['({},{})'.format(vertex.x, vertex.y)
for vertex in text.bounding_poly.vertices])
write2.append('bounds: {}'.format(','.join(vertices)))
#指定文字檔路徑
f = open(filename, 'w')
f.write(write1[i])
f.write(write2[i])
f.close()
if response.error.message:
raise Exception(
'{}\nFor more info on error messages, check: '
'https://cloud.google.com/apis/design/errors'.format(
response.error.message))
#指定文字檔路徑
#i_str=str(i)
#filename='i2tvision/'+i_str+'.txt'
#f = open(filename, 'w')
#f.write(write1[i])
#f.write(write2[i])
#f.close()
我的目标是使用google Vision将多张照片转换为多个文本文件,但是在转换过程中(在for循环中)我不断遇到一个bug“runfile('/home/lab/chinese/i2tvision.py', wdir= '/home/lab/中文') 回溯(最近一次调用):
文件“/home/lab/chinese/i2tvision.py”,第 50 行,位于 f.write(write1[i])
IndexError: 列表索引超出范围” 有没有什么方向可以解决这个问题?谢谢
问题出在尝试访问
write1
和
write2
列表的方式。在每次迭代中,都将新的字符串附加到这些列表中,但随后尝试使用循环索引
i
来访问它们,该索引可能会大于列表的当前大小。
以下是代码中导致错误的原因以及如何修复它的详细说明:
-
列表追加和索引不匹配: 在循环的每次迭代中,都会将检测到的文本和边界框附加到
write1
和write2
列表中。但是,在尝试使用索引i
写入文件时使用了循环索引i
,该索引假定列表中有i
个元素,而实际上元素的数量取决于在当前图像中检测到的文本数量。 -
错误发生的时间: 当循环迭代次数超过图像中检测到的文本数量时,就会发生
IndexError
。例如,如果在第一张图像中检测到 2 个文本片段,但在第二张图像中只检测到 1 个,则在尝试访问write1[1]
和write2[1]
时会发生错误,因为它们在第二张图像之后仅包含一个元素。
解决方案:
要解决此问题,需要在每次循环迭代中迭代检测到的文本,并为每个检测到的文本写入文件,而不是使用循环索引
i
来访问
write1
和
write2
。
以下是经过更正的代码:
import io
import os
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "future-shuttle-323208-1e6aebdb018d.json"
# 导入 Google Cloud 客户端库
from google.cloud import vision
from PIL import Image
import cv2
for i in range(0, 235):
# 实例化一个客户端
client = vision.ImageAnnotatorClient()
# 要注释的图像文件名称
file_name = os.path.abspath("v2i/%d.png" % (i))
# 将图像加载到内存中
with io.open(file_name, 'rb') as image_file:
content = image_file.read()
image = vision.Image(content=content)
response = client.text_detection(image=image)
texts = response.text_annotations
i_str = str(i)
filename = 'i2tvision/' + i_str + '.txt'
# 打开一次文件,为所有检测到的文本写入
with open(filename, 'w') as f:
for text in texts:
f.write('\n"{}"\n'.format(text.description))
vertices = (['({},{})'.format(vertex.x, vertex.y)
for vertex in text.bounding_poly.vertices])
f.write('bounds: {}\n'.format(','.join(vertices)))
if response.error.message:
raise Exception(
'{}\n有关错误消息的更多信息,请查看: '
'https://cloud.google.com/apis/design/errors'.format(
response.error.message))
在此代码中,我们循环遍历每个图像中检测到的文本,并为每个文本片段写入描述和边界框。这确保不会尝试访问超出列表范围的索引,从而避免
IndexError
。