我有这种方法:

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/

10-12 12:57