for x, y in [np.int32(tr[-1]) for tr in self.tracks]:
cv2.circle(mask, (x, y), 5, 0, -1)
p = cv2.goodFeaturesToTrack(frame_gray, mask=mask, **feature_params)
if p is not None:
for x, y in np.float32(p).reshape(-1, 2):
self.tracks.append([(x, y)])
我对这些for循环感到困惑,我对python 3很新。从我收集的内容来看,它首先逐步执行每个tr的x,y值(从结尾开始?是-1表示的是什么?)
无论如何,对于其实例中的每个tr:self.tracks。底部for循环在numpy float数组中做同样的事情:p?他们为什么要使用'重塑'?那是做什么的?
如果有人不介意或许只是为我踩过它 我非常感谢。
答案 0 :(得分:0)
self.tracks似乎是一个(n,2)list
。外部循环获取这些值中的每一个,将它们两个转换为整数x
和y
,然后执行带有对象cv2.circle
的函数/方法mask
以及其他几个值参数。 container[-1]
表示您希望最后一个索引的值为container
。
将函数/方法goodFeaturesToTrack
的值分配给p
(似乎是数组或None
)。 **
表示feature_params
是参数字典(如果函数定义为myfunc(a,b=2,c=3,d=5)
,您可以更改其中的某些值
函数调用通过调用myfunc("value of a",**mydict)
来调用mydict是一个包含零个或多个可选变量a,b和c的字典(例如mydict={'b':8,
d :0}
会将b和d从其默认值更改为分别为8和0。
然后从p的重塑中提取新的(浮点值)x
和y
,并作为一对附加回列表self.tracks
。
重塑中的-1表示您不关心给定轴的长度,只要另一个轴具有正确的形状。例如。一个包含10个值的数组将被重新变换为(5,2)a(4,4)将被重新变换为(8,2)等。这可以通过搜索numpy.reshape
找到:
newshape:int或int of int
新形状应与原始形状兼容。如果是>整数,则结果将是该长度的1-D数组。一个形状>尺寸可以是-1。在这种情况下,该值是从>阵列和剩余尺寸的长度推断的。