2015-03-06 2 views
1

Я написал алгоритм в Python OpenCV, чтобы найти определенные цели, но иногда эти цели трудно найти, поэтому я сделал этот оператор if-else только для вывода «target not found», когда он не смог найти цель. Я перебор более 1000 изображений и вызов Algo на них, но я получаю эту ошибку:Почему эта функция маскировки OpenCV не повторяется?

'NoneType' object is not iterable 

на 6-й строке коды ниже:

def image_data(img): 
    img3 = masking (img) 
    if img3 is None: 
     print "target not found" 
    else: 
     cent, MOI = find_center(img3) 
     if cent == 0 or MOI == 0: 
     print 'target not found' 
     else: 
     return cent[0],cent[1],MOI 

Я понимаю, это означает, что did't найти изображение, но почему он не просто переходит к следующему изображению и выводит сообщение об ошибке?

+0

@berak Поскольку вы босс на этом, знаете ли вы, что знаете? – Shideh

+0

'find_center (img3)' 'возвращает None', добавьте код для' find_center' –

+0

@PadraicCunningham добавил если медианы == None или MOI не == None: печати 'цели не найдена' для find_center функции и она по-прежнему дает мне такая же ошибка – Shideh

ответ

1

Ваша функция иногда возвращает None, так что вы не можете распаковать переменные из None:

In [1]: def f(i): 
    ...:  if i > 2: 
    ...:   return "foo","bar" 
    ...:  

In [2]: a,b = f(3) 

In [3]: a,b 
Out[3]: ('foo', 'bar') 

In [4]: a,b = f(1) 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-4-54f2476b15d0> in <module>() 
----> 1 a,b = f(1) 

TypeError: 'NoneType' object is not iterable 

Проверьте возвращаемое значение Нет, перед распаковкой:

def image_data(img): 
    img3 = masking (img) 
    if img3 is None: 
     print("target not found") 
    else: 
     val = find_center(img3) 
     if val: 
      cent, MOI = val 
      return cent[0],cent[1],MOI 
     else: 
      print('target not found') 

Или используйте try/except:

def image_data(img): 
    img3 = masking (img) 
    if img3 is None: 
     print("target not found") 
    else: 
     try: 
      cent, MOI = find_center(img3) 
      return cent[0], cent[1], MOI 
     except TypeError: 
      print('target not found') 
1

Потому что вы пытаетесь присвоить None список значений.

>>> a, b = None 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'NoneType' object is not iterable 

Чтобы сделать это правильно попробовать с:

cent, MOI = find_center(img3) or (None, None) 

с этим, если find_center возвращает правильное значение, оно будет назначено процентов и МВД России. Если он вернет None, None будет присвоен как cent, так и MOI.