Объект «NoneType» не имеет атрибута «форма», хотя я могу его распечатать

Я пытаюсь найти вертикальные линии в видео. Python 2.7 и OpenCV 3. Я использую вычитание фона, а затем применяю фильтр Canny Edge Detection. Мне удалось применить метод HoughLinesP к одному изображению, но мне нужно расширить его до видео.

Я получаю эту ошибку при запуске базового набора кода (который, как мне кажется, соответствует строкам (30-33) ниже:

Traceback (most recent call last):
File "test3.py", line 33, in <module>
print(hlines.shape)
AttributeError: 'NoneType' object has no attribute 'shape'  

Что странно, так это то, что если я настрою код так, чтобы вычитание фона не применялось (закомментируйте строку 26 и измените строку 28 так, чтобы она ссылалась на «frame» вместо «img_sub»), все работает просто отлично. Что мне не хватает?
Я могу нормально выводить видеопоток с вычитанием фона, и он работает так, как ожидалось.
Я могу нормально выводить/печатать(hlines).
Пример терминала вывода 'hlines'

[[470 109 470 109]]

[[337 259 337 259]]

[[330 267 330 267]]

[[338 324 338 324]]

[[338 289 338 289]]]

Но как только я пытаюсь использовать атрибут hlines.shape, все идет не так.

import cv2
import numpy as np
import imutils 

np.set_printoptions(threshold=np.inf) #to print entire array, no truncation

LOWER_BOUND = 55   #cv2.threshold()
UPPER_BOUND = 255  #cv2.threshold()

CANNY_LOWER_BOUND = 10  #cv2.Canny()
CANNY_UPPER_BOUND = 250 #cv2.Canny()

MIN_LINE_LENGTH = 2  #HoughLinesP()
MAX_LINE_GAP = 100     #HoughLinesP() 
HOUGH_THETA = np.pi/180 #HoughLinesP() angle resolution of the accumulator, radians
HOUGH_THRESHOLD = 25 #HoughLinesP() 
HOUGH_RHO = 1         #HoughLinesP() rho, Distance resolution of the accumulator, pixels

#background subtraction parameter
bkgnd = cv2.bgsegm.createBackgroundSubtractorMOG()
camera =cv2.VideoCapture('/home/odroid/Desktop/python_scripts/test/test_images/Edited_Foam_Dispense_Short.mp4')

while(True):
(grabbed, frame) = camera.read()

img_sub = bkgnd.apply(frame)#, learningRate = 0.001)

canny_threshold = cv2.Canny(img_sub, CANNY_LOWER_BOUND, CANNY_UPPER_BOUND)  

hlines = cv2.HoughLinesP(canny_threshold, HOUGH_RHO, HOUGH_THETA, MIN_LINE_LENGTH, MAX_LINE_GAP)

print(hlines)
print(hlines.shape)

#a,b,c = hlines.shape

#for k in range(a):
    #print(hlines.shape)
    #break
    #cv2.line(frame, (hlines[k][0][0], hlines[k][0][1]), (hlines[k][0][2], hlines[k][0][3]), (0,255,0), 3, cv2.LINE_AA)
#   print("getting hlines")
#   break

cv2.imshow('canny_threshold', canny_threshold)
cv2.imshow("frame", frame)

if cv2.waitKey(1) & 0xFF == ord('q'):
    break

camera.release()
cv2.destroyAllWindows()  

Мы ценим любые предложения.

РЕДАКТИРОВАТЬ:
@ivan_pozdeev указал мне на этот вопрос.

Похоже, что это применимо. Но, пытаясь следовать их решению, я получаю следующую ошибку:

Трассировка (последний последний вызов): файл «test3.py», строка 37, in for l in hlines: TypeError: объект «NoneType» не повторяется

Это измененный фрагмент кода:

hlines = cv2.HoughLinesP(canny_threshold, HOUGH_RHO, HOUGH_THETA, MIN_LINE_LENGTH, MAX_LINE_GAP)

