如何从MEX函数返回一个矩阵结构? [英] How to return a matrix structure from a mex function?
本文介绍了如何从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屋!
查看全文