Opencv C ++创建了Mat of Mat

时间:2017-01-15 15:39:44

标签: c++ opencv vector mat

我正在尝试使用OpenCv 2.4.10在C ++中构建帧之间的距离矩阵。我想我需要垫子垫,所以我可以放入第一行并对所有帧进行排列,并逐帧制作XOR运算符。但要做到这一点,我需要一个像矩阵这样的结构,在每个位置包含另一个矩阵。有垫子垫吗?或者你能建议另一个解决方案?我想过使用Vector但我需要的不仅仅是Mat数组。谢谢,我是新来的!

1 个答案:

答案 0 :(得分:1)

如果我弄错了,你要找的是一个二维Mat对象,它的每个元素都是另一个二维Mat对象。这相当于创建一个4维Mat对象。 OpenCV具有这样的功能 - 它只涉及使用一种不太流行且不太方便的Mat构造函数:

const int num_of_dim = 4;
const int dimensions[num_of_dim] = { a, b, c, d }; // a, b, c, d - desired dimensions defined elsewhere
cv::Mat fourd_mat(num_of_dim, dimensions, CV_32F);

在openCV docs上检查 Mat :: Mat(int ndims,const int * sizes,int type)构造函数:

http://docs.opencv.org/2.4.10/modules/core/doc/basic_structures.html#Mat::Mat(int%20ndims,%20const%20int *%20sizes,%20int%20type)

以及搜索短语" multi-dimensional"和" n维"在该页面上查找更多示例和文档。

修改

根据要求,我将展示如何将图像加载到这样的结构中。它不漂亮,但我想最简单的方法是逐个像素地复制图像:

img = imread("path/img.jpg", 1);
for (int i = 0; i < 179; ++i)
{
    for (int j = 0; i < img.rows; ++i)
    {
        for (int k = 0; j < img.cols; ++j)
        {
            const int coords1[4] = { i, 0, j, k };
            const int coords2[4] = { 0, i, j, k };
            fourd_mat.at<float>(coords1) = img.at<float>(j, k); //line 1
            fourd_mat.at<float>(coords2) = img.at<float>(j, k); //line 2
        }
    }
}

评论为 line1 的行相当于您的行 struttura [i] [0] = img; line2 相当于< strong> struttura [0] [i] = img; 在两个最里面的for循环完成他们的工作之后。

上面的代码假设您的图片类型为 CV_32F - 如果它 8UC ,您必须将 float 替换为< at()函数中的strong> uchar 。