Comment retourner une structure de masortingce à partir d’une fonction mex?

J’ai une structure qui définit un tableau 3D, la taille est connue:

struct uchar3 { unsigned char x, y, z; }; 

et je veux le retourner via la fonction mex afin de l’utiliser dans matlab comme un tableau sortingdimensionnel, comme une image. Comment cela peut-il être fait?

MODIFIER:

Ceci est en dehors de la fonction que j’utilise.

 foo(uchar3 **imagePtr, Mat Im){ unsigned char *cvPtr = Im.ptr(0); for (size_t i = 0; i < Im.rows * Im.cols; ++i) { (*imagePtr)[i].x = cvPtr[3 * i + 0]; (*imagePtr)[i].y = cvPtr[3 * i + 1]; (*imagePtr)[i].z = cvPtr[3 * i + 2]; } } 

Code de Shai:

 cv::Mat imageRGB; cv::cvtColor(OutPutMat, imageRGB, CV_BGR2RGB); // uc3 is populated here mwSize sz[3]; sz[0] = imageRGB.rows; // matlab is row first sz[1] = imageRGB.cols; sz[2] = 3; plhs[0] = mxCreateNumericArray( 3, sz, mxDOUBLE_CLASS, // create double array, you can change the type here mxREAL ); // create real masortingx float *cvPtr = imageRGB.ptr(0); float* p = (float*)mxGetData(plhs[0]); // get a pointer to actual data for ( size_t y = 0 ; y < imageRGB.rows ; y++ ) { for ( size_t x = 0; x < imageRGB.cols ; x++ ) { int i = y * imageRGB.cols + x; // opencv is col first p[ x * imageRGB.rows + y ] = cvPtr[3 * i + 0]; p[ imageRGB.cols * imageRGB.rows + x * imageRGB.rows + y ] = cvPtr[3 * i + 1]; p[ 2*imageRGB.cols * imageRGB.rows + x * imageRGB.rows + y ] = cvPtr[3 * i + 2]; } } 

Vous devez utiliser mxCreateNumericArray

 uchar3 uc3; // uc3 is populated here mwSize sz[3]; sz[0] = Im.rows; // matlab is row first sz[1] = Im.cols; sz[2] = 3; mxArray* pOut = mxCreateNumericArray( 3, sz, mxDOUBLE_CLASS // create double array, you can change the type here mxREAL ); // create real masortingx double* p = (double*)mxGetData(pOut); // get a pointer to actual data for ( size_t y = 0 ; y < Im.rows ; y++ ) { for ( size_t x = 0; x < Im.cols ; x++ ) { int i = y * Im.cols + x; // opencv is col first p[ x * Im.rows + y ] = cvPtr[3 * i + 0]; p[ Im.cols*Im.rows + x * Im.rows + y ] = cvPtr[3 * i + 1]; p[ 2*Im.cols*Im.rows + x * Im.rows + y ] = cvPtr[3 * i + 2]; } } // set one of your mexFunction's outputs to pOut 

Dans votre fonction mex, procédez comme suit:

 plhs[0] = valueStruct(Test,Test2); 

Où ValueStruct est une fonction

 mxArray* valueStruct(const double& d,const double& d2) { mxArray* p = mxCreateStructMasortingx(1,1,2,_fieldnames); if (!p) mexErrMsgIdAndTxt("error","Allocation error"); mxSetField(p,0,"d",mxArray(d)); mxSetField(p,0,"d2",mxArray(d2)); return p; } 

Vous pouvez vous référer à la documentation de mxCreateStructMasortingx pour plus d’informations.

Et pour mxSetField .

Pour un exemple, vous pouvez vous référer à mexopencv qui crée struct avec sa classe mxArray où vous pouvez obtenir ici .