adjust the header parser to support "public virtual" construction and make a tweak for multiple inheritance, fix potential memory problem with Python's IplImage.tostring() method (ticket #1486)

This commit is contained in:
Vadim Pisarevsky 2012-01-25 13:25:35 +00:00
parent c86c6a028c
commit d1b5f43700
3 changed files with 13 additions and 40 deletions

View File

@ -238,47 +238,18 @@ static PyObject *iplimage_repr(PyObject *self)
static PyObject *iplimage_tostring(PyObject *self, PyObject *args)
{
iplimage_t *pc = (iplimage_t*)self;
IplImage *i;
IplImage *i=0;
if (!convert_to_IplImage(self, &i, "self"))
return NULL;
if (i == NULL)
return NULL;
int bps;
switch (i->depth) {
case IPL_DEPTH_8U:
case IPL_DEPTH_8S:
bps = 1;
break;
case IPL_DEPTH_16U:
case IPL_DEPTH_16S:
bps = 2;
break;
case IPL_DEPTH_32S:
case IPL_DEPTH_32F:
bps = 4;
break;
case IPL_DEPTH_64F:
bps = 8;
break;
default:
return failmsg("Unrecognised depth %d", i->depth), (PyObject*)0;
}
int bpl = i->width * i->nChannels * bps;
if (PyString_Check(pc->data) && bpl == i->widthStep && pc->offset == 0 && ((bpl * i->height) == what_size(pc->data))) {
Py_INCREF(pc->data);
return pc->data;
} else {
int l = bpl * i->height;
char *s = new char[l];
int y;
for (y = 0; y < i->height; y++) {
memcpy(s + y * bpl, i->imageData + y * i->widthStep, bpl);
}
PyObject *r = PyString_FromStringAndSize(s, l);
delete[] s;
return r;
}
cv::Mat img(i);
size_t esz = img.elemSize();
int nrows = img.rows, ncols = img.cols;
if( !img.isContinuous() )
img = img.clone();
return PyString_FromStringAndSize((char*)img.data, (Py_ssize_t)(esz*nrows*ncols));
}
static struct PyMethodDef iplimage_methods[] =

View File

@ -215,9 +215,11 @@ class ClassInfo(object):
if decl:
self.bases = decl[1].split()[1:]
if len(self.bases) > 1:
print "Error: class %s has more than 1 base class (not supported by Python C extensions)" % (self.name,)
print "Warning: class %s has more than 1 base class (not supported by Python C extensions)" % (self.name,)
print "Bases: ", self.bases
return sys.exit(-1)
print "Only the first base class will be used"
self.bases = self.bases[:1]
#return sys.exit(-1)
for m in decl[2]:
if m.startswith("="):
self.wname = m[1:]

View File

@ -235,7 +235,7 @@ class CppHeaderParser(object):
modlist.append("=" + macro_arg)
l = l[:npos] + l[npos3+1:]
l = self.batch_replace(l, [("CV_EXPORTS_W", ""), ("CV_EXPORTS", ""), ("public ", " "), ("::", ".")]).strip()
l = self.batch_replace(l, [("CV_EXPORTS_W", ""), ("CV_EXPORTS", ""), ("public virtual ", " "), ("public ", " "), ("::", ".")]).strip()
ll = re.split(r'\s*[,:]?\s*', l)
ll = [le for le in ll if le]
classname = ll[1]