Как я могу избавиться от ошибки нетипа в моем коде OpenCV

#python #opencv #nonetype #aruco

Вопрос:

Я пытаюсь работать с маркерами ArUco, используя OpenCV в python.

 vidcap = cv2.VideoCapture(0)
vidcap.set(cv2.CAP_PROP_BUFFERSIZE, 1)
c = np.array(np.zeros([9,4,2]))
while vidcap.isOpened():
exists,image = vidcap.read()
if exists:
    image = cv2.resize(image, (1200, 800))
    arucodict = aruco.Dictionary_get(aruco.DICT_6X6_50)
    arucoparams = aruco.DetectorParameters_create()
    (corners, id, rejected) = aruco.detectMarkers(image, arucodict, parameters=arucoparams)
    for (a,b) in zip(corners,id):
        if b in range(0,10):
            c[b-1]=a
 

Оператор for выдает ошибку
для (a,b) в zip(углы,идентификатор):
Ошибка типа: объект «Нетип» не может быть повторен

Что я делаю не так?

Комментарии:

1. всегда помещайте полное сообщение об ошибке (начинающееся со слова «Обратная связь») в вопрос (не комментарий) в виде текста (не скриншот, не ссылка на внешний портал). Есть и другая полезная информация.

2. если ошибка показывает вам , какая строка создает проблему, то сначала вы можете использовать print() ее, print(type()) чтобы проверить, что у вас есть в переменных. Похоже, у вас есть None corners или id , и только вы можете проверить это с помощью print() . И когда вы узнаете, какая переменная имеет None значение, вам нужно проверить код, который дает это None detectMarkers — и вам нужно будет выяснить, почему это дает None . У нас нет ваших данных, мы не можем запустить ваш код, поэтому мы не можем проверить, почему он выдает None .

Ответ №1:

Если vidcap предоставляет вам те же входные данные, что и я (поскольку я не знаю, что вы ищете на изображении), вы, скорее всего, пытаетесь работать с пустым списком; в частности, с углами. Я добавил чек на это:

 vidcap.set(cv2.CAP_PROP_BUFFERSIZE, 1)
c = np.array(np.zeros([9,4,2]))
while vidcap.isOpened():
    exists,image = vidcap.read()
    if exists:
        image = cv2.resize(image, (1200, 800))
        arucodict = aruco.Dictionary_get(aruco.DICT_6X6_50)
        arucoparams = aruco.DetectorParameters_create()
        (corners, id, rejected) = aruco.detectMarkers(image, arucodict, parameters=arucoparams)
        if corners:
            for (a,b) in zip(corners,id):
                if b in range(0,10):
                    c[b-1]=a