2017-01-28 2 views
0

Я работаю над созданием программы отслеживания видения с использованием конвейера. В моем трубопроводе у меня есть следующий код:Переменные объекта без сброса

@staticmethod 
def __approx_contours(input_contours): 
    output = [] 
    kp = None 
    for contour in input_contours: 
     error = 0.1*cv2.arcLength(contour, True) 
     approx = cv2.approxPolyDP(contour, error, True) 
     print(approx) 
     kp = Keeper(approx) 
     print(kp) 
    if kp == None: 
     return output 
    for x,y in zip(kp.getX(),kp.getY()): 
     output.append((x,y)) 
    kp.empty() 
    return output 

и вот KEEPER класс

class Keeper: 

    _x = [] 
    _y = [] 

    # constructor, requires a 3-D array 
    def __init__(self, third_dim): 
     if third_dim.ndim == 3: 
      for row in third_dim: 
       for col in row: 
        self._x.append(col[0]) 
        self._y.append(col[1]) 
     else: 
      raise NotThirdDimension("Entered array was not three dimensional") 
     print(self._x) 
     print(self._y) 

    # return object "X" array 
    def getX(self): 
     return self._x 

    # return object "Y" array 
    def getY(self): 
     return self._y 

    def empty(self): 
     self._x = [] 
     self._y = [] 

Игнорируйте заявления печати в __init__, они предназначены только для отладки.

Пример выходных данных в текущем состоянии:

[[[183 169]] 

[[187 323]]] 
Keeper 
[183, 187] 
[169, 323] 
<keeper.Keeper object at 0x05199630> 

[[[ 62 117]] 

[[ 93 366]] 

[[187 256]]] 
Keeper 
[183, 187, 62, 93, 187] 
[169, 323, 117, 366, 256] 
<keeper.Keeper object at 0x06F10B70> 

Представляется, что значения в моем объекте хранитель не сбрасывается, несмотря вызова kp.empty(). Я также отметил, что объект Keeper меняет место в памяти, возможно, это часть проблемы, но я не уверен, где я ошибаюсь. Полный код доступен here

+0

Вы не должны писать геттеры и сеттеры в Python. Кроме того, вы создали атрибуты класса '_x' и' _y' * *, которые, скорее всего, не предназначены для вас. Кроме того, ваш метод '__approx_contours' должен, вероятно, просто быть функцией уровня модуля, а не статическим методом ... почему' __'-man-ключ? Является ли это прецедентом для манипулирования именами? Если нет, то не делайте этого. В общем, 'Python! = Java' –

+0

Как именно вы вызываете свой статический метод? Вы только опорожняете его в конце. Вероятно, проблема возникает из-за того, что вместо переменных экземпляра * вы делаете переменную класса '_x' и' _y' * *. Затем, когда вы делаете 'self._x = []; self._y = [] 'в' empty' вы * создаете новые переменные экземпляра, которые теневые переменные класса *. Но вы уже мутировали переменные класса, и изменения все равно будут видны, даже если вы используете 'empty'. –

+0

Кроме того, объект 'Keeper' не меняется в памяти, вы делаете новый объект на каждой итерации цикла:' kp = Keeper (approx) '. –

ответ

1

Вопрос был как user @ juanpa.arrivillaga, я использовал атрибуты класса вместо атрибутов экземпляра. Чтобы исправить мою проблему, необходимо внести следующие изменения в Keeper:

class Keeper: 

    # constructor, requires a 3-D array 
    def __init__(self, third_dim): 
     self.x = [] 
     self.y = [] 
     if third_dim.ndim == 3: 
      for row in third_dim: 
       for col in row: 
        self.x.append(col[0]) 
        self.y.append(col[1]) 
Смежные вопросы