假设我将相同大小,深度和通道图像/矩阵收集到vector
中。因此,这些图像分别为r*c*d
,我在向量中具有以下m
。
vector<string> imgs; --> there are m image paths in these, all are r*c*d resolution
vector<Mat> vec;
for (auto img: imgs ){
vec.push_back(cv::imread(img, COLOR_BGR)); //or gray. doesn't really matter
}
现在,我想创建一个4D矩阵。例如,在python中,np.array(vec)
会给我那个(假设vec
是一个列表)。我想在OpenCV c ++中也一样,但是找不到解决方案。
我不想用Mat m(dims, size, type);
创建4D矩阵,然后遍历所有像素并复制该值,因为它效率很低。我想拥有一种将vec<Mat>
视为4D Mat
的技术,这样它将变得非常快。请注意,我可以拥有100
全分辨率图像。
我在Mac上使用Opencv4.2和c ++。
提前感谢
今天很多小时后,我偶然发现了我的问题的答案。我将在此处留下答案,以供那些与OpenCV文档进行斗争以找到正确答案的人参考。
vector<int> dims = {m, r, c}; //dimensions
cv::Mat m (3, &dims[0], imgs[0].type(), &imgs[0]);
这会根据通道数从imgs
向量创建4D矩阵,其中类型为CV_8UC1
,CV_8UC3
或CV_8UC4
之一。好消息是它不会复制矢量。
尽管这不是问题的一部分,要访问4D矩阵中的像素,您可以执行以下操作:
int x = v1, i = v2, j = v3, c = v4; //v1-4 are some random values within their ranges
cout << (int)m.at<Mat>(x).at<Vec3b>(i,j)[c] << " "
<< (int)imgs[x].at<Vec3b> (i,j)[c] << endl;
两者都将打印第c
个图像的第i,j
个索引的第x
个通道。