/* These functions need the SWIG_* functions defined in the wrapper */ %{ #include "pyhelpers.h" static CvArr * PyObject_to_CvArr(PyObject * obj, bool * freearg); // convert a python sequence/array/list object into a c-array #define PyObject_AsArrayImpl(func, ctype, ptype) \ int func(PyObject * obj, ctype * array, int len){ \ void * mat_vptr=NULL; \ void * im_vptr=NULL; \ if(PyNumber_Check(obj)){ \ memset( array, 0, sizeof(ctype)*len ); \ array[0] = PyObject_As##ptype( obj ); \ } \ else if(PyList_Check(obj) || PyTuple_Check(obj)){ \ int seqsize = PySequence_Size(obj); \ for(int i=0; irows!=1 && mat->cols!=1 ){ \ PyErr_SetString( PyExc_TypeError, \ "PyObject_As*Array: CvArr must be row or column vector" ); \ return -1; \ } \ if( mat->rows==1 && mat->cols==1 ){ \ CvScalar val; \ if( len!=CV_MAT_CN(mat->type) ){ \ PyErr_SetString( PyExc_TypeError, \ "PyObject_As*Array: CvArr channels != length" ); \ return -1; \ } \ val = cvGet1D(mat, 0); \ for(int i=0; irows*mat->cols); \ if( mat->rows != len ){ \ PyErr_SetString( PyExc_TypeError, \ "PyObject_As*Array: CvArr rows or cols must equal length" ); \ return -1; \ } \ for(int i=0; ival[0], scalar->val[1] )); } if(PyObject_AsLongArray(obj, (int *) &val, 2) != -1){ return val; } PyErr_SetString( PyExc_TypeError, "could not convert to CvPoint"); return cvPoint(0,0); } static CvPoint2D32f PyObject_to_CvPoint2D32f(PyObject * obj){ CvPoint2D32f val; CvPoint2D32f *ptr2D32f; CvPoint *ptr; CvScalar * scalar; if( SWIG_ConvertPtr(obj, (void**)&ptr2D32f, SWIGTYPE_p_CvPoint2D32f, 0) != -1) { return *ptr2D32f; } if( SWIG_ConvertPtr(obj, (void**)&ptr, SWIGTYPE_p_CvPoint, 0) != -1) { return cvPointTo32f(*ptr); } if( SWIG_ConvertPtr(obj, (void**)&scalar, SWIGTYPE_p_CvScalar, 0) != -1) { return cvPoint2D32f( scalar->val[0], scalar->val[1] ); } if(PyObject_AsFloatArray(obj, (float *) &val, 2) != -1){ return val; } PyErr_SetString(PyExc_TypeError, "could not convert to CvPoint2D32f"); return cvPoint2D32f(0,0); } /* Check if this object can be interpreted as a CvScalar */ static bool CvScalar_Check(PyObject * obj){ void * vptr; CvScalar val; return SWIG_ConvertPtr(obj, &vptr, SWIGTYPE_p_CvScalar, 0 ) != -1 || SWIG_ConvertPtr(obj, &vptr, SWIGTYPE_p_CvPoint2D32f, 0 ) != -1 || SWIG_ConvertPtr(obj, &vptr, SWIGTYPE_p_CvPoint, 0 ) != -1 || PyObject_AsDoubleArray(obj, val.val, 4) !=-1; } static CvScalar PyObject_to_CvScalar(PyObject * obj){ CvScalar val; CvScalar * ptr; CvPoint2D32f *ptr2D32f; CvPoint *pt_ptr; void * vptr; if( SWIG_ConvertPtr(obj, &vptr, SWIGTYPE_p_CvScalar, 0 ) != -1) { ptr = (CvScalar *) vptr; return *ptr; } if( SWIG_ConvertPtr(obj, (void**)&ptr2D32f, SWIGTYPE_p_CvPoint2D32f, 0) != -1) { return cvScalar(ptr2D32f->x, ptr2D32f->y); } if( SWIG_ConvertPtr(obj, (void**)&pt_ptr, SWIGTYPE_p_CvPoint, 0) != -1) { return cvScalar(pt_ptr->x, pt_ptr->y); } if(PyObject_AsDoubleArray(obj, val.val, 4)!=-1){ return val; } return cvScalar(-1,-1,-1,-1); } static int CvArr_Check( PyObject * obj ) { void *ptr; if( obj == Py_None || SWIG_IsOK( SWIG_ConvertPtr(obj, &ptr, SWIGTYPE_p_void, 0) ) || SWIG_IsOK( SWIG_ConvertPtr(obj, &ptr, SWIGTYPE_p_CvMat, 0) ) || SWIG_IsOK( SWIG_ConvertPtr(obj, &ptr, SWIGTYPE_p_CvSeq, 0) ) || SWIG_IsOK( SWIG_ConvertPtr(obj, &ptr, SWIGTYPE_p_CvContour, 0) ) || SWIG_IsOK( SWIG_ConvertPtr(obj, &ptr, SWIGTYPE_p_CvSparseMat, 0) ) || SWIG_IsOK( SWIG_ConvertPtr(obj, &ptr, SWIGTYPE_p_CvMatND, 0) ) || PyObject_HasAttrString(obj, "__array_interface__") || PySequence_Check(obj) ) { return 1; } PyErr_Clear(); return 0; } /* if python sequence type, convert to CvMat or CvMatND */ static CvArr * PyObject_to_CvArr (PyObject * obj, bool * freearg) { CvArr * cvarr = NULL; *freearg = false; if ( obj == Py_None ) { // Interpret None as NULL pointer return NULL; } else if( SWIG_IsOK( SWIG_ConvertPtr(obj, (void **)& cvarr, SWIGTYPE_p_void, 0) ) || SWIG_IsOK( SWIG_ConvertPtr (obj, (void** )& cvarr, SWIGTYPE_p_CvMat, 0) ) || SWIG_IsOK( SWIG_ConvertPtr (obj, (void **)& cvarr, SWIGTYPE_p_CvSeq, 0) ) || SWIG_IsOK( SWIG_ConvertPtr (obj, (void **)& cvarr, SWIGTYPE_p_CvContour, 0) ) || SWIG_IsOK( SWIG_ConvertPtr (obj, (void **)& cvarr, SWIGTYPE_p_CvSparseMat, 0) ) || SWIG_IsOK( SWIG_ConvertPtr (obj, (void **)& cvarr, SWIGTYPE_p_CvMatND, 0) )) { // we got a directly wrapped void * pointer, OpenCV array or sequence type return cvarr; } else if (PyObject_HasAttrString (obj, "__array_interface__")) { // if we didn't get our own datatype, let's see if it supports the array protocol // array protocol is great because we just have to create another header but can // use the original data without copying cvarr = PyArray_to_CvArr (obj); *freearg = (cvarr != NULL); } else if (PySequence_Check (obj)) { // our next bet is a tuple or list of tuples or lists this has to be copied over, however cvarr = PySequence_to_CvArr (obj); *freearg = (cvarr != NULL); } else if (PyLong_Check (obj) && PyLong_AsLong (obj) == 0) { // Interpret a '0' integer as a NULL pointer * freearg = false; return NULL; } else { // TODO, throw an error here return NULL; } return cvarr; } static int PyObject_GetElemType(PyObject * obj){ void *vptr; if(SWIG_ConvertPtr(obj, &vptr, SWIGTYPE_p_CvPoint, 0) != -1) return CV_32SC2; if(SWIG_ConvertPtr(obj, &vptr, SWIGTYPE_p_CvSize, 0) != -1) return CV_32SC2; if(SWIG_ConvertPtr(obj, &vptr, SWIGTYPE_p_CvRect, 0) != -1) return CV_32SC4; if(SWIG_ConvertPtr(obj, &vptr, SWIGTYPE_p_CvSize2D32f, 0) != -1) return CV_32FC2; if(SWIG_ConvertPtr(obj, &vptr, SWIGTYPE_p_CvPoint2D32f, 0) != -1) return CV_32FC2; if(SWIG_ConvertPtr(obj, &vptr, SWIGTYPE_p_CvPoint3D32f, 0) != -1) return CV_32FC3; if(SWIG_ConvertPtr(obj, &vptr, SWIGTYPE_p_CvPoint2D64f, 0) != -1) return CV_64FC2; if(SWIG_ConvertPtr(obj, &vptr, SWIGTYPE_p_CvPoint3D64f, 0) != -1) return CV_64FC3; if(SWIG_ConvertPtr(obj, &vptr, SWIGTYPE_p_CvScalar, 0) != -1) return CV_64FC4; if(PyTuple_Check(obj) || PyList_Check(obj)) return CV_MAKE_TYPE(CV_32F, PySequence_Size( obj )); if(PyLong_Check(obj)) return CV_32S; return CV_32F; } %}