首页 > 解决方案 > 如何从 OpenCV c++ 中的矩阵向​​量创建 4D 矩阵

问题描述

假设我将相同大小、深度和通道图像/矩阵收集到一个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 矩阵。例如,在 pythonnp.array(vec)中会给我这个(假设vec是一个列表)。我想在 OpenCV c++ 中也一样,但我找不到解决方案。

我不想创建一个 4D 矩阵Mat m(dims, size, type);,然后遍历所有像素并复制该值,因为它非常低效。我想要一种技术,它会被认为vec<Mat>4D Mat超快的。请注意,我可以拥有100全分辨率图像。

我在 Mac 上使用 Opencv4.2 和 c++。

提前致谢

标签: c++opencvvectormatopencv4

解决方案


今天几个小时后,我巧合地找到了我的问题的答案。我将把答案留在这里,以供那些与 OpenCV 文档斗争以找到正确答案的人参考。

vector<int> dims = {m, r, c}; //dimensions
cv::Mat m (3, &dims[0], imgs[0].type(), &imgs[0]);

imgs这会从类型为 的向量中创建 4D 矩阵CV_8UC1CV_8UC3CV_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;

两者都将打印-th 图像的-th 索引的c-th 通道。i,jx


推荐阅读