如何将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
相关产品推荐
相关产品推荐

