2012-02-28 80 views
0

我知道,这样是不是租来的编码器,但我有一个非常简单的Python的例子,我需要帮助翻译到C++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的功能是什么?

+0

对于zip,看看这个问题(你应该能够使用boost :: zip_iterator):http://stackoverflow.com/questions/8511035/sequence-zip-function-for-c11 – ChristopheD 2012-02-28 23:32:57

+2

你不'因为你需要以'non_black_coords_array'具有所需结构的方式编写代码,所以需要在C++中使用'zip()'。它在Python中是必需的,因为你无法控制'numpy.where()'的输出格式。 – 2012-02-28 23:35:42

回答

0

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

以下几行创建了grey_image_as_array中大于3的条目索引对的数组。 non_black_coords_array中的每个条目都是基于零的基于x-y坐标的grey_image_as_array。给定这样一个坐标对x,y,您可以通过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()将是毫无意义的 - 您只需编写循环并以您选择的格式存储结果即可。

+0

Sven,在我的情况下,最终目标将是C#,因为我不是C++开发人员,所以我甚至不知道如何编写C++中的解释。我知道你已经扩展了你的答案,但你是否也可以写一个你提到要做3>过滤的C++循环? – 2012-02-29 00:24:21

+0

@ MaximV.Pavlov:这看起来与C#很相似,循环本身可能是相同的。困难的部分是用于目标数组的数据类型,这取决于进一步对结果做了什么。没有更多的背景,我无法给出进一步的建议。 – 2012-02-29 00:28:05