[英]How to convert a cv::Mat to a 2d std::vector without copying data
[英]Convert a std::vector<std::vector <double> > representing a 2D array to cv::Mat
将std::vector
s的嵌套std::vector
转换为cv::Mat
的最优雅高效的方法是什么? 嵌套结构持有一个数组,即所有内部std::vector
s具有相同的大小并表示矩阵行。 我不介意将数据从一个复制到另一个。
我知道单个非嵌套的std::vector
很容易,有一个构造函数:
std::vector <double> myvec;
cv::Mat mymat;
// fill myvec
bool copy = true;
myMat = cv::Mat(myvec, copy);
嵌套向量怎么样?
我的变种(需要OpenCV 2.4):
int size = 5;
vector<vector<double> > w(size);
for(int i = 0; i < size; ++i)
{
w[i].resize(size);
for(int j = 0; j < size; ++j)
w[i][j] = (i+1) * 10 + j;
}
Mat m(size, size, CV_64F);
for(int i = 0; i < w.size(); ++i)
m.row(i) = Mat(w[i]).t();
cout << m << endl;
输出:
[10, 11, 12, 13, 14;
20, 21, 22, 23, 24;
30, 31, 32, 33, 34;
40, 41, 42, 43, 44;
50, 51, 52, 53, 54]
m.row(i) = Mat(w[i]).t()
:
m.row(i)
设置ROI,它指向原始矩阵 Mat(w[i])
包装矢量而不进行数据复制 .t()
创建“矩阵表达式” - 不执行数据复制 =
计算矩阵表达式,但因为向量被包装到( size
x 1)连续矩阵中,所以只需调用一次memcpy
就可以在没有实际转置的情况下对其进行求值。 这是一种方法:
std::vector<double> row1;
row1.push_back(1.0); row1.push_back(2.0); row1.push_back(3.0);
std::vector<double> row2;
row2.push_back(4.0); row2.push_back(5.0); row2.push_back(6.0);
std::vector<std::vector<double> > vector_of_rows;
vector_of_rows.push_back(row1);
vector_of_rows.push_back(row2);
// make sure the size of of row1 and row2 are the same, else you'll have serious problems!
cv::Mat my_mat(vector_of_rows.size(), row1.size(), CV_64F);
for (size_t i = 0; i < vector_of_rows.size(); i++)
{
for (size_t j = 0; j < row1.size(); j++)
{
my_mat.at<double>(i,j) = vector_of_rows[i][j];
}
}
std::cout << my_mat << std::endl;
输出:
[1, 2, 3;
4, 5, 6]
我尝试了使用Mat
的构造函数和push_back()
方法的另一种方法,但没有成功,也许你可以搞清楚。 祝好运!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.