繁体   English   中英

Python:如何解决python opencv的列表索引超出范围错误?

[英]Python: How to solve list index out of range error for 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

这里是列车列表测试列表内容

    # 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])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM