如何在OpenCV中使用push_back处理Mat?向量传入失败求助
解决OpenCV中Mat.push_back()传入vector失败的问题
嘿,我来帮你捋清楚这个问题!首先你提到的直接传入Mat对象的写法确实完全没问题:
Mat mat = (Mat_<uchar>(2, 4) << 5, 6, 0, 4, 0, 1, 9, 9); Mat mat2 = (Mat_<uchar>(2, 4) << 5, 77, 0, 4, 2, 3, 9, 6); // 运行成功 mat.push_back(mat2);
但为什么传入vector<vector<uchar>>会失败呢?其实是你对push_back的重载理解有点小偏差——它支持的是传入单个行向量(也就是vector<T>类型,对应Mat的一行数据),而不是二维的vector<vector<T>>(这相当于多行数据)。
正确的使用方式
1. 添加单行vector
如果只是要给Mat添加一行,直接传vector<uchar>就行,比如:
vector<uchar> single_row = {5, 77, 0, 4}; mat.push_back(single_row); // 这个能正常编译运行
2. 添加多行vector
如果是像你那样的二维vector(多行数据),需要先把它转换成Mat对象,再调用push_back:
vector<vector<uchar>> v1 = { { 5, 77, 0, 4 },{ 2, 3, 9, 6 } }; // 把二维vector转成Mat,第二个参数true表示不复制数据(可选,按需选择) Mat mat_from_vec(v1, true); mat.push_back(mat_from_vec);
这样就能成功把多行数据添加到原Mat里了。本质上是因为push_back对于vector的重载只接受单行数据,多行的话必须先转成Mat,让它匹配到接受Mat对象的重载版本。
内容的提问来源于stack exchange,提问作者tem
相关产品推荐
相关产品推荐

