私は 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()
ifを作成することで、これを回避しています。foo_numpy.base != None
しかし、これは不要だと感じています。スライスには があるので、適切なステップサイズ__array_struct__
で__array_interface__
それをどうにかしてストライドできるはずですか? このベースは、無限に別のより大きな配列のビューにもなる可能性があるため、良い方法でそれを行う方法がわかりません。