我正在使用OpenCV v2.2在ndarrays上进行一些模板匹配,当使用他们的包装方法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.base != None
时制作foo_numpy.copy()
来解决这个问题,这样可以在新副本上获取缓冲区。但我觉得这是不必要的,因为这个切片具有__array_struct__
和__array_interface__
,所以我应该能够用适当的步长轻松地跨越它?我不确定如何以好的方式做到这一点,因为这个数组的基础也可以是另一个更大的数组的视图,进一步无限延伸。