我有这种方法:
static void WriteMatVect(const std::string& filename, const std::vector<cv::Mat>& mats);
...
void FileSystem::WriteMatVect(const std::string& filename, const std::vector<cv::Mat>& mats){
size_t size = mats.size();
FileSystem::saveArray(&size,1,filename);
if(mats.empty()){
std::cerr<<"error WriteMatVect: no cv::Mat in mats"<<std::endl;
return;
}
for(size_t i=0 ; i<mats.size() ; i++)
FileSystem::WriteMat(filename, mats[i], true);
}
这称为传递
std::vector<cv::Mat1f>
作为mats
。但这返回以下错误:../FileSystem.hpp:28:14: note: no known conversion for argument 2 from ‘std::vector<cv::Mat_<float> >’ to ‘const std::vector<cv::Mat>&’
一个简单的解决方法是使用
WriteMatVect
更改std::vector<cv::Mat1f>& mats
签名,但这会使WriteMatVect
过于严格(仅适用于浮点矩阵),而我想尽可能地做到通用。我想到的唯一解决方案是使用模板,即const std::vector<T> &mats
。还有其他解决方案吗? 最佳答案
Mat1f
可转换为Mat
,但vector<Mat1f>
不可转换为vector<Mat>
。
一个简单的解决方法是将vector<Mat1f>
复制到正确的vector<Mat>
。请记住,数据不会被复制,因此它应该不会那么慢。
vector<Mat1f> v;
...
vector<Mat> u;
u.reserve(v.size());
for(const auto& m : v) { u.push_back(m); }
WriteMatVect(u);
关于c++ - 使用cv::Mat1f作为cv::Mat,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41764383/