Index: cv.cpp =================================================================== --- cv.cpp (revisione 3428) +++ cv.cpp (copia locale) @@ -1623,6 +1623,7 @@ cvSetData(m->a, (void*)((char*)buffer + m->offset), m->a->step); assert(cvGetErrStatus() == 0); *dst = m->a; + Py_DECREF(o); return 1; } else { return failmsg("CvMat argument '%s' has no data", name); @@ -1726,6 +1727,7 @@ if (ao != NULL && PyCObject_Check(ao) && ((PyArrayInterface*)PyCObject_AsVoidPtr(ao))->two == 2) { + Py_DECREF(ao); return 1; } } @@ -1734,7 +1736,7 @@ } static int convert_to_cvarrseq(PyObject *o, cvarrseq *dst, const char *name = "no_name") -{ +{ if (PyType_IsSubtype(o->ob_type, &cvseq_Type)) { return convert_to_CvSeq(o, &(dst->seq), name); } else if (is_convertible_to_mat(o)) { @@ -1749,7 +1751,7 @@ // a sequence and that they are all the same size for (Py_ssize_t i = 0; i < PySequence_Fast_GET_SIZE(fi); i++) { PyObject *e = PySequence_Fast_GET_ITEM(fi, i); - + if (!PySequence_Check(e)) return failmsg("Sequence '%s' must contain sequences", name); if (i == 0) @@ -2786,6 +2788,7 @@ static PyObject *fromarray(PyObject *o, int allowND) { + PyObject *ao = PyObject_GetAttrString(o, "__array_struct__"); if ((ao == NULL) || !PyCObject_Check(ao)) { PyErr_SetString(PyExc_TypeError, "object does not have array interface"); @@ -2796,7 +2799,7 @@ PyErr_SetString(PyExc_TypeError, "object does not have array interface"); return NULL; } - + int type = -1; switch (pai->typekind) { @@ -2847,6 +2850,7 @@ return (PyObject*)failmsg("cv.fromarray array can be 2D or 3D only, see allowND argument"); } m->a->data.ptr = (uchar*)pai->data; + Py_DECREF(ao); return pythonize_foreign_CvMat(m); } else { int dims[CV_MAX_DIM];