如何从OpenCV c ++中的矩阵向 量创建4D矩阵

问题描述 投票:0回答:1

假设我将相同大小,深度和通道图像/矩阵收集到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 ++。

提前感谢

c++ opencv vector mat opencv4
1个回答
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;

两者都将打印第c个图像的第i,j个索引的第x个通道。

© www.soinside.com 2019 - 2024. All rights reserved.