@PrytexY
Нюхаю бебру

Почему вылезает ошибка когда я двигаюсь?

Вот код :
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
maximus = 0

its = []
its2 = []
its3 = []
segment = [(0,0)]
gx = 0

def calc(begin_seg,end_seg):
    lenght_line = end_seg - begin_seg
    center_line = end_seg - lenght_line // 2
    segment.append((center_line,lenght_line))

    return 0

while 1:
    _, frame = cap.read()
    size = (frame.shape[1]//3,frame.shape[0]//3)
   
    frame_small = cv2.resize(frame,size)
    hsv_temp = cv2.cvtColor(frame_small,cv2.COLOR_BGR2HSV)
    bw = cv2.inRange(hsv_temp,(0,0,0),(180,255,84))
    line = bw[bw.shape[0]-20]
    line_zoom = cv2.resize(line,(100,line.shape[0]))
    #print(line)
    segment = []
    f_begin = 0
    for i in range(len(line)):
        '''
        if line[ї] == 255:
            cv2.circle(frame,(i*3,frame.shape[0]-60),3,255)
        '''
        if(line[i]==255) and (f_begin==0):
            f_begin = 1
            begin = i
        elif (line[i]==0) and (f_begin==1):
            f_begin = 0
            end = i
            calc(begin,end)   
    for i in range(np.shape(segment)[0]):
        temp_circle = segment[i] 
        if temp_circle[1] > 1:
           # print( temp_circle )
            its.append(temp_circle[1])
            its2.append(temp_circle[0]*3)


            cv2.circle(frame,(temp_circle[0]*3,frame.shape[0]-60),temp_circle[1],(255,255,255))
            new = max(its)
            gx = its.index(new)
    if len(its) > 1:
        its.remove(max(its))
    else:
        new = 0
        its.append(0)

    new2 = max(its) 
    print(its2[gx],its2[its.index(new2)])

    
    its = []
    its2 = []

    cv2.imshow('CAM0',frame)
    cv2.imshow('B\W',bw)
    cv2.imshow('Zoom',line_zoom.T)
    
    key = cv2.waitKey(20)
    if (key == 27):
        break

cv2.destroyAllWindows()

Вот ошибка:
Exception has occurred: IndexError
list index out of range
  File "C:\myProjects\Python\cv2\12.py", line 61, in <module>
    print(its2[gx],its2[its.index(new2)])


Программа дола выделять кружками тёмные места и выводить позицию x двух самых больших из них.
  • Вопрос задан
  • 86 просмотров
Пригласить эксперта
Ответы на вопрос 1
phaggi
@phaggi Куратор тега Python
лужу, паяю, ЭВМы починяю
Ошибка вылезает потому, что в строке, которая вызывает ошибку, используются два списка its и its2.
Причем берется список its, в нем находится индекс некоторого значения new2, а затем в списке its2 ищется значение с этим индексом. Видимо, такого индекса там просто нет, и система сообщает об этом.
Почему именно в вашем its2 нет такого индекса, а главное - должен ли он там быть? Вот в чем вопрос. У вас там выше по коду идет активная работа с its, в него и добавляются новые значения, и убираются оттуда значения. Соответственно, никакой гарантии, что длина списка its будет равна длине списка its2 или как-то с ним синхронизирована, нет.
Поэтому в какой-то момент оказывается, что список its длиннее списка its2 и максимальное значение списка its имеет индекс, который больше самого большого индекса списка its2.

Что с этим делать? Логику программы я не разбирал подробно, но наверно надо постоянно оба списка синхронизировать как-то, тогда по крайней мере длина у них будет одинаковая и ЭТА ошибка не будет возникать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
17 апр. 2024, в 00:48
35000 руб./за проект
17 апр. 2024, в 00:13
800 руб./за проект
17 апр. 2024, в 00:06
240000 руб./за проект