首页 > 编程问答 >IndexError:列表索引超出范围使用谷歌视觉

IndexError:列表索引超出范围使用谷歌视觉

时间:2024-08-02 17:19:55浏览次数:13  
标签:python list google-cloud-vision

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 来访问它们,该索引可能会大于列表的当前大小。

以下是代码中导致错误的原因以及如何修复它的详细说明:

  1. 列表追加和索引不匹配: 在循环的每次迭代中,都会将检测到的文本和边界框附加到 write1 write2 列表中。但是,在尝试使用索引 i 写入文件时使用了循环索引 i ,该索引假定列表中有 i 个元素,而实际上元素的数量取决于在当前图像中检测到的文本数量。

  2. 错误发生的时间: 当循环迭代次数超过图像中检测到的文本数量时,就会发生 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

标签:python,list,google-cloud-vision
From: 68841085

相关文章

  • 找出 python 脚本完成执行所需的时间
    我在python脚本中有以下代码:deffun():#Codeherefun()我想执行此脚本,并找出执行时间(以分钟为单位)。如何查明该脚本的执行时间?一个例子将非常感激。你可以使用time模块来测量Python脚本的执行时间。方法如下:importtimedeffun():#代码写在......
  • Python基础教程:全方位掌握print函数
    文章目录1.基本打印2.打印多个参数3.格式化输出使用`%`格式化使用`.format()`方法使用f-string(Python3.6+)4.自定义分隔符5.抑制换行6.打印到文件7.打印对象的字符串表示8.打印时的错误处理9.立即刷新输出缓冲区10.结语1.基本打印打印文本或变......
  • 如何使用Python代码获取Power Bi Visual Level数据
    我有一个Powerbi报告,托管在本地报告服务器上。现在我想使用python代码检索视觉级别数据。例如,我有一个卡片视觉效果,显示为“100”,这个“100”是根据度量计算的,对于某些视觉效果,该值直接来自数据集中的列值。现在我想检索测量值为“100”,而且我还需要直接来自python代......
  • 如何在python中通过requests和opencv加载uint16 png文件
    我正在尝试从URL自动加载图像,然后将其加载到numpy矩阵。为此,我需要使用requests和opencv库。对于像uint8这样编码的标准图像,它以正确的方式工作,并且由于值溢出而损坏了uint16图像。这是我现在正在使用的一个简单的最小代码:importrequestsimportcv2importnumpy......
  • Selenium + Python 自动化测试01(准备篇)
        本篇文章主要讲述Selenium+Python自动化测试-准备篇。主要时相关软件介绍,下载,安卓等。一、Selenium简介    1、Selenium是什么?        官网描述:        Primarily,itisforautomatingwebapplicationsfortestingpurposes,......
  • antd react form.list动态增减表单项Switch受控
    importReact,{useState}from'react';import{Form,Input,Switch,Button}from'antd';constDemo=()=>{const[switches,setSwitches]=useState({});constonFinish=(values)=>{console.log('Received......
  • 如何使用 Python 在 2D 曲面上切割 3D 体积?
    考虑3D中的闭合表面网格(mesh1),由两个合并块组成,如图所示。两个合并块,具有不同颜色的细分补丁。网格以STL文件形式给出,并被细分分成不同的补丁。每个面片都在STL文件中保存为单独的实体。此外,我有一个由STL文件给出的弯曲2D表面网格(......
  • Python教程(十):面向对象编程(OOP)
    目录专栏列表前言一、面向对象编程概述1.1类和对象1.2继承1.3多态1.4封装二、Python中的类和对象2.1定义类2.2`__init__`函数解释2.3创建对象三、继承3.1基本继承3.2创建子类对象四、多态五、封装六.访问限制七、综合实例结语专栏列表Python教程(一):环......
  • Qt C++ 调用 Python 之 PyObject* 数据类型转换
    整数:PyLong_FromLong和PyLong_AsLong类型检查函数:PyLong_Check()intcppInt=42;//C++整数转换为Python整数对象PyObject*pyInt=PyLong_FromLong(cppInt);//Python整数对象转换为C++整数longcppIntFromPy=PyLong_AsLong(pyInt);Py_DECREF(pyInt)......
  • Python 警告:重试(重试(总计=4,连接=无,读取=无,重定向=无,状态=无))
    我正在尝试pipinstall--upgradepip并保持收到此错误:WARNING:Retrying(Retry(total=4,connect=None,read=None,redirect=None,status=None))afterconnectionbrokenby'ProxyError('Cannotconnecttoproxy.',NewConnectionError('<......