for l in hlines:
    leftx, boty, rightx, topy = l[0]
    line = Line((leftx, boty), (rightx, topy)) 
    line.draw(frame, (0, 255, 0), 2)

Теперь это имело бы смысл для меня, если бы у меня не было данных... но у меня есть данные, возвращаемые в hlines. Я могу распечатать его с помощью оператора print(hlines). Однако он имеет другой формат, чем OpenCV 2.4... Но теперь мне интересно, почему это сработало в другом вопросе...

EDIT2:
А-ха! Продвигается. Вот вывод скрипта (print(hlines)) если я зациклю его только дважды... т.е. когда run_once = 0 while(run_once‹=1)... run_once = 1+ run_once в конце

None
[[[690 419 693 419]]

[[672 419 679 419]]

[[696 417 701 417]]

[[713 419 714 419]]

[[504 418 504 418]]

[[688 419 688 419]]

[[672 417 679 417]]

[[510 419 511 419]]

[[693 418 693 417]]

[[688 417 688 417]]

[[692 417 692 417]]

[[696 419 699 419]]

[[713 417 714 417]]

[[686 419 686 419]]

[[622 417 622 417]]

[[690 417 690 417]]

[[506 417 506 417]]

[[622 419 623 419]]

[[505 419 505 419]]

[[686 417 687 417]]

[[506 419 506 419]]

[[700 419 701 418]]

[[509 418 509 418]]

[[623 417 623 417]]

[[510 417 511 417]]

[[712 418 712 418]]

[[685 418 685 418]]

[[689 417 689 417]]

[[689 419 689 419]]

[[671 418 671 418]]

[[691 417 691 417]]]

Итак, похоже, что первая строка hlines «Нет». Это объясняет ошибку, я думаю. Однако теперь мне нужно разобраться, как добавить в hlines "пустую строку"....


person slow_one    schedule 27.04.2017    source источник
comment
ваш while True оператор не имеет отступа.   -  person Mike - SMT    schedule 27.04.2017
comment
hlines не является массивом. Свойство shape можно использовать только с массивами.   -  person Jeru Luke    schedule 27.04.2017
comment
почему выполнение фонового вычитания изменит это с массива на... не массив? это не имеет смысла в моей голове.   -  person slow_one    schedule 27.04.2017
comment
Возможный дубликат странных результатов Opencv python HoughLinesP   -  person ivan_pozdeev    schedule 27.04.2017
comment
Ошибка означает, что lines равно None.   -  person ivan_pozdeev    schedule 27.04.2017
comment
@ivan_pozdeev: я просмотрел связанный вопрос. Спасибо. Похоже, что это применимо, но я получаю странную ошибку о том, что я не могу перебрать значение... Я обновлю выше.   -  person slow_one    schedule 28.04.2017


Ответы (1)


Перейдя по ссылке, опубликованной выше @ivan_pozdeev, и проверив возвращаемый тип None, проблема была устранена.
Функция HoughLinesP возвращала пустой массив в первом кадре (возвращая «None»). Это вызвало ошибки в дальнейшем. Добавление проверки для этого устранило проблему.

if hlines is None: #in case HoughLinesP fails to return a set of lines
        #make sure that this is the right shape [[ ]] and ***not*** []
        hlines = [[0,0,0,0]]
    else:
        for l in hlines:
            leftx, boty, rightx, topy = l[0]
            cv2.line(frame, (leftx, boty), (rightx, topy), (0, 255, 0), 2)
person slow_one    schedule 28.04.2017
comment
Осталось выяснить, почему это None. Эта возможность не упоминается в документации. Я проверил его источник и не Не нахожу каких-либо сразу очевидных случаев. - person ivan_pozdeev; 28.04.2017
comment
перепроверил ссылку - все нормально. Возможно, github.com заблокирован в вашей стране или что-то в этом роде. - person ivan_pozdeev; 01.05.2017
comment
может быть на работе ... я поиграю с этим. какой источник вы проверяли? HoughLinesP? - person slow_one; 01.05.2017