Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在mex脚本中将matlab图像传递给open3d three::image_Matlab_Pointers_Casting_Mex - Fatal编程技术网

在mex脚本中将matlab图像传递给open3d three::image

在mex脚本中将matlab图像传递给open3d three::image,matlab,pointers,casting,mex,Matlab,Pointers,Casting,Mex,我试图在mex脚本中加载一个图像,并将其转换为Open3D库使用的相应格式,即three::image。我正在使用以下代码: uint8_t* rgb_image = (uint8_t*) mxGetPr(prhs[3]); int* dims = (int*) mxGetDimensions(prhs[3]); int height = dims[0]; int width = dims[2]; int channels = dims[4]; int imsize = height * wi

我试图在mex脚本中加载一个图像,并将其转换为Open3D库使用的相应格式,即
three::image
。我正在使用以下代码:

uint8_t* rgb_image = (uint8_t*) mxGetPr(prhs[3]);
int* dims = (int*) mxGetDimensions(prhs[3]);

int height = dims[0];
int width = dims[2];
int channels = dims[4];
int imsize = height * width;

Image image;
image.PrepareImage(height, width, 3, sizeof(uint8_t)); // parameters: height, width, num_of_channels, bytes_per_channel
memcpy(image.data_.data(), rgb_image, image.data_.size());
当我给出灰度图像并将
num\u of_channels
指定为1时,上述方法效果很好,但对于3个通道图像,则效果不理想,如下所示:

然后,我尝试创建一个函数,手动循环原始数据并将其分配给输出图像

    auto image_ptr = std::make_shared<Image>();
    image_ptr->PrepareImage(height, width, channels, sizeof(uint8_t));


    for (int i = 0; i < height * width; i++) {
        uint8_t *p = (uint8_t *)(image_ptr->data_.data() + i * channels * sizeof(uint8_t));
        *p++ = *rgb_image++;
    }
auto image_ptr=std::make_shared();
图像ptr->准备图像(高度、宽度、通道、尺寸(uint8_t));
对于(int i=0;i<高度*宽度;i++){
uint8_t*p=(uint8_t*)(image_ptr->data_.data()+i*通道*大小(uint8_t));
*p++=*rgb_图像++;
}
但现在看来,颜色通道分配错误:

你知道如何解决这个问题吗。关键是它看起来很简单,但是由于我对C++和指针的知识是相当有限的,所以我不能直接理解它。
我在这里()也找到了这个解决方案,但我不确定如何使用它。老实说,我很困惑。

好的,解决方案很简单,就像我当初想的那样。它只是在正确地使用指针:

std::shared_ptr<Image> CreateRGBImageFromMat(uint8_t *mat_image, int width, int height, int channels)
{
    auto open3d_image = std::make_shared<Image>();
    open3d_image->PrepareImage(height, width, channels, sizeof(uint8_t));

    for (int i = 0; i < height * width; i++) {
        uint8_t *p = (uint8_t *)(open3d_image->data_.data() + i * channels * sizeof(uint8_t));

        *p++ = *(mat_image + i);
        *p++ = *(mat_image + i + height*width);
        *p++ = *(mat_image + i + height*width*2);
    }
    return open3d_image;
}
std::shared_ptr CreateRGBImageFromMat(uint8_t*mat_图像、int宽度、int高度、int通道)
{
auto open3d_image=std::make_shared();
open3d_图像->准备图像(高度、宽度、通道、尺寸(uint8_t));
对于(int i=0;i<高度*宽度;i++){
uint8_t*p=(uint8_t*)(open3d_image->data_.data()+i*通道*大小(uint8_t));
*p++=*(mat_image+i);
*p++=*(mat_图像+i+高度*宽度);
*p++=*(mat_图像+i+高度*宽度*2);
}
返回open3d_图像;
}

由于
three::Image
希望数据以连续顺序
row x col x channel
,而从matlab中,图像以块的形式出现
rows x cols x channel_1
(在转置图像后,因为matlab是列主视图)。现在我的问题是,我是否可以用
memcpy()
std::copy()
将bloc数据复制到连续形式,从而绕过
for
循环。

我不知道大多数语法,但在最后一个循环中,每个图像似乎只循环一次,即仅第一个通道,也就是说,如果您注意到它是一个循环,通过存储在
rgb
中的阵列中的所有原始数据(每个通道信息都在后面),则RedI不认为它是一次。例如,在opencv中,您可以看到它们将连续信息传递给不同的Mat,然后进行合并,但由于这里没有合并功能,我需要手动将数据复制到正确的位置。