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