我使用opencv v2.2在ndarrays上做了一些模板匹配,当使用它们的包装方法cv.fromarray()
时,我遇到了很大的内存泄漏问题。而不是插上内存泄漏我避免了fromarray()
功能,直接使用cv.SetData
,就像这样:如何将numpy数组视图转换为opencv矩阵?
assert foo_numpy.dtype == 'uint8'
assert foo_numpy.ndim == 3
h, w = foo_numpy.shape[:2]
foo_cv = cv.CreateMat(h, w, cv.CV_8UC3)
cv.SetData(foo_cv, foo_numpy.data, foo_numpy.strides[0])
这似乎解决了内存泄漏和foo_cv
似乎正确时,它超出范围被释放。但是,现在我有问题,如果foo_numpy
只是一个更大的阵列上的片/视图,我不允许foo_numpy.data
(无法获得不连续阵列的单段缓冲区)。目前我正在通过制作foo_numpy.copy()
(如果foo_numpy.base != None
)来解决这个问题,它允许获取新副本上的缓冲区。但我有这种感觉,这是不必要的,该片有__array_struct__
和__array_interface__
,所以我应该能够用适当的步骤以某种方式跨步它?我不知道如何以一种很好的方式来做到这一点,因为这一个基地也可以在另一个更大的数组无限期的视图。
感谢,这似乎工作,但我不认为我可以获得任何性能超过我目前的解决方案(制作数组的副本),因为tostring()方法似乎无论如何都会返回一个副本。如我错了请纠正我.. – wim 2011-05-17 07:20:14