'tuple'没有属性。 OpenCV Python

时间:2015-02-18 13:42:17

标签: python opencv computer-vision tuples traceback

我试图在图像上传递一个窗口,这样我就可以得到窗口内的平均b,g,r像素值(不确定如何做到这一点)。

目前我正试图通过一个窗口来传递我的图像,但在第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)

提前致谢:)

4 个答案:

答案 0 :(得分:1)

这一行:

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

为名称pt1分配新的元组对象(请参阅the docsthe tutorial)。默认情况下,元组不具有xy属性。您需要通过索引访问元组中的第一个和第二个项目:

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)

话虽如此,由于ij仍然在范围内,最简单要做的事情就是:

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

即使他们不在范围内,您也可以解包 pt1(无论是tuple还是namedtuple),并使用单独的xy

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

答案 1 :(得分:0)

因为pt1是一个元组,并且没有xy属性。你可能想要:

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

答案 2 :(得分:0)

您无法访问这样的普通元组,您需要更改

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

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

但是,Python确实有namedtuple可以通过属性访问;甚至在文档中还有一个Point namedtuple示例。

这是一个源自我链接到的文档的小例子:

#!/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)

答案 3 :(得分:0)

您正尝试访问x中的pt1属性,但pt1是一个元组,元组没有x属性。你可以

第二种解决方案可能如下所示:

from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p1 = Point(i,j)
p2 = (pt1.x+5,pt1.y+5)