在mex脚本中将matlab图像传递给open3d three::image
我试图在mex脚本中加载一个图像,并将其转换为Open3D库使用的相应格式,即在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
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,然后进行合并,但由于这里没有合并功能,我需要手动将数据复制到正确的位置。