如何从MEX函数返回一个矩阵结构? [英] How to return a matrix structure from a mex function?

查看:329
本文介绍了如何从MEX函数返回一个矩阵结构?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个定义的3D阵列的结构,尺寸是已知的:

 结构uchar3
{
  unsigned char型X,Y,Z;
};

和我想通过MEX功能,以使用MATLAB中像一个三维阵列,像一个形象归还。如何才能做到这一点?

编辑:

这是我除了使用功能。

 美孚(uchar3 ** imagePtr,垫林){
无符号字符* cvPtr = Im.ptr< unsigned char型>(0);
    用于(为size_t我= 0; I< Im.rows * Im.cols; ++ I){
        (* imagePtr)[我] .X = cvPtr [3 * I + 0];
        (* imagePtr)[我] .Y = cvPtr [3 * I + 1];
        (* imagePtr)[我] .Z = cvPtr [3 * I + 2];
    }
}

夏嘉曦的code:

  CV ::垫imageRGB;
    CV :: cvtColor(OutPutMat,imageRGB,CV_BGR2RGB);    // UC3这里填充
    mwSize SZ [3];
    SZ [0] = imageRGB.rows; // MATLAB是排第一
    SZ [1] = imageRGB.cols;
    SZ [2] = 3;
    plhs [0] = mxCreateNumericArray(3,SZ,mxDOUBLE_CLASS,//创建双阵列,您可以在此更改类型
        mxREAL); //创建真正的矩阵
    浮动* cvPtr = imageRGB.ptr<浮动>(0);
    浮* P =(浮点*)mxGetData(plhs [0]); //得到一个指向实际数据
    用于(为size_t Y = 0; Y< imageRGB.rows; Y ++){
        为(为size_t X = 0; X&下; imageRGB.cols; X ++){
            INT I = Y * imageRGB.cols + X; // OpenCV的是第一关口
            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];
        }
    }


解决方案

您需要使用的 mxCreateNumericArray

  uchar3 UC3;
// UC3这里填充
mwSize SZ [3];
SZ [0] = Im.rows; // MATLAB是排第一
SZ [1] = Im.cols;
SZ [2] = 3;
mxArray * POUT = mxCreateNumericArray(3,SZ,mxDOUBLE_CLASS //创建双阵列,您可以在此更改类型
                                      mxREAL); //创建真正的矩阵
双* P =(双*)mxGetData(POUT); //得到一个指向实际数据
用于(为size_t Y = 0; Y< Im.rows; Y ++){
    为(为size_t X = 0; X&下; Im.cols; X ++){
        INT I = Y * Im.cols + X; // OpenCV的是第一关口
        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];
    }
}
//设置mexFunction的成果之一噘嘴

I have a struct that defines a 3d array, the size is known:

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

and I want to return it via mex function in order to use it in matlab like a three dimensional array, like an image. How can this be done?

EDIT:

This is apart of the function I use.

foo(uchar3 **imagePtr, Mat Im){
unsigned char *cvPtr = Im.ptr<unsigned char>(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];
    }
}

Shai's code:

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 matrix
    float *cvPtr = imageRGB.ptr<float>(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];
        }
    }

解决方案

You need to use 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 matrix
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

这篇关于如何从MEX函数返回一个矩阵结构?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