OpenCV 向量到 Mat 但不是 element->row

Posted

技术标签:

【中文标题】OpenCV 向量到 Mat 但不是 element->row【英文标题】:OpenCV vector to Mat but not 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]

【问题讨论】:

【参考方案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;

【讨论】:

以上是关于OpenCV 向量到 Mat 但不是 element->row的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV / C++ - 如何在向量上使用adaptiveThreshold而不是Mat?

Opencv C++读取分配给特征向量的opencv Mat

OpenCV中的Mat类

opencv编程中cvMat到Mat如何进行数据转换?

将 Vector<float> 中的数据复制到 Vector<Mat> (Opencv/C++)

OpenCV C++:根据存储在 int 向量中的索引为 Mat 类型数据创建列范围