gpt4 book ai didi

c++ - 将图像输出回 matlab Mex

转载 作者:行者123 更新时间:2023-11-28 02:08:54 32 4
gpt4 key购买 nike

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

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

我已经尝试切换 mwSize 的方向以及交换 ijnew_img.at<int>(j, i) ;

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.

最佳答案

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

因此,将您的 dims 更改为:

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

nd 更改为 3 很重要,因为这将允许您创建 3D 矩阵。你只有一个二维矩阵。接下来,确保您正在访问 cv::Mat 对象中正确位置的图像像素。在嵌套的 for 循环对中访问图像像素的方式采用行优先 方式(首先遍历列,然后遍历行)。因此,您需要交换 ij,因为 i 访问行而 j 访问列。您需要访问彩色图像的 channel ,因此您需要另一个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 not int。这也可以解释为什么您的程序会崩溃。

关于c++ - 将图像输出回 matlab Mex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36482563/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com