【问题标题】:OpenCV vector to Mat but not element->rowOpenCV 向量到 Mat 但不是 element->row
【发布时间】:2011-12-04 16:51:28
【问题描述】:

有一种非常简单的方法可以从向量构造一个 Mat……只需这样做:

vector<int> myVector;
Mat myMatFromVector(myVector,true); //the boolean is to define if you want to copy the data

这个构造器的问题是每个向量的元素都将被放置在矩阵的每一行中。我想要的是将向量的每个元素放在矩阵的每一列中。

As is:
vector<int> = [1,2,3,4]
Matrix = [1;2;3;4]

I want:
vector<int> = [1,2,3,4]
Matrix = [1,2,3,4]

【问题讨论】:

    标签: opencv vector matrix


    【解决方案1】:

    要么指定Matrix的形状和类型,要么传递向量数据

       // constructor for matrix headers pointing to user-allocated data
        Mat(int _rows, int _cols, int _type, void* _data, size_t _step=AUTO_STEP);
        Mat(Size _size, int _type, void* _data, size_t _step=AUTO_STEP);
    

    或者在 Mat 上调用 reshape 来交换行沙列的数量(不改变任何数据)

        // creates alternative matrix header for the same data, with different
        // number of channels and/or different number of rows. see cvReshape.
        Mat reshape(int _cn, int _rows=0) const;
    

    【讨论】:

    • 对不起,如果这是一个愚蠢的问题,但是您如何正确地将 myVector 类型转换为构造函数的 void* _data 参数?
    • 只是 (void*)myVector[0]
    • 谢谢。向量不是 simply 数组,对吧?做(void*)myVector是不正确的。
    • @a-jays 向量的元素保证在内存中是连续的,就像数组一样。所以数据从第一个元素的地址开始。指向向量对象本身的指针不一定是指向它包含的数据的指针
    【解决方案2】:

    通过主对角线反射一个矩阵(即交换行和列)形成的矩阵称为转置。使用 OpenCV,您可以轻松获得矩阵 A 的转置为:

    Mat A;
    Mat A_transpose = A.t();
    

    如果 A 是 [1; 2; 3; 4], A_transpose 将根据需要为 [1, 2, 3, 4]。

    因此,您可以在从向量转换矩阵后创建矩阵的转置副本,也可以在随后的计算中需要时轻松创建它。

    Mat A, B;
    Mat answer = A.t() * B;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-20
      • 2013-09-02
      • 1970-01-01
      • 1970-01-01
      • 2012-02-12
      • 2013-10-05
      • 2012-11-21
      • 1970-01-01
      相关资源
      最近更新 更多