You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将std::vector<Mat>导入3D cv::Mat的指定索引位置?

问题:将std::vector图像切片写入3D cv::Mat的指定索引位置

我拥有一个std::vector<Mat>类型的imageSlices向量,以及一个3D cv::Mat:

cv::Mat RTstruct3D(3,DImensions3D, CV_8U, Scalar(0))

希望将向量中的图像切片放入这个3D cv::Mat的指定Z轴索引位置。

以下是生成imageSlices的代码:

//Make a 3D Organ
int programCounter = 0;
vector<Mat>imageSlices;
for (size_t k = 0; k < Npoint_Z.size(); k++)
{
    Mat finalSliceImage = Mat :: zeros(DImensions3D[0], DImensions3D[1],CV_8U);
    vector<vector<int>> polies;
    for (size_t h = 0; h < Npoint_Z[k][0]; h++)
    {
        vector<int>x_y;
        x_y.push_back(ContourData[programCounter][0]); //x
        x_y.push_back(ContourData[programCounter][1]); //y
        polies.push_back(x_y);
        programCounter++;
    }
    fillPoly(finalSliceImage, polies, Scalar(0, 255, 0));
    imageSlices.push_back(finalSliceImage);
}
//Add Organ to RTSTRUCT 3D
Mat RTstruct3D(3,DImensions3D, CV_8U, Scalar(0));

需求逻辑:将imageSlices中的每个2D切片,对应写入3D体RTstruct3D的指定层位置。


解决方案

要实现该需求,核心是直接定位3D Mat的指定Z层内存并复制切片数据,具体实现如下:

1. 前置检查

确保imageSlices中每个切片的尺寸与RTstruct3D的XY维度(DImensions3D[0]、DImensions3D[1])完全匹配,否则需先通过resize()调整切片尺寸。

2. 写入指定索引的代码示例

假设你有一个sliceIndices数组,存储每个imageSlices元素对应的目标Z轴索引:

// 示例:自定义每个切片对应的3D Mat Z轴索引
vector<int> sliceIndices = {2, 5, 7}; // 需与imageSlices长度一致

for (size_t i = 0; i < imageSlices.size(); ++i) {
    int zIdx = sliceIndices[i];
    // 索引合法性校验,防止越界
    if (zIdx < 0 || zIdx >= RTstruct3D.size[2]) {
        cerr << "Error: Z index " << zIdx << " is out of bounds!" << endl;
        continue;
    }

    // 获取3D Mat中指定Z层的2D视图(直接映射原内存,无拷贝)
    Mat targetLayer(RTstruct3D.size[0], RTstruct3D.size[1], CV_8U,
                    RTstruct3D.data + zIdx * RTstruct3D.step[2]);
    
    // 将切片复制到目标层
    imageSlices[i].copyTo(targetLayer);
}

3. 关键细节说明

  • RTstruct3D.step[2]表示3D Mat中每个Z层的字节跨度,通过data + zIdx * step[2]可直接定位到目标层的内存起始地址,创建的targetLayer是原3D Mat的视图,修改它会直接改变RTstruct3D的数据。
  • 如果不需要自定义索引,而是按顺序写入RTstruct3D的连续Z层,直接用循环变量i作为zIdx即可。
  • 若切片尺寸不匹配,添加尺寸调整逻辑:
    Mat resizedSlice;
    resize(imageSlices[i], resizedSlice, Size(RTstruct3D.size[1], RTstruct3D.size[0]));
    resizedSlice.copyTo(targetLayer);
    

内容的提问来源于stack exchange,提问作者user19190785

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 13:10:32