disable implicit numpy array use in old-style Python bindings because of hard-to-fix memory leaks (ticket #1177)

pull/13383/head
Vadim Pisarevsky 14 years ago
parent 3f40a1d8c3
commit e2e4ee2f53
  1. 16
      modules/python/src2/cv2.cv.hpp
  2. 7
      modules/python/test/test.py

@ -1600,15 +1600,15 @@ static int convert_to_CvMat(PyObject *o, CvMat **dst, const char *name)
Py_ssize_t buffer_len; Py_ssize_t buffer_len;
if (!is_cvmat(o)) { if (!is_cvmat(o)) {
#if !PYTHON_USE_NUMPY //#if !PYTHON_USE_NUMPY
return failmsg("Argument '%s' must be CvMat", name); return failmsg("Argument '%s' must be CvMat. Use fromarray() to convert numpy arrays to CvMat", name);
#else /*#else
PyObject *asmat = fromarray(o, 0); PyObject *asmat = fromarray(o, 0);
if (asmat == NULL) if (asmat == NULL)
return failmsg("Argument '%s' must be CvMat", name); return failmsg("Argument '%s' must be CvMat", name);
// now have the array obect as a cvmat, can use regular conversion // now have the array obect as a cvmat, can use regular conversion
return convert_to_CvMat(asmat, dst, name); return convert_to_CvMat(asmat, dst, name);
#endif #endif*/
} else { } else {
m->a->refcount = NULL; m->a->refcount = NULL;
if (m->data && PyString_Check(m->data)) { if (m->data && PyString_Check(m->data)) {
@ -1666,15 +1666,15 @@ static int convert_to_CvArr(PyObject *o, CvArr **dst, const char *name)
} else if (is_cvmatnd(o)) { } else if (is_cvmatnd(o)) {
return convert_to_CvMatND(o, (CvMatND**)dst, name); return convert_to_CvMatND(o, (CvMatND**)dst, name);
} else { } else {
#if !PYTHON_USE_NUMPY //#if !PYTHON_USE_NUMPY
return failmsg("CvArr argument '%s' must be IplImage, CvMat or CvMatND", name); return failmsg("CvArr argument '%s' must be IplImage, CvMat or CvMatND. Use fromarray() to convert numpy arrays to CvMat or cvMatND", name);
#else /*#else
PyObject *asmat = fromarray(o, 0); PyObject *asmat = fromarray(o, 0);
if (asmat == NULL) if (asmat == NULL)
return failmsg("CvArr argument '%s' must be IplImage, CvMat, CvMatND, or support the array interface", name); return failmsg("CvArr argument '%s' must be IplImage, CvMat, CvMatND, or support the array interface", name);
// now have the array obect as a cvmat, can use regular conversion // now have the array obect as a cvmat, can use regular conversion
return convert_to_CvArr(asmat, dst, name); return convert_to_CvArr(asmat, dst, name);
#endif #endif*/
} }
} }

@ -940,8 +940,8 @@ class AreaTests(OpenCVTests):
# Using an array object for a CvArr parameter # Using an array object for a CvArr parameter
ones = numpy.ones((640, 480)) ones = numpy.ones((640, 480))
r = numpy.ones((640, 480)) r = cv.fromarray(numpy.ones((640, 480)))
cv.AddS(ones, 7, r) cv.AddS(cv.fromarray(ones), 7, r)
self.assert_(numpy.alltrue(r == (8 * ones))) self.assert_(numpy.alltrue(r == (8 * ones)))
# create arrays, use them in OpenCV and replace the the array # create arrays, use them in OpenCV and replace the the array
@ -958,11 +958,12 @@ class AreaTests(OpenCVTests):
# #
m = numpy.identity(4, dtype = numpy.float32) m = numpy.identity(4, dtype = numpy.float32)
m = cv.fromarray(m[:3, :3])
rvec = cv.CreateMat(3, 1, cv.CV_32FC1) rvec = cv.CreateMat(3, 1, cv.CV_32FC1)
rvec[0,0] = 1 rvec[0,0] = 1
rvec[1,0] = 1 rvec[1,0] = 1
rvec[2,0] = 1 rvec[2,0] = 1
cv.Rodrigues2(rvec, m[:3,:3]) cv.Rodrigues2(rvec, m)
#print m #print m
else: else:

Loading…
Cancel
Save