将openCV矩阵转换为向量

4

看起来似乎很简单。毕竟,我们知道一个std或openCV向量可以很容易地转换成矩阵,就像这样:

vector<Point> iptvec(10);
Mat iP(iptvec);

在openCV cheatSheet中建议采用相反的方法:
vector<Point2f> ptvec = Mat_ <Point2f>(iP);

然而,有一个要注意的地方:矩阵必须只有一行或一列。如果想转换任意矩阵,则需要进行重塑操作:

int sz = iP.cols*iP.rows;
vector<Point2f> ptvec = Mat <Point2f>(iP.reshape(1, sz));

否则,您将会得到一个错误:
*OpenCV错误:断言失败(dims == 2 && (sizes[0] == 1 || sizes[1] == 1 || sizes[0]*sizes[1] == 0))在create,文件/home/.../OpenCV-2.4.2/modules/core/src/matrix.cpp,第1385行...
1个回答

1
创建一个二维向量并填充每一行。例如:
Mat iP=Mat::zeros(10, 20, CV_8UC1);
vector<vector<int>> ptvec;
for (int i = 0; i < iP.rows; i++)
{
    vector<int> row;    
    iP.row(i).copyTo(row);
    ptvec.push_back(row);
}

请注意,当您创建一个已知大小的向量时,最好预先分配内存,因为性能差异非常大。因此,最好这样做:vector<vector<int>> ptvec(iP.rows,vector<int>(iP.cols)); - kotakotakota

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接