【问题标题】:How to create a 4D matrix from a vector of matrices in OpenCV c++如何从 OpenCV c++ 中的矩阵向​​量创建 4D 矩阵
【发布时间】:2020-07-01 04:45:19
【问题描述】:

假设我将相同大小、深度和通道的图像/矩阵收集到 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&lt;Mat&gt; 视为4D Mat 的技术,这样它就会非常快。请注意,我可以拥有100 全分辨率图像。

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

提前致谢

【问题讨论】:

    标签: c++ opencv vector mat opencv4


    【解决方案1】:

    今天经过几个小时,我巧合地找到了我的问题的答案。我将把答案留在这里,以供那些与 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;
    

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

    【讨论】:

      猜你喜欢
      • 2015-08-23
      • 1970-01-01
      • 2016-10-13
      • 1970-01-01
      • 2014-07-27
      • 1970-01-01
      • 1970-01-01
      • 2017-11-18
      • 2021-12-05
      相关资源
      最近更新 更多