/* These functions need the SWIG_* functions defined in the wrapper */ %{ static inline bool OctSwigObject_Check(const octave_value& ov) { return ov.type_id()==octave_swig_ref::static_type_id(); } static CvArr * OctObject_to_CvArr(octave_value obj, bool * freearg); static CvArr * OctSequence_to_CvArr( octave_value obj ); // convert a octave sequence/array/list object into a c-array #define OctObject_AsArrayImpl(func, ctype, ptype) \ int func(octave_value obj, ctype * array, int len){ \ void * mat_vptr=NULL; \ void * im_vptr=NULL; \ if(OctNumber_Check(obj)){ \ memset( array, 0, sizeof(ctype)*len ); \ array[0] = OctObject_As##ptype( obj ); \ } \ else if(OctList_Check(obj) || OctTuple_Check(obj)){ \ int seqsize = OctSequence_Size(obj); \ for(int i=0; irows!=1 && mat->cols!=1 ){ \ error("OctObject_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) ){ \ error("OctObject_As*Array: CvArr channels != length" ); \ return -1; \ } \ val = cvGet1D(mat, 0); \ for(int i=0; irows*mat->cols); \ if( mat->rows != len ){ \ error("OctObject_As*Array: CvArr rows or cols must equal length" ); \ return -1; \ } \ for(int i=0; ival[0], scalar->val[1] )); } if(OctObject_AsLongArray(obj, (int *) &val, 2) != -1){ return val; } error("could not convert to CvPoint"); return cvPoint(0,0); } static CvPoint2D32f OctObject_to_CvPoint2D32f(octave_value 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(OctObject_AsFloatArray(obj, (float *) &val, 2) != -1){ return val; } error("could not convert to CvPoint2D32f"); return cvPoint2D32f(0,0); } static CvScalar OctObject_to_CvScalar(octave_value 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(OctObject_AsDoubleArray(obj, val.val, 4)!=-1){ return val; } return cvScalar(-1,-1,-1,-1); } // if octave sequence type, convert to CvMat or CvMatND static CvArr * OctObject_to_CvArr(octave_value obj, bool * freearg){ CvArr * cvarr; *freearg = false; // check if OpenCV type if ( OctSwigObject_Check(obj) ){ SWIG_ConvertPtr(obj, &cvarr, 0, SWIG_POINTER_EXCEPTION); } else if (OctList_Check(obj) || OctTuple_Check(obj)){ cvarr = OctSequence_to_CvArr( obj ); *freearg = (cvarr != NULL); } else if (OctLong_Check(obj) && OctLong_AsLong(obj)==0){ return NULL; } else { SWIG_ConvertPtr(obj, (void**)&cvarr, 0, SWIG_POINTER_EXCEPTION); } return cvarr; } static int OctObject_GetElemType(octave_value 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(OctTuple_Check(obj) || OctList_Check(obj)) return CV_MAKE_TYPE(CV_32F, OctSequence_Size( obj )); if(OctLong_Check(obj)) return CV_32S; return CV_32F; } // Would like this to convert Octave lists to CvMat // Also lists of CvPoints, CvScalars, CvMats? etc static CvArr * OctSequence_to_CvArr( octave_value obj ){ int dims[CV_MAX_DIM] = {1,1,1}; int ndim=0; int cvtype; octave_value item; // figure out dimensions for(item = obj; (OctTuple_Check(item) || OctList_Check(item)); item = OctSequence_GetItem(item, 0)) { dims[ndim] = OctSequence_Size( item ); ndim++; } if(ndim==0){ error("Cannot convert an empty octave object to a CvArr"); return NULL; } cvtype = OctObject_GetElemType(item); // collapse last dim into NCH if we found a single channel, but the last dim is <=3 if(CV_MAT_CN(cvtype)==1 && dims[ndim-1]>1 && dims[ndim-1]<4){ cvtype=CV_MAKE_TYPE(cvtype, dims[ndim-1]); dims[ndim-1]=1; ndim--; } if(cvtype==-1){ error("Could not determine OpenCV element type of Octave sequence"); return NULL; } // CvMat if(ndim<=2){ CvMat *m = cvCreateMat(dims[0], dims[1], cvtype); for(int i=0; i 1 ){ // double check size assert((OctTuple_Check(rowobj) || OctList_Check(rowobj)) && OctSequence_Size(rowobj) == dims[1]); for(int j=0; j 3"); return NULL; } %}