2017-04-04 30 views
0
std::vector<cv::Mat1f> mat = std::vector<cv::Mat1f>(10,cv::Mat1f::zeros(1,10)); 
mat[0]+=1; 
for(size_t i=0;i<mat.size();i++) 
    std::cout<<mat[i]<<std::endl; 

而且它打印:矢量::垫在它们之间的联系

[1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 

我怎样才能避免这种情况?矢量初始化内联是非常重要的。

回答

0

你不能那样做。 vector构造函数使用Mat复制构造函数,它只复制标题而不复制数据。你需要明确使用clone()不知何故,或创建一个新的矩阵中的每个时间:例如:

std::vector<cv::Mat1f> mat(10); 
for (size_t i = 0; i < mat.size(); i++) { 
    mat[i] = cv::Mat1f(1, 10, 0.f); 
} 

或:

cv::Mat1f m = cv::Mat1f(1, 10, 0.f); 
std::vector<cv::Mat1f> mat(10); 
for (size_t i = 0; i < mat.size(); i++) { 
    mat[i] = m.clone(); 
} 

或:

std::vector<cv::Mat1f> mat(10); 
std::generate(mat.begin(), mat.end(), []() {return cv::Mat1f(1, 10, 0.f); }); 

或:

cv::Mat1f m = cv::Mat1f(1, 10, 0.f); 
std::vector<cv::Mat1f> mat(10); 
std::generate(mat.begin(), mat.end(), [&m]() {return m.clone(); }); 
+0

感谢您的回答,这是一个痛苦。是否存在任何逐行迭代器?如果不是,我该如何执行它? – justHelloWorld

+0

你是什么意思的“逐行”迭代器? – Miki

+0

我要打开另一个问题,我认为这不是一个好的行为:) – justHelloWorld