adjust the header parser to support "public virtual" construction and make a tweak...
authorVadim Pisarevsky <no@email>
Wed, 25 Jan 2012 13:25:35 +0000 (13:25 +0000)
committerVadim Pisarevsky <no@email>
Wed, 25 Jan 2012 13:25:35 +0000 (13:25 +0000)
modules/python/src2/cv2.cv.hpp
modules/python/src2/gen2.py
modules/python/src2/hdr_parser.py

index cdd698f..0f20fe9 100644 (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[] =
index 4b9ecad..830c378 100644 (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:]
index 48db3e3..b2ab908 100755 (executable)
@@ -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]