为什么mxarray转换为opencv中的mat生成的图像是乱的,代码如下:
main函数的部分代码:
mxArray *Output[4] = {NULL};
mlxColAdjCloning(4,Output,3,Input);
Mat alphaImg;
ImgClon.mxarray2mat(Output[0],alphaImg);
imwrite(folder+"alphaImg.jpg",alphaImg);
其中mxarray2mat为mxarray转换为opencv中的mat的函数,代码如下:
void MyImageCloning::mxarray2mat(const mxArray *arr,Mat &img)
{
mwSize n = mxGetNumberOfDimensions(arr);
unsigned long M = mxGetM(arr);
unsigned long N = mxGetN(arr);
uchar *imgData = NULL;
if (n == 2)//mxIsUint8(arr) &&
{
imgData = (uchar *)mxGetPr(arr);
unsigned long h = M;
unsigned long w = N;
Mat tempimg(h, w, CV_8UC1);
size_t subs[2]; // 单通道图像
for (unsigned long i = 0; i < h; i++)
{
subs[0] = i;
for (unsigned long j = 0; j < w; j++)
{
subs[1] = j;
mwIndex index = mxCalcSingleSubscript(arr, 2, subs);
tempimg.row(i).col(j).data[0] = imgData[index];
}
}
tempimg.copyTo(img);
}
else if (n == 3)//mxIsUint8(arr) &&
{
imgData = (uchar *)mxGetData(arr);//mxGetPr(arr);
unsigned long h = M;
unsigned long w = N/3;
Mat tempimg(h, w, CV_8UC3);
//size_t subs[3]; // 三通道图像就需要 subs [3],
for (unsigned long i=0;i<h;i++)
{
for (unsigned long j=0;j<w;j++)
{
for (unsigned int ch=0;ch<n;ch++)
{
tempimg.row(i).col(j).data[n-1-ch] = imgData[j*h+i+ch*h*w];
}
}
}
tempimg.copyTo(img);
}
}
最后生成的alphaImg.jpg如下:
请问各位大神是怎么回事呢?