使用cv :: Mat1f作为cv :: Mat

时间:2017-01-20 13:03:16

标签: c++ opencv c++11

我有这个方法:

Method3()

...

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。还有其他解决办法吗?

2 个答案:

答案 0 :(得分:0)

问题: 我认为你是混合派生基类:

(参见编译器错误)

  
    

std::vector<cv::Mat_<float> >
const std::vector<cv::Mat>&

的参数2没有已知的转化   
template<typename _Tp> class Mat_ : public Mat
{
public:
    // ... some specific methods
    //         and
    // no new extra fields
};

解决方案1: 模板类Mat_派生自Mat,因此您可以将代码从vector<cv::Mat>更改为vector<cv::Mat*>,将参数从std::vector<cv::Mat1f>更改为std::vector<cv::Mat*>当你将矩阵推向向量时,向下转换是隐含的。

然后你的方法是:

static void WriteMatVect(const std::string& filename, const std::vector<cv::Mat*>& mats);

[已编辑]解决方案2: 另一种可能的解决方法(如果您不想更改调用方法)是对std::vector<cv::Mat1f> mats中的对象进行切片,因此请使用std::vector<cv::Mat> mats代替,例如当您按下时对象:

cv::Mat1f matFelement;
std::vector<cv::Mat> mats
mats.push_back(matFelement); //object sliced form Mat1f to Mat

答案 1 :(得分:0)

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);