【问题标题】:Python array management C++ equivalentPython 数组管理 C++ 等价物
【发布时间】:2012-02-28 23:28:42
【问题描述】:

我知道 SO 不是租用编码器,但我有一个非常简单的 python 示例,我需要帮助翻译成 C++

grey_image_as_array = numpy.asarray( cv.GetMat( grey_image ) )

non_black_coords_array = numpy.where( grey_image_as_array > 3 )

# Convert from numpy.where()'s two separate lists to one list of (x, y) tuples:
non_black_coords_array = zip( non_black_coords_array[1], non_black_coords_array[0] )

我猜第一个相当简单 - 创建一个线性可索引数组,其中包含从 cv.GetMat 中返回的字节,对吧?

什么相当于 pyton 的 where,尤其是这个 zip 函数?

【问题讨论】:

  • 对于 zip,看看这个问题(你应该可以使用 boost::zip_iterator):stackoverflow.com/questions/8511035/…
  • 您不需要在 C++ 等效项中使用 zip(),因为您会以 non_black_coords_array 立即具有所需结构的方式编写代码。在 Python 中需要它,因为您无法控制 numpy.where() 的输出格式。

标签: c++ python opencv numpy port


【解决方案1】:

我不了解 OpenCV,所以我不能告诉你 cv.GetMat() 做了什么。显然,它返回的东西可以用作或转换为二维数组。您使用的 OpenCV 的 C 或 C++ 接口可能具有类似名称的函数。

以下行创建了grey_image_as_array 中大于3 的条目的索引对数组。 non_black_coords_array 中的每个条目都是基于零的 x-y 坐标到 grey_image_as_array。给定这样一个坐标对xy,您可以使用grey_image_as_array[y][x]访问二维C++数组grey_image_as_array中的对应条目。

Python 代码必须避免对图像进行显式循环才能获得良好的性能,因此它需要使用 NumPy 提供的矢量化函数。表达式grey_image_as_array > 3 是一个向量化比较,并产生一个与grey_image_as_array 形状相同的布尔数组。接下来numpy.where()提取这个布尔数组中True条目的索引,但是结果不是上面描述的格式,所以我们需要zip()对其进行重构。

在 C++ 中,没有必要避免显式循环,而 numpy.where() 的等效项将毫无意义——您只需编写循环并以您选择的格式存储结果。

【讨论】:

  • Sven,就我而言,最终目的地是 C#,因为我不是 C++ 开发人员,所以我什至不知道如何用 C++ 编写您所解释的内容。我知道您已经扩展了您的答案,但您能否也请编写一个您提到的 c++ 循环来执行此 >3 过滤?
  • @MaximV.Pavlov:这看起来与 C# 非常相似,循环本身可能相同。困难的部分是目标数组使用什么数据类型,这取决于对结果的进一步处理。没有更多上下文,我无法提供进一步的建议。
猜你喜欢
  • 1970-01-01
  • 2011-10-29
  • 2015-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-03
  • 2010-10-05
  • 1970-01-01
相关资源
最近更新 更多