这段代码在做啥?

Posted

技术标签:

【中文标题】这段代码在做啥?【英文标题】:What is this bit of code doing?这段代码在做什么? 【发布时间】:2016-05-31 23:14:46 【问题描述】:
  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 浮点数组中做同样的事情:p?他们为什么要使用“重塑”?这是在做什么?

如果有人不介意,也许只是为我一步步完成 非常感谢。

【问题讨论】:

有些对象在提供的示例中没有描述,所以很难理解这段代码是关于什么的……[-1] 表示列表中最后一个元素的索引。关于numpy 模块及其功能(包括reshape)你可以在这里阅读:docs.scipy.org/doc/numpy-dev/user/quickstart.html 通过使用一个独立的示例解决一个特定的问题而不是一般的“发生了什么”,并在阅读了每个函数应该在 api 中执行的操作之后,或者检查是否有什么已经有人问过类似的问题,我认为您可以避免投反对票。只是为了下次记住。 缩进搞砸了。使用np.int32np.float32 是不寻常的。 【参考方案1】:

self.tracks 似乎是 (n,2) list。外部循环获取这些值中的每一个,将它们二乘二转换为整数xy,然后使用对象mask 和其他几个参数执行函数/方法cv2.circlecontainer[-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 的重塑中提取一个新的(浮点值)xy,并作为一对附加到列表 self.tracks 中。

reshape 中的 -1 表示您不关心给定轴的长度,只要另一个轴具有正确的形状即可。例如。一个包含 10 个值的数组将被重新整形为 (5,2) 一个 (4,4) 将被重新整形为 (8,2) 等等。这可以通过搜索 numpy.reshape 找到:

newshape : 整数或整数元组

新形状应与原始形状兼容。如果 > 整数,则结果将是该长度的一维数组。一个形状>维度可以是-1。在这种情况下,该值是从>数组的长度和剩余维度推断出来的。

【讨论】:

以上是关于这段代码在做啥?的主要内容,如果未能解决你的问题,请参考以下文章

这段代码中的 lambda 函数在做啥? [复制]

请解释这段代码在做啥(someChar - 48)

你能告诉我这段代码在做啥吗?

这段代码在做啥。检查两个字符串的字谜

这行 Ruby 代码在做啥? [复制]

这行 Java 代码在做啥?