【发布时间】:2014-07-21 21:43:38
【问题描述】:
我正在为 python 编写一个 c++ 模块。它需要一张图像,进行一些处理并返回一个图像字典。我有内存泄漏,我不知道为什么..
我使用opencv-ndarray-conversion 在cv::Mat 和numpy.ndarray 之间进行转换
我使用Boost.Python将c++代码转换为python模块。
我使用下面的python代码来测试c++模块,同时运行htop来检查内存使用情况。
import cv2
import this_cpp_module
for i in xrange(100000):
img = cv2.imread('a_640x480x3_image.png')
ret = this_cpp_module.func(img)
#this 'func' is mapping to one of the following c++ functions, using Boost.Python:
# func1, func2 or func3.
1、转换图片不会导致内存泄漏
using namespace boost::python;
PyObject * func1(PyObject *image)
{
NDArrayConverter cvt;
cv::Mat mat;
mat = cvt.toMat(image);
PyObject* ret = cvt.toNDArray(mat);
return ret;
}
2、构造字典并将图像放入其中不会导致内存泄漏
using namespace boost::python;
dict func2(PyObject *image)
{
dict pyDict;
object objImage(handle<>(borrowed(image)));
pyDict[std::string("key")] = objImage;
return pyDict;
}
3,但是将它们组合起来会导致内存泄漏(每个循环大约 1MB)
dict func3(PyObject *image)
{
return func2(func1(image));
}
我想不通。一切对我来说似乎都是正确的,但将它们组合在一起只会导致这个问题。
【问题讨论】:
-
能否添加
func的源代码,可能与内存泄漏有关。 -
@AndrewJohnson
func映射到 c++ 函数之一:func1、func2或func3。
标签: python c++ opencv boost memory-leaks