我正在使用 opencv v2.2 在 ndarrays 上进行一些模板匹配,并且在使用它们的 Wrapped 方法时遇到了内存泄漏问题cv.fromarray()
。我没有堵塞内存泄漏,而是避免了该fromarray()
功能并cv.SetData
直接使用,如下所示:
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()
if来解决这个问题foo_numpy.base != None
,这允许在新副本上获取缓冲区。但我觉得这是不必要的,切片有__array_struct__
,__array_interface__
所以我应该能够以某种方式以适当的步长跨越它?我不确定如何以一种好的方式做到这一点,因为这个基础也可以是另一个更大的数组无限的视图。