From: <eri...@we...> - 2010-04-28 16:38:47
|
Hej everyone! I got a serious problem for my project, though I am not sure if it is more related to SWIG or OpenCV. >From Python I want to be able to call C functions over SWIG, one of which returns picture data in CvMat format. The C function looks roughly like this: // example.c CvMat exampleCall(int n) { CvMat matrix; // preparing the data matrix = cvMat(16, 192, CV_8UC1, data); return matrix; } What I get in Python from this function is a Swig Object of type 'CvMat *'. I will have to call this function quite frequently and so want to use the same variable over and over, but after the second attempt I get a memory leak: >>> import example >>> imageData = example.exampleCall(0) >>> imageData <Swig Object of type 'CvMat *' at 0x7f5f30ae92a0> >>> imageData = example.exampleCall(0) swig/python detected a memory leak of type 'CvMat *', no destructor found. It seemed to be related to some ownership problem over the imageData and at first seemed to have found the solution by rejecting the ownership after each call: >>> import example >>> imageData = example.exampleCall(0) >>> imageData.disown() >>> imageData = example.exampleCall(0) >>> imageData.disown() >>> imageData = example.exampleCall(0) >>> imageData.disown() >>> imageData = example.exampleCall(0) >>> imageData.disown() >>> from opencv import highgui >>> highgui.cvSaveImage("test.png", imageData) 1 >>> imageData = example.exampleCall(0) >>> imageData.disown() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/pymodules/python2.6/opencv/cv.py", line 2099, in <lambda> __getattr__ = lambda self, name: _swig_getattr(self, CvMat, name) File "/usr/lib/pymodules/python2.6/opencv/cv.py", line 54, in _swig_getattr raise AttributeError(name) AttributeError: disown >>> highgui.cvSaveImage("test.png", imageData) 1 >>> imageData = example.exampleCall(0) >>> imageData.disown() [1] 29639 segmentation fault python I can call the C function over and over again with no apparent problem, but once I try to save the picture data into a file (which seems to work perfectly) I cannot seem to use disown anymore. Furthermore, if I go on, after two more calls (with or without further disown()s) I get a segmentation fault which leads Python to exit. So what can possibly happen to my variable at the cvSaveImage function that causes this behavior? cvSaveImage is supposed to only read the imageData, not change it. Help is much appreciated as I could not find an answer elsewhere, thanks a lot! Eric ___________________________________________________________ NEU: WEB.DE DSL für 19,99 EUR/mtl. und ohne Mindest-Laufzeit! http://produkte.web.de/go/02/ |