【问题标题】:outputting image back to matlab Mex将图像输出回matlab Mex
【发布时间】:2016-07-28 17:04:39
【问题描述】:

我正在尝试将我的 mex 文件中的图像输出回我的 matlab 文件,但是当我在 matlab 中打开它时它不正确。

带有mex文件的输出图像是正确的

我尝试切换 mwSize 的方向以及在new_img.at<int>(j, i) 中交换ij

Mat image = imread(mxArrayToString(prhs[0]));
Mat new_img(H,W, image.type(), Scalar(0));
// some operations on new_img
imshow( "gmm image", image ); //shows the original image
imshow( "gmm1 image", new_img ); //shows the output image
waitKey( 200 );  //both images are the same size as desired

mwSize nd = 2;
mwSize dims[] = {W, H};

plhs[0] = mxCreateNumericArray(nd, dims, mxUINT8_CLASS, mxREAL);
if(plhs == NULL) {
  mexErrMsgTxt("Could not create mxArray.\n");     
}     
char* outMat = (char*) mxGetData( plhs[0]);

for (int i= 0; i < H; i++)
{
  for (int j = 0; j < W; j++)
  {       
    outMat[i +j*image.rows] = new_img.at<int>(j, i);       
  }
}

这是在 mat 文件中

gmmMask = GmmMex2(imgName,rect);
imshow(gmmMask); % not the same as the output image. somewhat resembles it, but not correct.

【问题讨论】:

  • new_imgcv::Mat 对象吗?从实际代码中看不清楚,因为它没有在任何地方定义。
  • 对不起,是的,我修复了编辑问题
  • 它不是灰度图像,这或许可以解释原因。我之前尝试过考虑多个渠道,但我无法弄清楚。编辑:如果它现在输出灰度图像也很好
  • 是的,这就解释了原因。让我修改我的答案。

标签: c++ matlab opencv image-processing mex


【解决方案1】:

因为您提到这是一个彩色图像,这意味着您需要考虑矩阵的三个切片。您的代码只考虑一个切片。首先,您需要确保声明图像的正确大小。在 MATLAB 中,第一个维度总是行数,而第二个维度是列数。现在您还必须在此基础上添加频道数量。我假设这是一个 RGB 图像,所以有三个通道。

因此,将您的dims 更改为:

mwSize nd = 3;
mwSize dims[] = {H, W, nd};

nd 更改为 3 很重要,因为这将允许您创建 3D 矩阵。你只有一个二维矩阵。接下来,确保您正在访问cv::Mat 对象中正确位置的图像像素。您在嵌套的一对for 循环中访问图像像素的方式采用row-major 方式(先遍历列,然后遍历行)。因此,您需要交换ij,因为i 访问行,j 访问列。您需要访问彩色图像的通道,因此您需要另一个 for 循环来补偿。对于灰度情况,您已经适当地补偿了 MATLAB MEX 矩阵的主要列内存配置。这是经过验证的,因为 j 访问列,您需要按行数跳过才能访问下一列。但是,为了适应彩色图像,您还必须跳过image.rows*image.cols 才能进入下一层像素。

因此,您的 for 循环现在应该是:

for (int k = 0; k < nd; k++) {
    for (int i = 0; i < H; i++) { 
        for (int j = 0; j < W; j++) {
            outMat[k*image.rows*image.cols + i + j*image.rows] = new_img.at<uchar>(i, j, k);
        }
    }
}

请注意,像素容器很可能是 8 位无符号字符,因此您必须将模板更改为 uchar 不是 int。这也可以解释您的程序崩溃的原因。

【讨论】:

  • 我添加了您的更改,现在 matlab 崩溃 =[
  • 我确定要更改nd = 3...你确定吗?
  • 如果是彩色图像(可能是CV_8UC3 类型),不应该是:... = new_img.at&lt;Vec3b&gt;(i,j)[k]; 吗?至少.at&lt;uchar&gt;(i,j,k);
  • @Miki 是的,你是对的。我会改变的。我没有注意到那里的int...这就是复制和粘贴所得到的。
  • @rayryeng 它编译但它仍然是和以前一样的问题。我需要将图像输出回matlab的唯一原因是在输出图像和另一个图像之间进行比较,所以我只是在mex中这样做了。不过感谢您的帮助
猜你喜欢
  • 2017-08-27
  • 1970-01-01
  • 2015-05-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 2012-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多