【发布时间】:2011-07-31 07:30:59
【问题描述】:
我正在使用 opencv v2.2 对 ndarray 进行一些模板匹配,但在使用他们的包装方法 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() 设为foo_numpy.base != None 来解决此问题,这允许在新副本上获取缓冲区。但我觉得这是不必要的,切片有__array_struct__ 和__array_interface__,所以我应该能够以某种方式以适当的步长跨越它?我不知道如何以一种好的方式做到这一点,因为这个基础也可以是另一个更大的数组无限的视图。
【问题讨论】:
标签: python arrays opencv numpy stride