我有这个方法:
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
。还有其他解决办法吗?
答案 0 :(得分:0)
问题: 我认为你是混合派生基类:
(参见编译器错误)
从
的参数2没有已知的转化std::vector<cv::Mat_<float> >
到const std::vector<cv::Mat>&
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);