'tuple' 没有属性。 OpenCV Python
'tuple' has no attribute. OpenCV Python
我正在尝试将 window 传递到图像上,以便我可以获得 window 内的平均 b、g、r 像素值(不太确定如何执行此操作)。
目前我正在尝试让 window 传递我的图像,但在第 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)
提前致谢:)
因为 pt1 是一个元组并且没有 x
或 y
属性。你可能想要:
pt2 = (pt1[0] + 5, pt1[1] + 5)
你不能像那样访问普通元组,你需要改变
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)
这一行:
pt1 = (i, j) # I have added spaces per the style guide
将新的 元组 对象分配给名称 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)
即使它们 不在 范围内,您也可以 unpack pt1
(无论 tuple
或 namedtuple
),并使用单独的 x
和 y
:
x, y = pt1
pt2 = (x + 5, y + 5)
您正在尝试访问 pt1
中的 x
属性,但 pt1
是一个元组,而元组没有 x
属性。你可以
- 写一个自定义点class
- 使用 named tuple
第二种解决方案可能如下所示:
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p1 = Point(i,j)
p2 = (pt1.x+5,pt1.y+5)
我正在尝试将 window 传递到图像上,以便我可以获得 window 内的平均 b、g、r 像素值(不太确定如何执行此操作)。
目前我正在尝试让 window 传递我的图像,但在第 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)
提前致谢:)
因为 pt1 是一个元组并且没有 x
或 y
属性。你可能想要:
pt2 = (pt1[0] + 5, pt1[1] + 5)
你不能像那样访问普通元组,你需要改变
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)
这一行:
pt1 = (i, j) # I have added spaces per the style guide
将新的 元组 对象分配给名称 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)
即使它们 不在 范围内,您也可以 unpack pt1
(无论 tuple
或 namedtuple
),并使用单独的 x
和 y
:
x, y = pt1
pt2 = (x + 5, y + 5)
您正在尝试访问 pt1
中的 x
属性,但 pt1
是一个元组,而元组没有 x
属性。你可以
- 写一个自定义点class
- 使用 named tuple
第二种解决方案可能如下所示:
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p1 = Point(i,j)
p2 = (pt1.x+5,pt1.y+5)