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

标签 c++ opencv vector mat opencv4

假设我将相同大小、深度和 channel 的图像/矩阵收集到 vector .所以,这些图片是 r*c*d每个和我都有 m它们在我的 vector 中如下所示。

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所以它会 super 快。请注意,我可以拥有 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 之一的 vector , CV_8UC3CV_8UC4取决于 channel 的数量。好消息是它不会复制 vector 。

虽然这不是问题的一部分,但要访问 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 的第一个 channel -x 的第一个索引-第图像。

关于c++ - 如何从 OpenCV c++ 中的矩阵向​​量创建 4D 矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60767512/

相关文章:

c++ - CMake看不到系统变量

c++ - 如何不同地编写reinterpret_cast <>

c++ - C++中双括号 “[[foo()]] type name;”语法的含义?

c++ - opencv断言(一般)

java - OpenCV Mat 处理时间

C++:指向具有不同类型参数的函数的函数指针 vector

c++ - 在 ""运算符中从字符串转换为 const char* + size_t

python - 在 python (OpenCV) 中加速与傅立叶相关的变换计算

c++ - 使用 "find"访问 vector 中的值

c++ - 我什么时候应该使用 vector<int>::size_type 而不是 size_t?