c++ - 如何从 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++。
提前致谢
解决方案
今天几个小时后,我巧合地找到了我的问题的答案。我将把答案留在这里,以供那些与 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;
两者都将打印-th 图像的-th 索引的c
-th 通道。i,j
x
推荐阅读
- git - 如何撤消 git 提交,该提交在之前 7 次提交的站点范围内进行了更改
- spring-webflux - Spring WebFlux 如何从两个 flatMap 中获取对象
- c# - 我的应用程序通过 clickone 发布的例外情况
- mysql - 如果过滤器为空,如何在 WHERE SQL 子句中添加条件或返回所有结果
- electron - yarn monorepo 工作区 nohoist 并发问题
- python - 带有 Splash 的 CrawlSpider,仅抓取和处理第一个链接
- c# - 无法从传输连接读取数据。FtpWeb 请求。C#
- node.js - Kerberos 错误:杂项故障(请参阅文本):未找到 macOS 的凭据缓存文件
- set - 具有 Kleene 星的两组意味着一组是另一组的子集
- python - 黑色不会遵守长导入语句的行长限制