Here is the opencv code i'm trying to convert to lisp
int size[] = { 5, 5, 5 };
CvMatND* b = cvCreateMatND(3, size, CV_32F);
cvSetZero(b);
int a=0;
for (int x = 0; x < b->dim[0].size; x++)
{
for (int y = 0; y < b->dim[1].size; y++)
{
for (int z = 0; z < b->dim[2].size; z++)
{ a++;
cvSet3D(b, x,y,z, cvScalar(a));
}
}
}
in the code above it creates a 3 dimensional matrix and adds data to it in the for loop
in the loop the code accesses the sizes of each dimension of the 3d matrix with dim[0].size dim[1].size and dim[2].size
I'm trying to do the same in lisp....I created wrappers for the structs and the c function below and tried everything i could from nested with-foreign-slots to access the members of dim to mem-reffing and mem-areffing the out put of dims....the most i got was a plist for dim (STEP 100 SIZE 5) when i accessed the cv-mat-nd-dim struct with with-foreign-slots inside a with-foreign-slots for MATRIX i set with this
(defparameter matrix (create-mat-nd 3 '(5 5 5 ) +32fc1+))
but it has only 1 item in it, in c you can access an infinite number because its an nd matrix
(cffi:defcunion cv-mat-nd-data
(ptr :pointer)
(fl :pointer)
(db :pointer)
(i :pointer)
(s :pointer))
(cffi:defcstruct cv-mat-nd-dim
(size :int)
(step :int))
;; ;(cffi:foreign-type-size '(:struct cv-mat-nd)) = todo - doesn't work cv-mat-nd = 40 opencv's = 288
(cffi:defcstruct cv-mat-nd
(type :int)
(dims :int)
(refcount :pointer)
(hdr-refcount :int)
(data (:union cv-mat-nd-data))
(dim (:pointer (:struct cv-mat-nd-dim))))
;; CvMatND* cvCreateMatND(int dims, const int* sizes, int type)
(cffi:defcfun ("cvCreateMatND" %create-mat-nd) (:pointer (:struct cv-mat-nd))
"Creates the header and allocates the data for a multi-dimensional dense array."
(dims :int)
(sizes :pointer)
(type :int))
(defun create-mat-nd (dims sizes type)
"Return a specific element of single-channel nD array."
(%create-mat-nd dims
(cffi:foreign-alloc :int :initial-contents sizes) type))