]> rtime.felk.cvut.cz Git - opencv.git/blobdiff - opencv/interfaces/python/cv.cpp
#150 ReshapeMatND: test, implementaton, doc
[opencv.git] / opencv / interfaces / python / cv.cpp
index 41db1f2d5c7298841afd7010153e56a417d2b1fb..5728d1ebd8d16bbedbfe1cc222b6794053d1da85 100644 (file)
@@ -88,22 +88,9 @@ struct cvlineiterator_t {
   int type;
 };
 
-struct iplconvkernel_t {
-  PyObject_HEAD
-  IplConvKernel *a;
-};
-
-struct cvcapture_t {
-  PyObject_HEAD
-  CvCapture *a;
-};
-
-struct cvvideowriter_t {
-  PyObject_HEAD
-  CvVideoWriter *a;
-};
-
 typedef IplImage ROIplImage;
+typedef const CvMat ROCvMat;
+typedef PyObject PyCallableObject;
 
 struct cvmoments_t {
   PyObject_HEAD
@@ -115,21 +102,11 @@ struct cvfont_t {
   CvFont a;
 };
 
-struct cvhaarclassifiercascade_t {
-  PyObject_HEAD
-  CvHaarClassifierCascade *a;
-};
-
 struct cvcontourtree_t {
   PyObject_HEAD
   CvContourTree *a;
 };
 
-struct cvpositobject_t {
-  PyObject_HEAD
-  CvPOSITObject *a;
-};
-
 struct cvrng_t {
   PyObject_HEAD
   CvRNG a;
@@ -143,6 +120,30 @@ static int convert_to_IplImage(PyObject *o, IplImage **dst, const char *name = "
 static int convert_to_CvMat(PyObject *o, CvMat **dst, const char *name = "no_name");
 static int convert_to_CvMatND(PyObject *o, CvMatND **dst, const char *name = "no_name");
 static PyObject *what_data(PyObject *o);
+static PyObject *FROM_CvMat(CvMat *r);
+static PyObject *FROM_ROCvMatPTR(ROCvMat *r);
+static PyObject *shareDataND(PyObject *donor, CvMatND *pdonor, CvMatND *precipient);
+
+#define FROM_double(r)  PyFloat_FromDouble(r)
+#define FROM_float(r)  PyFloat_FromDouble(r)
+#define FROM_int(r)  PyInt_FromLong(r)
+#define FROM_int64(r)  PyLong_FromLongLong(r)
+#define FROM_unsigned(r)  PyLong_FromUnsignedLong(r)
+#define FROM_CvBox2D(r) Py_BuildValue("(ff)(ff)f", r.center.x, r.center.y, r.size.width, r.size.height, r.angle)
+#define FROM_CvScalar(r)  Py_BuildValue("(ffff)", r.val[0], r.val[1], r.val[2], r.val[3])
+#define FROM_CvPoint(r)  Py_BuildValue("(ii)", r.x, r.y)
+#define FROM_CvPoint2D32f(r) Py_BuildValue("(ff)", r.x, r.y)
+#define FROM_CvPoint3D64f(r) Py_BuildValue("(fff)", r.x, r.y, r.z)
+#define FROM_CvSize(r) Py_BuildValue("(ii)", r.width, r.height)
+#define FROM_CvRect(r) Py_BuildValue("(iiii)", r.x, r.y, r.width, r.height)
+#define FROM_CvSeqPTR(r) _FROM_CvSeqPTR(r, pyobj_storage)
+#define FROM_CvSubdiv2DPTR(r) _FROM_CvSubdiv2DPTR(r, pyobj_storage)
+#define FROM_CvPoint2D64f(r) Py_BuildValue("(ff)", r.x, r.y)
+#define FROM_CvConnectedComp(r) Py_BuildValue("(fNN)", (r).area, FROM_CvScalar((r).value), FROM_CvRect((r).rect))
+
+#if PYTHON_USE_NUMPY
+static PyObject *fromarray(PyObject *o, int allowND);
+#endif
 
 static void translate_error_to_exception(void)
 {
@@ -221,6 +222,15 @@ static Py_ssize_t what_size(PyObject *o)
 
 /************************************************************************/
 
+CvMat *PyCvMat_AsCvMat(PyObject *o)
+{
+  assert(0); // not yet implemented: reference counting for CvMat in Kalman is unclear...
+  return NULL;
+}
+
+#define cvReleaseIplConvKernel(x) cvReleaseStructuringElement(x)
+#include "generated3.i"
+
 /* iplimage */
 
 static void iplimage_dealloc(PyObject *self)
@@ -328,6 +338,7 @@ static void iplimage_setorigin(iplimage_t *cva, PyObject *v)
 
 static PyGetSetDef iplimage_getseters[] = {
   {(char*)"nChannels", (getter)iplimage_getnChannels, (setter)NULL, (char*)"nChannels", NULL},
+  {(char*)"channels", (getter)iplimage_getnChannels, (setter)NULL, (char*)"nChannels", NULL},
   {(char*)"width", (getter)iplimage_getwidth, (setter)NULL, (char*)"width", NULL},
   {(char*)"height", (getter)iplimage_getheight, (setter)NULL, (char*)"height", NULL},
   {(char*)"depth", (getter)iplimage_getdepth, (setter)NULL, (char*)"depth", NULL},
@@ -370,7 +381,7 @@ static void cvmat_dealloc(PyObject *self)
 {
   cvmat_t *pc = (cvmat_t*)self;
   Py_DECREF(pc->data);
-  cvFree((void**)&pc->a);
+  cvFree(&pc->a);
   PyObject_Del(self);
 }
 
@@ -464,13 +475,171 @@ static PyObject *cvmat_getcols(cvmat_t *cva)
   return PyInt_FromLong(cva->a->cols);
 }
 
+static PyObject *cvmat_getchannels(cvmat_t *cva)
+{
+  return PyInt_FromLong(CV_MAT_CN(cva->a->type));
+}
+
+#if PYTHON_USE_NUMPY
+#include "numpy/ndarrayobject.h"
+
+// A PyArrayInterface, with an associated python object that should be DECREF'ed on release
+struct arrayTrack {
+  PyArrayInterface s;
+  PyObject *o;
+};
+
+static void arrayTrackDtor(void *p)
+{
+  struct arrayTrack *at = (struct arrayTrack *)p;
+  delete at->s.shape;
+  delete at->s.strides;
+  if (at->s.descr)
+    Py_DECREF(at->s.descr);
+  Py_DECREF(at->o);
+}
+
+// Fill in fields of PyArrayInterface s using mtype.  This code is common
+// to cvmat and cvmatnd
+
+static void arrayinterface_common(PyArrayInterface *s, int mtype)
+{
+  s->two = 2;
+
+  switch (CV_MAT_DEPTH(mtype)) {
+  case CV_8U:
+    s->typekind = 'u';
+    s->itemsize = 1;
+    break;
+  case CV_8S:
+    s->typekind = 'i';
+    s->itemsize = 1;
+    break;
+  case CV_16U:
+    s->typekind = 'u';
+    s->itemsize = 2;
+    break;
+  case CV_16S:
+    s->typekind = 'i';
+    s->itemsize = 2;
+    break;
+  case CV_32S:
+    s->typekind = 'i';
+    s->itemsize = 4;
+    break;
+  case CV_32F:
+    s->typekind = 'f';
+    s->itemsize = 4;
+    break;
+  case CV_64F:
+    s->typekind = 'f';
+    s->itemsize = 8;
+    break;
+  default:
+    assert(0);
+  }
+
+  s->flags = NPY_WRITEABLE | NPY_NOTSWAPPED;
+}
+
+static PyObject *cvmat_array_struct(cvmat_t *cva)
+{
+  CvMat *m;
+  convert_to_CvMat((PyObject *)cva, &m, "");
+
+  arrayTrack *at = new arrayTrack;
+  PyArrayInterface *s = &at->s;
+
+  at->o = cva->data;
+  Py_INCREF(at->o);
+
+  arrayinterface_common(s, m->type);
+
+  if (CV_MAT_CN(m->type) == 1) {
+    s->nd = 2;
+    s->shape = new npy_intp[2];
+    s->shape[0] = m->rows;
+    s->shape[1] = m->cols;
+    s->strides = new npy_intp[2];
+    s->strides[0] = m->step;
+    s->strides[1] = s->itemsize;
+  } else {
+    s->nd = 3;
+    s->shape = new npy_intp[3];
+    s->shape[0] = m->rows;
+    s->shape[1] = m->cols;
+    s->shape[2] = CV_MAT_CN(m->type);
+    s->strides = new npy_intp[3];
+    s->strides[0] = m->step;
+    s->strides[1] = s->itemsize * CV_MAT_CN(m->type);
+    s->strides[2] = s->itemsize;
+  }
+  s->data = (void*)(m->data.ptr);
+  s->descr = PyList_New(1);
+  char typestr[10];
+  sprintf(typestr, "<%c%d", s->typekind, s->itemsize);
+  PyList_SetItem(s->descr, 0, Py_BuildValue("(ss)", "x", typestr));
+
+  return PyCObject_FromVoidPtr(s, arrayTrackDtor);
+}
+
+static PyObject *cvmatnd_array_struct(cvmatnd_t *cva)
+{
+  CvMatND *m;
+  convert_to_CvMatND((PyObject *)cva, &m, "");
+
+  arrayTrack *at = new arrayTrack;
+  PyArrayInterface *s = &at->s;
+
+  at->o = cva->data;
+  Py_INCREF(at->o);
+
+  arrayinterface_common(s, m->type);
+
+  int i;
+  if (CV_MAT_CN(m->type) == 1) {
+    s->nd = m->dims;
+    s->shape = new npy_intp[s->nd];
+    for (i = 0; i < s->nd; i++)
+      s->shape[i] = m->dim[i].size;
+    s->strides = new npy_intp[s->nd];
+    for (i = 0; i < (s->nd - 1); i++)
+      s->strides[i] = m->dim[i].step;
+    s->strides[s->nd - 1] = s->itemsize;
+  } else {
+    s->nd = m->dims + 1;
+    s->shape = new npy_intp[s->nd];
+    for (i = 0; i < (s->nd - 1); i++)
+      s->shape[i] = m->dim[i].size;
+    s->shape[s->nd - 1] = CV_MAT_CN(m->type);
+
+    s->strides = new npy_intp[s->nd];
+    for (i = 0; i < (s->nd - 2); i++)
+      s->strides[i] = m->dim[i].step;
+    s->strides[s->nd - 2] = s->itemsize * CV_MAT_CN(m->type);
+    s->strides[s->nd - 1] = s->itemsize;
+  }
+  s->data = (void*)(m->data.ptr);
+  s->descr = PyList_New(1);
+  char typestr[10];
+  sprintf(typestr, "<%c%d", s->typekind, s->itemsize);
+  PyList_SetItem(s->descr, 0, Py_BuildValue("(ss)", "x", typestr));
+
+  return PyCObject_FromVoidPtr(s, arrayTrackDtor);
+}
+#endif
+
 static PyGetSetDef cvmat_getseters[] = {
   {(char*)"type",   (getter)cvmat_gettype, (setter)NULL, (char*)"type",   NULL},
   {(char*)"step",   (getter)cvmat_getstep, (setter)NULL, (char*)"step",   NULL},
   {(char*)"rows",   (getter)cvmat_getrows, (setter)NULL, (char*)"rows",   NULL},
   {(char*)"cols",   (getter)cvmat_getcols, (setter)NULL, (char*)"cols",   NULL},
+  {(char*)"channels",(getter)cvmat_getchannels, (setter)NULL, (char*)"channels",   NULL},
   {(char*)"width",  (getter)cvmat_getcols, (setter)NULL, (char*)"width",  NULL},
   {(char*)"height", (getter)cvmat_getrows, (setter)NULL, (char*)"height", NULL},
+#if PYTHON_USE_NUMPY
+  {(char*)"__array_struct__", (getter)cvmat_array_struct, (setter)NULL, (char*)"__array_struct__", NULL},
+#endif
   {NULL}  /* Sentinel */
 };
 
@@ -526,7 +695,7 @@ static PyObject *cvmatnd_repr(PyObject *self)
 
 static size_t cvmatnd_size(CvMatND *m)
 {
-  int bps;
+  int bps = 1;
   switch (CV_MAT_DEPTH(m->type)) {
   case CV_8U:
   case CV_8S:
@@ -617,6 +786,19 @@ static struct PyMethodDef cvmatnd_methods[] =
   {NULL,          NULL}
 };
 
+static PyObject *cvmatnd_getchannels(cvmatnd_t *cva)
+{
+  return PyInt_FromLong(CV_MAT_CN(cva->a->type));
+}
+
+static PyGetSetDef cvmatnd_getseters[] = {
+#if PYTHON_USE_NUMPY
+  {(char*)"__array_struct__", (getter)cvmatnd_array_struct, (setter)NULL, (char*)"__array_struct__", NULL},
+#endif
+  {(char*)"channels",(getter)cvmatnd_getchannels, (setter)NULL, (char*)"channels",   NULL},
+  {NULL}  /* Sentinel */
+};
+
 static PyMappingMethods cvmatnd_as_map = {
   NULL,
   &cvarr_GetItem,
@@ -636,6 +818,7 @@ static void cvmatnd_specials(void)
   cvmatnd_Type.tp_as_mapping = &cvmatnd_as_map;
   cvmatnd_Type.tp_repr = cvmatnd_repr;
   cvmatnd_Type.tp_methods = cvmatnd_methods;
+  cvmatnd_Type.tp_getset = cvmatnd_getseters;
 }
 
 static int is_cvmatnd(PyObject *o)
@@ -768,77 +951,6 @@ static void memtrack_specials(void)
   memtrack_Type.tp_as_buffer = &memtrack_as_buffer;
 }
 
-/************************************************************************/
-
-/* iplconvkernel */
-
-static void iplconvkernel_dealloc(PyObject *self)
-{
-  iplconvkernel_t *pi = (iplconvkernel_t*)self;
-  cvReleaseStructuringElement(&(pi->a));
-  PyObject_Del(self);
-}
-
-static PyTypeObject iplconvkernel_Type = {
-  PyObject_HEAD_INIT(&PyType_Type)
-  0,                                      /*size*/
-  MODULESTR".iplconvkernel",                          /*name*/
-  sizeof(iplconvkernel_t),                        /*basicsize*/
-};
-
-static void iplconvkernel_specials(void)
-{
-  iplconvkernel_Type.tp_dealloc = iplconvkernel_dealloc;
-}
-
-/************************************************************************/
-
-/* cvcapture */
-
-static void cvcapture_dealloc(PyObject *self)
-{
-  cvcapture_t *pi = (cvcapture_t*)self;
-  cvReleaseCapture(&(pi->a));
-  PyObject_Del(self);
-}
-
-static PyTypeObject cvcapture_Type = {
-  PyObject_HEAD_INIT(&PyType_Type)
-  0,                                      /*size*/
-  MODULESTR".cvcapture",                  /*name*/
-  sizeof(cvcapture_t),                    /*basicsize*/
-};
-
-static void cvcapture_specials(void)
-{
-  cvcapture_Type.tp_dealloc = cvcapture_dealloc;
-}
-
-/************************************************************************/
-
-/* cvvideowriter */
-
-static void cvvideowriter_dealloc(PyObject *self)
-{
-  cvvideowriter_t *pi = (cvvideowriter_t*)self;
-  cvReleaseVideoWriter(&(pi->a));
-  PyObject_Del(self);
-}
-
-static PyTypeObject cvvideowriter_Type = {
-  PyObject_HEAD_INIT(&PyType_Type)
-  0,                                      /*size*/
-  MODULESTR".cvvideowriter",              /*name*/
-  sizeof(cvvideowriter_t),                /*basicsize*/
-};
-
-static void cvvideowriter_specials(void)
-{
-  cvvideowriter_Type.tp_dealloc = cvvideowriter_dealloc;
-}
-
-
-
 /************************************************************************/
 
 /* cvmoments */
@@ -892,29 +1004,6 @@ static void cvfont_specials(void) { }
 
 /************************************************************************/
 
-/* cvpositobject */
-
-static void cvpositobject_dealloc(PyObject *self)
-{
-  cvpositobject_t *pi = (cvpositobject_t*)self;
-  cvReleasePOSITObject(&(pi->a));
-  PyObject_Del(self);
-}
-
-static PyTypeObject cvpositobject_Type = {
-  PyObject_HEAD_INIT(&PyType_Type)
-  0,                                      /*size*/
-  MODULESTR".cvpositobject",                     /*name*/
-  sizeof(cvpositobject_t),                       /*basicsize*/
-};
-
-static void cvpositobject_specials(void)
-{
-  cvpositobject_Type.tp_dealloc = cvpositobject_dealloc;
-}
-
-/************************************************************************/
-
 /* cvrng */
 
 static PyTypeObject cvrng_Type = {
@@ -930,19 +1019,6 @@ static void cvrng_specials(void)
 
 /************************************************************************/
 
-/* cvhaarclassifiercascade */
-
-static PyTypeObject cvhaarclassifiercascade_Type = {
-  PyObject_HEAD_INIT(&PyType_Type)
-  0,                                      /*size*/
-  MODULESTR".cvhaarclassifiercascade",                     /*name*/
-  sizeof(cvhaarclassifiercascade_t),                       /*basicsize*/
-};
-
-static void cvhaarclassifiercascade_specials(void) { }
-
-/************************************************************************/
-
 /* cvcontourtree */
 
 static PyTypeObject cvcontourtree_Type = {
@@ -1023,7 +1099,10 @@ static struct PyMethodDef cvseq_methods[] =
 static Py_ssize_t cvseq_seq_length(PyObject *o)
 {
   cvseq_t *ps = (cvseq_t*)o;
-  return (Py_ssize_t)(ps->a->total);
+  if (ps->a == NULL)
+    return (Py_ssize_t)0;
+  else
+    return (Py_ssize_t)(ps->a->total);
 }
 
 static PyObject* cvseq_seq_getitem(PyObject *o, Py_ssize_t i)
@@ -1036,7 +1115,7 @@ static PyObject* cvseq_seq_getitem(PyObject *o, Py_ssize_t i)
   CvPoint2D32f *pt2;
   CvPoint3D32f *pt3;
 
-  if (i < (Py_ssize_t)(ps->a->total)) {
+  if (i < cvseq_seq_length(o)) {
     switch (CV_SEQ_ELTYPE(ps->a)) {
 
     case CV_SEQ_ELTYPE_POINT:
@@ -1053,6 +1132,11 @@ static PyObject* cvseq_seq_getitem(PyObject *o, Py_ssize_t i)
           Py_INCREF(r->container);
           return (PyObject*)r;
         }
+      case sizeof(CvConnectedComp):
+        {
+          CvConnectedComp *cc = CV_GET_SEQ_ELEM(CvConnectedComp, ps->a, i);
+          return FROM_CvConnectedComp(*cc);
+        }
       default:
         printf("seq elem size is %d\n", ps->a->elem_size);
         printf("KIND %d\n", CV_SEQ_KIND(ps->a));
@@ -1087,17 +1171,16 @@ static PyObject* cvseq_seq_getitem(PyObject *o, Py_ssize_t i)
 
 static PyObject* cvseq_map_getitem(PyObject *o, PyObject *item)
 {
-  cvseq_t *ps = (cvseq_t*)o;
   if (PyInt_Check(item)) {
     long i = PyInt_AS_LONG(item);
     if (i < 0)
-      i += ps->a->total;
+      i += cvseq_seq_length(o);
     return cvseq_seq_getitem(o, i);
   } else if (PySlice_Check(item)) {
     Py_ssize_t start, stop, step, slicelength, cur, i;
     PyObject* result;
 
-    if (PySlice_GetIndicesEx((PySliceObject*)item, ps->a->total,
+    if (PySlice_GetIndicesEx((PySliceObject*)item, cvseq_seq_length(o),
          &start, &stop, &step, &slicelength) < 0) {
       return NULL;
     }
@@ -1225,7 +1308,7 @@ static void cvset_specials(void)
 
 static PyTypeObject cvsubdiv2d_Type = {
   PyObject_HEAD_INIT(&PyType_Type)
-  0,                                      /*size*/
+  0,                                          /*size*/
   MODULESTR".cvsubdiv2d",                     /*name*/
   sizeof(cvsubdiv2d_t),                       /*basicsize*/
 };
@@ -1286,6 +1369,18 @@ static void cvsubdiv2dpoint_specials(void)
 /************************************************************************/
 /* convert_to_X: used after PyArg_ParseTuple in the generated code  */
 
+static int convert_to_PyObjectPTR(PyObject *o, PyObject **dst, const char *name = "no_name")
+{
+  *dst = o;
+  return 1;
+}
+
+static int convert_to_PyCallableObjectPTR(PyObject *o, PyObject **dst, const char *name = "no_name")
+{
+  *dst = o;
+  return 1;
+}
+
 static int convert_to_char(PyObject *o, char *dst, const char *name = "no_name")
 {
   if (PyString_Check(o) && PyString_Size(o) == 1) {
@@ -1392,6 +1487,7 @@ static int convert_to_CvPoint2D32fPTR(PyObject *o, CvPoint2D32f **p, const char
   return 1;
 }
 
+#if 0 // not used
 static int convert_to_CvPoint3D32fPTR(PyObject *o, CvPoint3D32f **p, const char *name = "no_name")
 {
   PyObject *fi = PySequence_Fast(o, name);
@@ -1409,6 +1505,7 @@ static int convert_to_CvPoint3D32fPTR(PyObject *o, CvPoint3D32f **p, const char
   Py_DECREF(fi);
   return 1;
 }
+#endif
 
 static int convert_to_CvStarDetectorParams(PyObject *o, CvStarDetectorParams *dst, const char *name = "no_name")
 {
@@ -1557,7 +1654,15 @@ static int convert_to_CvArr(PyObject *o, CvArr **dst, const char *name)
   } else if (is_cvmatnd(o)) {
     return convert_to_CvMatND(o, (CvMatND**)dst, name);
   } else {
+#if !PYTHON_USE_NUMPY
     return failmsg("CvArr argument '%s' must be IplImage, CvMat or CvMatND", name);
+#else
+    PyObject *asmat = fromarray(o, 0);
+    if (asmat == NULL)
+      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
+    return convert_to_CvArr(asmat, dst, name);
+#endif
   }
 }
 
@@ -1598,13 +1703,16 @@ static int convert_to_pts_npts_contours(PyObject *o, pts_npts_contours *dst, con
 }
 
 struct cvarrseq {
-  void *v;
+  union {
+    CvSeq *seq;
+    CvArr *mat;
+  };
 };
 
 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, (CvSeq**)&(dst->v), name);
+    return convert_to_CvSeq(o, &(dst->seq), name);
   } else if (PySequence_Check(o)) {
     PyObject *fi = PySequence_Fast(o, name);
     if (fi == NULL)
@@ -1635,10 +1743,10 @@ static int convert_to_cvarrseq(PyObject *o, cvarrseq *dst, const char *name = "n
       Py_DECREF(fe);
     }
     Py_DECREF(fi);
-    dst->v = mt;
+    dst->mat = mt;
     return 1;
   } else {
-    return convert_to_CvArr(o, (CvArr**)&(dst->v), name);
+    return convert_to_CvArr(o, &(dst->mat), name);
   }
 }
 
@@ -1933,39 +2041,6 @@ static int convert_to_floatPTRPTR(PyObject *o, float*** dst, const char *name =
   return 1;
 }
 
-static int convert_to_IplConvKernelPTR(PyObject *o, IplConvKernel** dst, const char *name = "no_name")
-{
-  if (PyType_IsSubtype(o->ob_type, &iplconvkernel_Type)) {
-    *dst = ((iplconvkernel_t*)o)->a;
-    return 1;
-  } else {
-    (*dst) = (IplConvKernel*)NULL;
-    return failmsg("Expected IplConvKernel for argument '%s'", name);
-  }
-}
-
-static int convert_to_CvCapturePTR(PyObject *o, CvCapture** dst, const char *name = "no_name")
-{
-  if (PyType_IsSubtype(o->ob_type, &cvcapture_Type)) {
-    *dst = ((cvcapture_t*)o)->a;
-    return 1;
-  } else {
-    (*dst) = (CvCapture*)NULL;
-    return failmsg("Expected CvCapture for argument '%s'", name);
-  }
-}
-
-static int convert_to_CvVideoWriterPTR(PyObject *o, CvVideoWriter** dst, const char *name = "no_name")
-{
-  if (PyType_IsSubtype(o->ob_type, &cvvideowriter_Type)) {
-    *dst = ((cvvideowriter_t*)o)->a;
-    return 1;
-  } else {
-    (*dst) = (CvVideoWriter*)NULL;
-    return failmsg("Expected CvVideoWriter for argument '%s'", name);
-  }
-}
-
 static int convert_to_CvMomentsPTR(PyObject *o, CvMoments** dst, const char *name = "no_name")
 {
   if (PyType_IsSubtype(o->ob_type, &cvmoments_Type)) {
@@ -1988,17 +2063,6 @@ static int convert_to_CvFontPTR(PyObject *o, CvFont** dst, const char *name = "n
   }
 }
 
-static int convert_to_CvHaarClassifierCascadePTR(PyObject *o, CvHaarClassifierCascade** dst, const char *name = "no_name")
-{
-  if (PyType_IsSubtype(o->ob_type, &cvhaarclassifiercascade_Type)) {
-    (*dst) = ((cvhaarclassifiercascade_t*)o)->a;
-    return 1;
-  } else {
-    (*dst) = (CvHaarClassifierCascade*)NULL;
-    return failmsg("Expected CvHaarClassifierCascade for argument '%s'", name);
-  }
-}
-
 static int convert_to_CvContourTreePTR(PyObject *o, CvContourTree** dst, const char *name = "no_name")
 {
   if (PyType_IsSubtype(o->ob_type, &cvcontourtree_Type)) {
@@ -2010,17 +2074,6 @@ static int convert_to_CvContourTreePTR(PyObject *o, CvContourTree** dst, const c
   }
 }
 
-static int convert_to_CvPOSITObjectPTR(PyObject *o, CvPOSITObject** dst, const char *name = "no_name")
-{
-  if (PyType_IsSubtype(o->ob_type, &cvpositobject_Type)) {
-    (*dst) = ((cvpositobject_t*)o)->a;
-    return 1;
-  } else {
-    (*dst) = (CvPOSITObject*)NULL;
-    return failmsg("Expected CvPOSITObject for argument '%s'", name);
-  }
-}
-
 static int convert_to_CvRNGPTR(PyObject *o, CvRNG** dst, const char *name = "no_name")
 {
   if (PyType_IsSubtype(o->ob_type, &cvrng_Type)) {
@@ -2099,8 +2152,6 @@ static PyObject *pythonize_CvMat(cvmat_t *m)
 {
   // Need to make this CvMat look like any other, with a Python 
   // buffer object as its data.
-  // So copy the image data into a Python string object, then release 
-  // the original.
   CvMat *mat = m->a;
   assert(mat->step != 0);
 #if 0
@@ -2120,7 +2171,33 @@ static PyObject *pythonize_CvMat(cvmat_t *m)
 
   // Now m has a reference to data, which has a reference to o.
 
-  // cvDecRefData(mat); // Ref count should be zero here, so this is a release
+  return (PyObject*)m;
+}
+
+static PyObject *pythonize_foreign_CvMat(cvmat_t *m)
+{
+  // Need to make this CvMat look like any other, with a Python 
+  // buffer object as its data.
+  // Difference here is that the buffer is 'foreign' (from NumPy, for example)
+  CvMat *mat = m->a;
+  assert(mat->step != 0);
+#if 0
+  PyObject *data = PyString_FromStringAndSize((char*)(mat->data.ptr), mat->rows * mat->step);
+#else
+  memtrack_t *o = PyObject_NEW(memtrack_t, &memtrack_Type);
+  o->ptr = mat->data.ptr;
+  o->size = mat->rows * mat->step;
+  PyObject *data = PyBuffer_FromReadWriteObject((PyObject*)o, (size_t)0, mat->rows * mat->step);
+  if (data == NULL)
+    return NULL;
+  Py_INCREF(o);   // XXX - hack to prevent free of this foreign memory
+#endif
+  m->data = data;
+  m->offset = 0;
+  Py_DECREF(o);
+
+  // Now m has a reference to data, which has a reference to o.
+
   return (PyObject*)m;
 }
 
@@ -2159,20 +2236,19 @@ static PyObject *pythonize_CvMatND(cvmatnd_t *m)
 
   CvMatND *mat = m->a;
   assert(mat->dim[0].step != 0);
-#if 1
+#if 0
   PyObject *data = PyString_FromStringAndSize((char*)(mat->data.ptr), mat->dim[0].size * mat->dim[0].step);
 #else
   memtrack_t *o = PyObject_NEW(memtrack_t, &memtrack_Type);
-  size_t gap = mat->data.ptr - (uchar*)mat->refcount;
-  o->ptr = mat->refcount;
-  o->size = gap + mat->rows * mat->step;
-  PyObject *data = PyBuffer_FromReadWriteObject((PyObject*)o, (size_t)gap, mat->rows * mat->step);
+  o->ptr = cvPtr1D(mat, 0);
+  o->size = cvmatnd_size(mat);
+  PyObject *data = PyBuffer_FromReadWriteObject((PyObject*)o, (size_t)0, o->size);
   if (data == NULL)
     return NULL;
 #endif
   m->data = data;
   m->offset = 0;
-  cvDecRefData(mat); // Ref count should be zero here, so this is a release
+  // cvDecRefData(mat); // Ref count should be zero here, so this is a release
 
   return (PyObject*)m;
 }
@@ -2186,20 +2262,6 @@ static PyObject *pythonize_CvMatND(cvmatnd_t *m)
  * All these functions and macros return a new reference.
  */
 
-#define FROM_double(r)  PyFloat_FromDouble(r)
-#define FROM_float(r)  PyFloat_FromDouble(r)
-#define FROM_int(r)  PyInt_FromLong(r)
-#define FROM_unsigned(r)  PyLong_FromUnsignedLong(r)
-#define FROM_CvBox2D(r) Py_BuildValue("(ff)(ff)f", r.center.x, r.center.y, r.size.width, r.size.height, r.angle)
-#define FROM_CvScalar(r)  Py_BuildValue("(ffff)", r.val[0], r.val[1], r.val[2], r.val[3])
-#define FROM_CvPoint(r)  Py_BuildValue("(ii)", r.x, r.y)
-#define FROM_CvConnectedComp(r) Py_BuildValue("(fNN)", r.area, FROM_CvScalar(r.value), FROM_CvRect(r.rect))
-#define FROM_CvPoint2D32f(r) Py_BuildValue("(ff)", r.x, r.y)
-#define FROM_CvSize(r) Py_BuildValue("(ii)", r.width, r.height)
-#define FROM_CvRect(r) Py_BuildValue("(iiii)", r.x, r.y, r.width, r.height)
-#define FROM_CvSeqPTR(r) _FROM_CvSeqPTR(r, pyobj_storage)
-#define FROM_CvSubdiv2DPTR(r) _FROM_CvSubdiv2DPTR(r, pyobj_storage)
-#define FROM_CvPoint2D64f(r) Py_BuildValue("(ff)", r.x, r.y)
 
 static PyObject *_FROM_CvSeqPTR(CvSeq *s, PyObject *storage)
 {
@@ -2358,27 +2420,6 @@ static PyObject *FROM_CvSeqOfCvSURFDescriptorPTR(CvSeqOfCvSURFDescriptor *r)
   return pr;
 }
 
-static PyObject *FROM_IplConvKernelPTR(IplConvKernel *r)
-{
-  iplconvkernel_t *ick = PyObject_NEW(iplconvkernel_t, &iplconvkernel_Type);
-  ick->a = r;
-  return (PyObject*)ick;
-}
-
-static PyObject *FROM_CvCapturePTR(CvCapture *r)
-{
-  cvcapture_t *c = PyObject_NEW(cvcapture_t, &cvcapture_Type);
-  c->a = r;
-  return (PyObject*)c;
-}
-
-static PyObject *FROM_CvVideoWriterPTR(CvVideoWriter *r)
-{
-  cvvideowriter_t *c = PyObject_NEW(cvvideowriter_t, &cvvideowriter_Type);
-  c->a = r;
-  return (PyObject*)c;
-}
-
 typedef CvPoint2D32f CvPoint2D32f_4[4];
 static PyObject *FROM_CvPoint2D32f_4(CvPoint2D32f* r)
 {
@@ -2446,6 +2487,20 @@ static PyObject *FROM_ROIplImagePTR(ROIplImage *r)
   }
 }
 
+static PyObject *FROM_ROCvMatPTR(ROCvMat *r)
+{
+  if (r != NULL) {
+    cvmat_t *cva = PyObject_NEW(cvmat_t, &cvmat_Type);
+    cva->a = cvCreateMatHeader(100, 100, CV_8U);
+    *(cva->a) = *r;
+    cva->data = PyBuffer_FromReadWriteMemory(r->data.ptr, r->rows * r->step);
+    cva->offset = 0;
+    return (PyObject*)cva;
+  } else {
+    Py_RETURN_NONE;
+  }
+}
+
 static PyObject *FROM_CvMatPTR(CvMat *r)
 {
   cvmat_t *cvm = PyObject_NEW(cvmat_t, &cvmat_Type);
@@ -2468,13 +2523,6 @@ static PyObject *FROM_CvMatNDPTR(CvMatND *r)
   return pythonize_CvMatND(m);
 }
 
-static PyObject *FROM_CvPOSITObjectPTR(CvPOSITObject *r)
-{
-  cvpositobject_t *m = PyObject_NEW(cvpositobject_t, &cvpositobject_Type);
-  m->a = r;
-  return (PyObject*)m;
-}
-
 static PyObject *FROM_CvRNG(CvRNG r)
 {
   cvrng_t *m = PyObject_NEW(cvrng_t, &cvrng_Type);
@@ -2482,13 +2530,6 @@ static PyObject *FROM_CvRNG(CvRNG r)
   return (PyObject*)m;
 }
 
-static PyObject *FROM_CvHaarClassifierCascade(CvHaarClassifierCascade *r)
-{
-  cvhaarclassifiercascade_t *m = PyObject_NEW(cvhaarclassifiercascade_t, &cvhaarclassifiercascade_Type);
-  m->a = r;
-  return (PyObject*)m;
-}
-
 static PyObject *FROM_CvMoments(CvMoments r)
 {
   cvmoments_t *m = PyObject_NEW(cvmoments_t, &cvmoments_Type);
@@ -2514,7 +2555,7 @@ static PyObject *FROM_generic(generic r)
   else if (strcmp(t->type_name, "opencv-matrix") == 0)
     return FROM_CvMat((CvMat*)r);
   else if (strcmp(t->type_name, "opencv-haar-classifier") == 0)
-    return FROM_CvHaarClassifierCascade((CvHaarClassifierCascade*)r);
+    return FROM_CvHaarClassifierCascadePTR((CvHaarClassifierCascade*)r);
   else {
     failmsg("Unknown OpenCV type '%s'", t->type_name);
     return NULL;
@@ -2576,6 +2617,33 @@ static PyObject *pycvLoadImage(PyObject *self, PyObject *args, PyObject *kw)
   }
 }
 
+static PyObject *pycvLoadImageM(PyObject *self, PyObject *args, PyObject *kw)
+{
+  const char *keywords[] = { "filename", "iscolor", NULL };
+  char *filename;
+  int iscolor = CV_LOAD_IMAGE_COLOR;
+
+  if (!PyArg_ParseTupleAndKeywords(args, kw, "s|i", (char**)keywords, &filename, &iscolor))
+    return NULL;
+
+  // Inside ALLOW_THREADS, must not reference 'filename' because it might move.
+  // So make a local copy 'filename_copy'.
+  char filename_copy[2048];
+  strncpy(filename_copy, filename, sizeof(filename_copy));
+
+  CvMat *r;
+  Py_BEGIN_ALLOW_THREADS
+  r = cvLoadImageM(filename_copy, iscolor);
+  Py_END_ALLOW_THREADS
+
+  if (r == NULL) {
+    PyErr_SetFromErrnoWithFilename(PyExc_IOError, filename);
+    return NULL;
+  } else {
+    return FROM_CvMatPTR(r);
+  }
+}
+
 static PyObject *pycvCreateImageHeader(PyObject *self, PyObject *args)
 {
   int w, h, depth, channels;
@@ -2601,7 +2669,7 @@ static PyObject *pycvCreateImage(PyObject *self, PyObject *args)
   if (!PyArg_ParseTuple(args, "(ii)Ii:CreateImage", &w, &h, &depth, &channels))
     return NULL;
   iplimage_t *cva = PyObject_NEW(iplimage_t, &iplimage_Type);
-  cva->a = cvCreateImage(cvSize(w, h), depth, channels);
+  ERRWRAP(cva->a = cvCreateImage(cvSize(w, h), depth, channels));
   if (cva->a == NULL) {
     PyErr_SetString(PyExc_TypeError, "CreateImage failed");
     return NULL;
@@ -2616,7 +2684,7 @@ static PyObject *pycvCreateMatHeader(PyObject *self, PyObject *args)
   if (!PyArg_ParseTuple(args, "iii", &rows, &cols, &type))
     return NULL;
   cvmat_t *m = PyObject_NEW(cvmat_t, &cvmat_Type);
-  m->a = cvCreateMatHeader(rows, cols, type);
+  ERRWRAP(m->a = cvCreateMatHeader(rows, cols, type));
   if (m->a == NULL) {
     PyErr_SetString(PyExc_TypeError, "CreateMat failed");
     return NULL;
@@ -2634,7 +2702,7 @@ static PyObject *pycvCreateMat(PyObject *self, PyObject *args)
   if (!PyArg_ParseTuple(args, "iii", &rows, &cols, &type))
     return NULL;
   cvmat_t *m = PyObject_NEW(cvmat_t, &cvmat_Type);
-  m->a = cvCreateMat(rows, cols, type);
+  ERRWRAP(m->a = cvCreateMat(rows, cols, type));
   if (m->a == NULL) {
     PyErr_SetString(PyExc_TypeError, "CreateMat failed");
     return NULL;
@@ -2671,14 +2739,101 @@ static PyObject *pycvCreateMatND(PyObject *self, PyObject *args)
   return pythonize_CvMatND(m);
 }
 
-static PyObject *pycvCreateHist(PyObject *self, PyObject *args)
+#if PYTHON_USE_NUMPY
+static PyObject *pycvfromarray(PyObject *self, PyObject *args, PyObject *kw)
+{
+  const char *keywords[] = { "arr", "allowND", NULL };
+  PyObject *o;
+  int allowND = 0;
+
+  if (!PyArg_ParseTupleAndKeywords(args, kw, "O|i", (char**)keywords, &o, &allowND))
+    return NULL;
+  return fromarray(o, allowND);
+}
+
+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");
+    return NULL;
+  }
+  PyArrayInterface *pai = (PyArrayInterface*)PyCObject_AsVoidPtr(ao);
+  if (pai->two != 2) {
+    PyErr_SetString(PyExc_TypeError, "object does not have array interface");
+    return NULL;
+  }
+
+  int type = -1;
+
+  switch (pai->typekind) {
+  case 'i':
+    if (pai->itemsize == 1)
+      type = CV_8SC1;
+    else if (pai->itemsize == 2)
+      type = CV_16SC1;
+    else if (pai->itemsize == 4)
+      type = CV_32SC1;
+    else if (pai->itemsize == 8) {
+      PyErr_SetString(PyExc_TypeError, "OpenCV cannot handle 64-bit integer arrays");
+      return NULL;
+    }
+    break;
+
+  case 'u':
+    if (pai->itemsize == 1)
+      type = CV_8UC1;
+    else if (pai->itemsize == 2)
+      type = CV_16UC1;
+    break;
+
+  case 'f':
+    if (pai->itemsize == 4)
+      type = CV_32FC1;
+    else if (pai->itemsize == 8)
+      type = CV_64FC1;
+    break;
+
+  }
+  assert(type != -1);
+
+  if (!allowND) {
+    cvmat_t *m = PyObject_NEW(cvmat_t, &cvmat_Type);
+    if (pai->nd == 2) {
+      ERRWRAP(m->a = cvCreateMatHeader(pai->shape[0], pai->shape[1], type));
+      m->a->step = pai->strides[0];
+    } else if (pai->nd == 3) {
+      if (pai->shape[2] > CV_CN_MAX)
+        return (PyObject*)failmsg("cv.fromarray too many channels, see allowND argument");
+      ERRWRAP(m->a = cvCreateMatHeader(pai->shape[0], pai->shape[1], type + ((pai->shape[2] - 1) << CV_CN_SHIFT)));
+      m->a->step = pai->strides[0];
+    } else {
+      return (PyObject*)failmsg("cv.fromarray array can be 2D or 3D only, see allowND argument");
+    }
+    m->a->data.ptr = (uchar*)pai->data;
+    return pythonize_foreign_CvMat(m);
+  } else {
+    int dims[CV_MAX_DIM];
+    int i;
+    for (i = 0; i < pai->nd; i++)
+      dims[i] = pai->shape[i];
+    cvmatnd_t *m = PyObject_NEW(cvmatnd_t, &cvmatnd_Type);
+    ERRWRAP(m->a = cvCreateMatND(pai->nd, dims, type));
+    m->a->data.ptr = (uchar*)pai->data;
+    return pythonize_CvMatND(m);
+  }
+}
+#endif
+
+static PyObject *pycvCreateHist(PyObject *self, PyObject *args, PyObject *kw)
 {
+  const char *keywords[] = { "dims", "type", "ranges", "uniform", NULL };
   PyObject *dims;
   int type;
   float **ranges = NULL;
   int uniform = 1;
 
-  if (!PyArg_ParseTuple(args, "Oi|O&i", &dims, &type, convert_to_floatPTRPTR, (void*)&ranges, &uniform)) {
+  if (!PyArg_ParseTupleAndKeywords(args, kw, "Oi|O&i", (char**)keywords, &dims, &type, convert_to_floatPTRPTR, (void*)&ranges, &uniform)) {
     return NULL;
   }
   cvhistogram_t *h = PyObject_NEW(cvhistogram_t, &cvhistogram_Type);
@@ -2697,15 +2852,16 @@ static PyObject *pycvCreateHist(PyObject *self, PyObject *args)
   return (PyObject*)h;
 }
 
-static PyObject *pycvInitLineIterator(PyObject *self, PyObject *args)
+static PyObject *pycvInitLineIterator(PyObject *self, PyObject *args, PyObject *kw)
 {
+  const char *keywords[] = { "image", "pt1", "pt2", "connectivity", "left_to_right", NULL };
   CvArr *image;
   CvPoint pt1;
   CvPoint pt2;
   int connectivity = 8;
   int left_to_right = 0;
 
-  if (!PyArg_ParseTuple(args, "O&O&O&|ii",
+  if (!PyArg_ParseTupleAndKeywords(args, kw, "O&O&O&|ii", (char**)keywords,
                         convert_to_CvArr, &image,
                         convert_to_CvPoint, &pt1,
                         convert_to_CvPoint, &pt2,
@@ -2882,9 +3038,9 @@ static int cvarr_SetItem(PyObject *o, PyObject *key, PyObject *v)
 static PyObject *pycvSetData(PyObject *self, PyObject *args)
 {
   PyObject *o, *s;
-  int step = -1;
+  int step = CV_AUTO_STEP;
 
-  if (!PyArg_ParseTuple(args, "OOi", &o, &s, &step))
+  if (!PyArg_ParseTuple(args, "OO|i", &o, &s, &step))
     return NULL;
   if (is_iplimage(o)) {
     iplimage_t *ipl = (iplimage_t*)o;
@@ -3003,11 +3159,13 @@ static PyObject *pycvGetImage(PyObject *self, PyObject *args)
   return r;
 }
 
-static PyObject *pycvGetMat(PyObject *self, PyObject *args)
+static PyObject *pycvGetMat(PyObject *self, PyObject *args, PyObject *kw)
 {
+  const char *keywords[] = { "arr", "allowND", NULL };
   PyObject *o, *r;
+  int allowND = 0;
 
-  if (!PyArg_ParseTuple(args, "O", &o))
+  if (!PyArg_ParseTupleAndKeywords(args, kw, "O|i", (char**)keywords, &o, &allowND))
     return NULL;
   if (is_cvmat(o)) {
     r = o;
@@ -3017,7 +3175,7 @@ static PyObject *pycvGetMat(PyObject *self, PyObject *args)
     CvArr *cva;
     if (!convert_to_CvArr(o, &cva, "src"))
       return NULL;
-    ERRWRAP(cvGetMat(cva, m));
+    ERRWRAP(cvGetMat(cva, m, NULL, allowND));
 
     cvmat_t *om = PyObject_NEW(cvmat_t, &cvmat_Type);
     om->a = m;
@@ -3054,6 +3212,45 @@ static PyObject *pycvReshape(PyObject *self, PyObject *args)
   return (PyObject*)om;
 }
 
+static PyObject *pycvReshapeMatND(PyObject *self, PyObject *args)
+{
+  PyObject *o;
+  int new_cn = 0;
+  PyObject *new_dims = NULL;
+
+  if (!PyArg_ParseTuple(args, "OiO", &o, &new_cn, &new_dims))
+    return NULL;
+
+  CvMatND *cva;
+  if (!convert_to_CvMatND(o, &cva, "src"))
+    return NULL;
+  ints dims;
+  if (new_dims != NULL) {
+    if (!convert_to_ints(new_dims, &dims, "new_dims"))
+      return NULL;
+  }
+
+  if (new_cn == 0)
+    new_cn = CV_MAT_CN(cvGetElemType(cva));
+
+  int i;
+  int count = CV_MAT_CN(cvGetElemType(cva));
+  for (i = 0; i < cva->dims; i++)
+    count *= cva->dim[i].size;
+
+  int newcount = new_cn;
+  for (i = 0; i < dims.count; i++)
+    newcount *= dims.i[i];
+
+  if (count != newcount) {
+    PyErr_SetString(PyExc_TypeError, "Total number of elements must be unchanged");
+    return NULL;
+  }
+
+  CvMatND *pn = cvCreateMatNDHeader(dims.count, dims.i, CV_MAKETYPE(CV_MAT_TYPE(cva->type), new_cn));
+  return shareDataND(o, cva, pn);
+}
+
 static void OnMouse(int event, int x, int y, int flags, void* param)
 {
   PyGILState_STATE gstate;
@@ -3105,16 +3302,15 @@ void OnChange(int pos, void *param)
   PyGILState_Release(gstate);
 }
 
-static PyObject *pycvCreateTrackbar(PyObject *self, PyObject *args, PyObject *kw)
+static PyObject *pycvCreateTrackbar(PyObject *self, PyObject *args)
 {
-  const char *keywords[] = { "trackbar_name", "window_name", "value", "count", "on_change", NULL };
   PyObject *on_change;
   char* trackbar_name;
   char* window_name;
   int *value = new int;
   int count;
 
-  if (!PyArg_ParseTupleAndKeywords(args, kw, "ssiiO", (char**)keywords, &trackbar_name, &window_name, value, &count, &on_change))
+  if (!PyArg_ParseTuple(args, "ssiiO", &trackbar_name, &window_name, value, &count, &on_change))
     return NULL;
   if (!PyCallable_Check(on_change)) {
     PyErr_SetString(PyExc_TypeError, "on_change must be callable");
@@ -3168,7 +3364,7 @@ static PyObject *pycvApproxPoly(PyObject *self, PyObject *args, PyObject *kw)
   if (!convert_to_cvarrseq(pyobj_src_seq, &src_seq, "src_seq")) return NULL;
   if (!convert_to_CvMemStorage(pyobj_storage, &storage, "storage")) return NULL;
   CvSeq* r;
-  ERRWRAP(r = cvApproxPoly(src_seq.v, header_size, storage, method, parameter, parameter2));
+  ERRWRAP(r = cvApproxPoly(src_seq.mat, header_size, storage, method, parameter, parameter2));
   return FROM_CvSeqPTR(r);
 }
 
@@ -3260,7 +3456,7 @@ static PyObject *pycvSubdiv2DLocate(PyObject *self, PyObject *args)
   default:
     return (PyObject*)failmsg("Unexpected loc from cvSubdiv2DLocate");
   }
-  return Py_BuildValue("iO", (int)loc, r);;
+  return Py_BuildValue("iO", (int)loc, r);
 }
 
 static PyObject *pycvCalcOpticalFlowPyrLK(PyObject *self, PyObject *args)
@@ -3329,7 +3525,9 @@ static PyObject *pycvCalcOpticalFlowPyrLK(PyObject *self, PyObject *args)
   return Py_BuildValue("NNN", FROM_cvpoint2d32f_count(r0), FROM_chars(r1), FROM_floats(r2));
 }
 
-static PyObject *pycvClipLine(PyObject *self, PyObject *args, PyObject *kw)
+// pt1,pt2 are input and output arguments here
+
+static PyObject *pycvClipLine(PyObject *self, PyObject *args)
 {
   CvSize img_size;
   PyObject *pyobj_img_size = NULL;
@@ -3450,7 +3648,20 @@ static PyObject *shareData(PyObject *donor, CvArr *pdonor, CvMat *precipient)
   return recipient;
 }
 
-static PyObject *pycvGetHuMoments(PyObject *self, PyObject *args, PyObject *kw)
+static PyObject *shareDataND(PyObject *donor, CvMatND *pdonor, CvMatND *precipient)
+{
+  PyObject *recipient = (PyObject*)PyObject_NEW(cvmatnd_t, &cvmatnd_Type);
+  ((cvmatnd_t*)recipient)->a = precipient;
+  ((cvmatnd_t*)recipient)->offset = 0;
+
+  PyObject *arr_data;
+  arr_data = ((cvmatnd_t*)donor)->data;
+  ((cvmatnd_t*)recipient)->data = arr_data;
+  Py_INCREF(arr_data);
+  return recipient;
+}
+
+static PyObject *pycvGetHuMoments(PyObject *self, PyObject *args)
 {
   CvMoments* moments;
   PyObject *pyobj_moments = NULL;
@@ -3463,7 +3674,7 @@ static PyObject *pycvGetHuMoments(PyObject *self, PyObject *args, PyObject *kw)
   return Py_BuildValue("ddddddd", r.hu1, r.hu2, r.hu3, r.hu4, r.hu5, r.hu6, r.hu7);
 }
 
-static PyObject *pycvFitLine(PyObject *self, PyObject *args, PyObject *kw)
+static PyObject *pycvFitLine(PyObject *self, PyObject *args)
 {
   cvarrseq points;
   PyObject *pyobj_points = NULL;
@@ -3476,10 +3687,10 @@ static PyObject *pycvFitLine(PyObject *self, PyObject *args, PyObject *kw)
   if (!PyArg_ParseTuple(args, "Oifff", &pyobj_points, &dist_type, &param, &reps, &aeps))
     return NULL;
   if (!convert_to_cvarrseq(pyobj_points, &points, "points")) return NULL;
-  ERRWRAP(cvFitLine(points.v, dist_type, param, reps, aeps, r));
+  ERRWRAP(cvFitLine(points.mat, dist_type, param, reps, aeps, r));
   int dimension;
-  if (strcmp("opencv-matrix", cvTypeOf(points.v)->type_name) == 0)
-    dimension = CV_MAT_CN(cvGetElemType(points.v));
+  if (strcmp("opencv-matrix", cvTypeOf(points.mat)->type_name) == 0)
+    dimension = CV_MAT_CN(cvGetElemType(points.mat));
   else {
     // sequence case... don't think there is a sequence of 3d points,
     // so assume 2D
@@ -3491,7 +3702,7 @@ static PyObject *pycvFitLine(PyObject *self, PyObject *args, PyObject *kw)
     return Py_BuildValue("dddddd", r[0], r[1], r[2], r[3], r[4], r[5]);
 }
 
-static PyObject *pycvGetMinMaxHistValue(PyObject *self, PyObject *args, PyObject *kw)
+static PyObject *pycvGetMinMaxHistValue(PyObject *self, PyObject *args)
 {
   CvHistogram* hist;
   PyObject *pyobj_hist = NULL;
@@ -3550,8 +3761,8 @@ static int zero = 0;
 /* Custom Validators */
 
 #define CVPY_VALIDATE_DrawChessboardCorners() do { \
-  if ((pattern_size.width * pattern_size.height) != corners.count) \
-    return (PyObject*)failmsg("Size is %dx%d, but corner list is length %d", pattern_size.width, pattern_size.height, corners.count); \
+  if ((patternSize.width * patternSize.height) != corners.count) \
+    return (PyObject*)failmsg("Size is %dx%d, but corner list is length %d", patternSize.width, patternSize.height, corners.count); \
   } while (0)
 
 #define cvGetRotationMatrix2D cv2DRotationMatrix
@@ -3559,39 +3770,18 @@ static int zero = 0;
 /************************************************************************/
 /* Generated functions */
 
+#define constCvMat const CvMat
+#define FROM_constCvMatPTR(x) FROM_CvMatPTR((CvMat*)x)
+
+
 #include "generated0.i"
 
 static PyMethodDef methods[] = {
 
-  {"CreateHist", pycvCreateHist, METH_VARARGS, "CreateHist(dims, type, ranges, uniform = 1) -> hist"},
-  {"CreateImage", pycvCreateImage, METH_VARARGS, "CreateImage(size, depth, channels) -> image"},
-  {"CreateImageHeader", pycvCreateImageHeader, METH_VARARGS, "CreateImageHeader(size, depth, channels) -> image"},
-  {"CreateMat", pycvCreateMat, METH_VARARGS, "CreateMat(row, cols, type) -> mat"},
-  {"CreateMatHeader", pycvCreateMatHeader, METH_VARARGS, "CreateMatHeader(rows, cols, type) -> mat"},
-  {"CreateMatND", pycvCreateMatND, METH_VARARGS, "CreateMatND(dims, type) -> matnd"},
-  {"CreateMatNDHeader", pycvCreateMatNDHeader, METH_VARARGS, "CreateMatNDHeader(dims, type) -> matnd"},
-  {"CreateMemStorage", pycvCreateMemStorage, METH_VARARGS, "CreateMemStorage(block_size) -> memstorage"},
-  {"FindContours", (PyCFunction)pycvFindContours, METH_KEYWORDS, "FindContours(image, storage, mode=CV_RETR_LIST, method=CV_CHAIN_APPROX_SIMPLE, offset=(0, 0)) -> cvseq"},
-  {"ApproxPoly", (PyCFunction)pycvApproxPoly, METH_KEYWORDS, "ApproxPoly(src_seq, storage, method, parameter=0, parameter2=0) -> None"},
-  {"CreateData", pycvCreateData, METH_VARARGS, "CreateData(arr) -> None"},
-  {"GetDims", pycvGetDims, METH_VARARGS, "GetDims(arr) -> dims"},
-  {"GetImage", pycvGetImage, METH_VARARGS, "GetImage(cvmat) -> image"},
-  {"GetMat", pycvGetMat, METH_VARARGS, "GetMat(image) -> cvmat"},
-  {"Reshape", pycvReshape, METH_VARARGS, "Reshape(arr, new_cn, new_rows=0) -> cvmat"},
-  {"InitLineIterator", pycvInitLineIterator, METH_VARARGS, "InitLineIterator(image, pt1, pt2, connectivity=8, left_to_right=0) -> None"},
-  {"LoadImage", (PyCFunction)pycvLoadImage, METH_KEYWORDS, "LoadImage(filename, iscolor=CV_LOAD_IMAGE_COLOR)"},
-  {"SetData", pycvSetData, METH_VARARGS, "SetData(arr, data, step)"},
-  {"SetMouseCallback", (PyCFunction)pycvSetMouseCallback, METH_KEYWORDS, "SetMouseCallback(window_name, on_mouse, param) -> None"},
-  {"CreateTrackbar", (PyCFunction)pycvCreateTrackbar, METH_KEYWORDS, "CreateTrackbar(trackbar_name, window_name, value, count, on_change) -> None"},
-  {"CalcEMD2", (PyCFunction)pycvCalcEMD2, METH_KEYWORDS, "CalcEMD2(signature1, signature2, distance_type, distance_func = None, cost_matrix=None, flow=None, lower_bound=None, userdata = None) -> float"},
-  {"FindChessboardCorners", (PyCFunction)pycvFindChessboardCorners, METH_KEYWORDS, "FindChessboardCorners(image, pattern_size, flags=CV_CALIB_CB_ADAPTIVE_THRESH) -> success,corners"},
-  {"FitLine", (PyCFunction)pycvFitLine, METH_KEYWORDS, "FitLine(points, dist_type, param, reps, aeps) -> line"},
-  {"Subdiv2DLocate", pycvSubdiv2DLocate, METH_VARARGS, "Subdiv2DLocate(subdiv, pt) -> (loc, where)"},
-  {"CalcOpticalFlowPyrLK", pycvCalcOpticalFlowPyrLK, METH_VARARGS, "CalcOpticalFlowPyrLK(prev, curr, prev_pyr, curr_pyr, prev_features, CvSize win_size, int level, criteria, flags, guesses = None) -> (curr_features, status, track_error)"},
-  {"ClipLine", (PyCFunction)pycvClipLine, METH_KEYWORDS, "ClipLine(img, pt1, pt2) -> (clipped_pt1, clipped_pt2)"},
-  {"GetHuMoments", (PyCFunction)pycvGetHuMoments, METH_KEYWORDS, "GetHuMoments(cvmoments) -> (h1, h2, h3, h4, h5, h5, h7)"},
-  {"GetMinMaxHistValue", (PyCFunction)pycvGetMinMaxHistValue, METH_KEYWORDS, "GetMinMaxHistValue(hist) -> min_val,max_val,min_loc,max_loc"},
-  {"WaitKey", (PyCFunction)pycvWaitKey, METH_KEYWORDS, "WaitKey(delay=0) -> int"},
+#if PYTHON_USE_NUMPY
+  {"fromarray", (PyCFunction)pycvfromarray, METH_KEYWORDS, "fromarray(array) -> cvmatnd"},
+#endif
+
   //{"CalcOpticalFlowFarneback", (PyCFunction)pycvCalcOpticalFlowFarneback, METH_KEYWORDS, "CalcOpticalFlowFarneback(prev, next, flow, pyr_scale=0.5, levels=3, win_size=15, iterations=3, poly_n=7, poly_sigma=1.5, flags=0) -> None"},
   //{"_HOGComputeDescriptors", (PyCFunction)pycvHOGComputeDescriptors, METH_KEYWORDS, "_HOGComputeDescriptors(image, win_stride=block_stride, locations=None, padding=(0,0), win_size=(64,128), block_size=(16,16), block_stride=(8,8), cell_size=(8,8), nbins=9, gammaCorrection=true) -> list_of_descriptors"},
   //{"_HOGDetect", (PyCFunction)pycvHOGDetect, METH_KEYWORDS, "_HOGDetect(image, svm_classifier, win_stride=block_stride, locations=None, padding=(0,0), win_size=(64,128), block_size=(16,16), block_stride=(8,8), cell_size=(8,8), nbins=9, gammaCorrection=true) -> list_of_points"},
@@ -3627,36 +3817,40 @@ void initcv()
 
   cvSetErrMode(CV_ErrModeParent);
 
-  MKTYPE(cvcapture);
   MKTYPE(cvcontourtree);
   MKTYPE(cvfont);
-  MKTYPE(cvhaarclassifiercascade);
   MKTYPE(cvhistogram);
   MKTYPE(cvlineiterator);
   MKTYPE(cvmat);
   MKTYPE(cvmatnd);
   MKTYPE(cvmemstorage);
   MKTYPE(cvmoments);
-  MKTYPE(cvpositobject);
   MKTYPE(cvsubdiv2dedge);
   MKTYPE(cvrng);
   MKTYPE(cvseq);
   MKTYPE(cvset);
   MKTYPE(cvsubdiv2d);
   MKTYPE(cvsubdiv2dpoint);
-  MKTYPE(cvvideowriter);
-  MKTYPE(iplconvkernel);
   MKTYPE(iplimage);
   MKTYPE(memtrack);
 
+#include "generated4.i"
+
   m = Py_InitModule(MODULESTR"", methods);
   d = PyModule_GetDict(m);
 
   opencv_error = PyErr_NewException((char*)MODULESTR".error", NULL, NULL);
   PyDict_SetItemString(d, "error", opencv_error);
 
-  PyDict_SetItemString(d, "iplimage", (PyObject*)&iplimage_Type);
-  PyDict_SetItemString(d, "cvmat", (PyObject*)&cvmat_Type);
+  // Couple of warnings about strict aliasing here.  Not clear how to fix.
+  union {
+    PyObject *o;
+    PyTypeObject *to;
+  } convert;
+  convert.to = &iplimage_Type;
+  PyDict_SetItemString(d, "iplimage", convert.o);
+  convert.to = &cvmat_Type;
+  PyDict_SetItemString(d, "cvmat", convert.o);
 
 #define PUBLISH(I) PyDict_SetItemString(d, #I, PyInt_FromLong(I))
 #define PUBLISHU(I) PyDict_SetItemString(d, #I, PyLong_FromUnsignedLong(I))
@@ -3674,30 +3868,37 @@ void initcv()
   PUBLISH(CV_LOAD_IMAGE_UNCHANGED);
   PUBLISH(CV_HIST_ARRAY);
   PUBLISH(CV_HIST_SPARSE);
+  PUBLISH(CV_8U);
   PUBLISH(CV_8UC1);
   PUBLISH(CV_8UC2);
   PUBLISH(CV_8UC3);
   PUBLISH(CV_8UC4);
+  PUBLISH(CV_8S);
   PUBLISH(CV_8SC1);
   PUBLISH(CV_8SC2);
   PUBLISH(CV_8SC3);
   PUBLISH(CV_8SC4);
+  PUBLISH(CV_16U);
   PUBLISH(CV_16UC1);
   PUBLISH(CV_16UC2);
   PUBLISH(CV_16UC3);
   PUBLISH(CV_16UC4);
+  PUBLISH(CV_16S);
   PUBLISH(CV_16SC1);
   PUBLISH(CV_16SC2);
   PUBLISH(CV_16SC3);
   PUBLISH(CV_16SC4);
+  PUBLISH(CV_32S);
   PUBLISH(CV_32SC1);
   PUBLISH(CV_32SC2);
   PUBLISH(CV_32SC3);
   PUBLISH(CV_32SC4);
+  PUBLISH(CV_32F);
   PUBLISH(CV_32FC1);
   PUBLISH(CV_32FC2);
   PUBLISH(CV_32FC3);
   PUBLISH(CV_32FC4);
+  PUBLISH(CV_64F);
   PUBLISH(CV_64FC1);
   PUBLISH(CV_64FC2);
   PUBLISH(CV_64FC3);