如何解决Python:如何解决python opencv的列表索引超出范围错误?
我是Python的初学者。 如何解决这个错误? 我试图找出错误,但仍然无法解决。 如何增加列表索引范围? 我想知道是否存在增加列表索引范围的解决方案? 我一直使错误列表索引超出范围。我不确定自己在做什么错。
这是我的代码:
import cv2 # for capturing videos
import math # for mathematical operations
import matplotlib.pyplot as plt # for plotting the images
%matplotlib inline
import pandas as pd
from keras.preprocessing import image # for preprocessing the images
import numpy as np # for mathematical operations
from keras.utils import np_utils
from skimage.transform import resize # for resizing images
from sklearn.model_selection import train_test_split
from glob import glob
from tqdm import tqdm
# open the .txt file which have names of training videos
f = open("trainlist01.txt","r")
temp = f.read()
videos = temp.split('\n')
# creating a dataframe having video names
train = pd.DataFrame()
train['video_name'] = videos
train = train[:-1]
train.head()
# open the .txt file which have names of test videos
f = open("testlist01.txt","r")
temp = f.read()
videos = temp.split('\n')
# creating a dataframe having video names
test = pd.DataFrame()`enter code here`
test['video_name'] = videos
test = test[:-1]
test.head()
# creating tags for training videos
train_video_tag = []
for i in range(train.shape[0]):
train_video_tag.append(train['video_name'][i].split('/')[0])
train['tag'] = train_video_tag
# creating tags for test videos
test_video_tag = []
for i in range(test.shape[0]):
test_video_tag.append(test['video_name'][i].split('/')[0])
test['tag'] = test_video_tag
# storing the frames from training videos
for i in tqdm(range(train.shape[0])):
count = 0
videoFile = train['video_name'][i]
cap = cv2.VideoCapture('Datasets/'+videoFile.split(' ')[0].split('/')[1]) # capturing the video from the given path
frameRate = cap.get(5) #frame rate
x=1
while(cap.isOpened()):
frameId = cap.get(1) >>current frame number
ret,frame = cap.read()
if (ret != True):
break
if (frameId % math.floor(frameRate) == 0):
# storing the frames in a new folder named train_1
filename ='train_1/' + videoFile.split('/')[1].split(' ')[0] +"_frame%d.jpg" % count;count+=1
cv2.imwrite(filename,frame)
cap.release()
这是错误:
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-25-e7d681bfa4b4> in <module>
3 count = 0
4 videoFile = train['video_name'][i]
----> 5 cap = cv2.VideoCapture('Datasets/'+videoFile.split(' ')[0].split('/')[1]) # capturing the video from the given path
6 frameRate = cap.get(5) #frame rate
7 x=1
IndexError: list index out of range
这里有train list和test list的内容
解决方法
# Lets take a look at a simple scenario that will cause index out of range error
color = ['red','green','blue','gray']
# We know that the length of this array is 4 (but when indexing,it will go to 3,as array index starts from 0)
for i,colorName in enumerate(color):
print('Color at index: ',i,'is: ',colorName)
#Color at index: 0 is: red
#Color at index: 1 is: green
#Color at index: 2 is: blue
#Color at index: 3 is: gray
# Now lets try to access a non-existing color at index 9
print ("Color at index 9 is: ",color[8])
最后一行会给我们错误
File "<ipython-input-3-a6c2d20bb636>",line 9,in <module>
print ("Color at index 9 is: ",color[8])
IndexError: list index out of range
为什么?因为我们正在尝试访问不存在的索引处的内容。
在这种情况下,我建议您检查以下值:
# First you need to see what is the value of videFile,is it valid to be split? Is it empty,etc.
print (videoFile)
# This will tell you what the split() is giving you back
print (videoFile.split(' '))
# This will tell you,if [0] is a valid data or not
print (videoFile.split(' ')[0])
# This will tell you,if the split on '/' was successfull,as it should return some expected values,if it is empty,they you must figure out,is it expected or no
print (videoFile.split(' ')[0].split('/'))
# This is what you finally want,but before accessing the item at index 1,you need to make sure the date before it is present and is not empty. Also check are you accessing the item at right index,maybe it is [0] instead of [1]
print (videoFile.split(' ')[0].split('/')[1])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。