2015-02-18 5 views
0

Я пытаюсь передать окно над изображением, поэтому я могу получить средние значения пикселей b, g, r внутри окна (не совсем уверен, как это сделать).'tuple' не имеет атрибута. OpenCV Python

На данный момент я пытаюсь получить окно, чтобы пройти через мое изображение, но в строке 17, я получаю ошибку:

Traceback (most recent call last): 
    File "C:\Python27\bgr.py", line 17, in <module> 
    pt2=(pt1.x+5,pt1.y+5) 
AttributeError: 'tuple' object has no attribute 'x' 

Любые идеи?

Вот мой код:

# import packages 
import numpy as np 
import argparse 
import cv2 
import dateutil 
from matplotlib import pyplot as plt 

bgr_img = cv2.imread('images/0021.jpg') 
height, width = bgr_img.shape[:2] 

#split b,g,r channels 
#b,g,r = cv2.split(bgr_img) 

for i in range(0,height): 
    for j in range(0,width): 
    pt1=(i,j) 
    pt2=(pt1.x+5,pt1.y+5) 
    point.append([pt1,pt2]) 
    cv2.rectangle(bgr_img,pt1,pt2,(255,0,0)) 

#cv2.imshow('image',bgr_img)   
#cv2.waitKey(0) 

Заранее спасибо :)

ответ

1

Эта линия:

pt1 = (i, j) # I have added spaces per the style guide 

назначает новый кортеж OBJE ct на имя pt1 (см. the docs, the tutorial). Кортежи по умолчанию не имеют атрибута x или y.Вы либо должны получить доступ к первым и вторым элементам в кортеже по индексу:

pt2 = (pt1[0] + 5, pt1[1] + 5) # note 0-based indexing 

или создать collections.namedtuple, который позволяет определить атрибуты:

from collections import namedtuple 

Point = namedtuple("Point", "x y") 

pt1 = Point(i, j) 
pt2 = Point(pt1.x + 5, pt1.y + 5) 

Это, как говорится, поскольку i и j все еще находятся в сфере охвата, проще всего. Дело было бы просто:

pt1 = (i, j) 
pt2 = (i + 5, j + 5) 

и даже если они не были еще в объеме можно распаковатьpt1 (будь tuple или namedtuple), а также использовать отдельный x и y:

x, y = pt1 
pt2 = (x + 5, y + 5) 
0

Поскольку pt1 является кортежем и не имеет x или y атрибутов. Вы, вероятно, хотите:

pt2 = (pt1[0] + 5, pt1[1] + 5) 
0

Вы не можете получить доступ простых кортежей так, вам необходимо изменить

pt2=(pt1.x+5,pt1.y+5) 

в

pt2=(pt1[0] + 5, pt1[0] + 5) 

Однако, Python действительно есть namedtuple, который может быть доступ через атрибуты; в документах есть даже пример namedtutle.

Вот небольшой пример, полученный из Документов я связанных с:

#!/usr/bin/env python 

from collections import namedtuple 

Point = namedtuple('Point', ['x', 'y']) 

p = Point(11, y=22)  # instantiate with positional or keyword arguments 

print p[0] + p[1]  # indexable like the plain tuple (11, 22) 

x, y = p    # unpack like a regular tuple 
print x, y 
print p.x + p.y   # fields also accessible by name 

print repr(p)   # readable __repr__ with a name=value style 
print tuple(p) 

выход

33 
11 22 
33 
Point(x=11, y=22) 
(11, 22) 
0

Вы пытаетесь получить доступ к x атрибут в pt1, но pt1 является кортежем и кортежем не имеют атрибута x. Вы можете либо

  • Написать класс Пользовательские точки
  • Используйте named tuple

Второе решение может выглядеть следующим образом:

from collections import namedtuple 
Point = namedtuple('Point', ['x', 'y']) 
p1 = Point(i,j) 
p2 = (pt1.x+5,pt1.y+5) 
Смежные вопросы