OpenCV Mat在push_back时崩溃

时间:2014-03-20 20:53:14

标签: c++ c opencv mat

我正在尝试使用push_back函数在OpenCV中创建以下矩阵。

[0, 0, 0;
 0, 0, 0;
 1, 1, 1;
 1, 1, 1]

以下代码有效。

代码I

Mat matrix( 0, 3, CV_32F ); 
Mat zero  = Mat::zeros( 2, 3, CV_32F ); 
Mat one   = Mat::ones( 2, 3, CV_32F ); 
matrix.push_back( zero ); 
matrix.push_back( one ); 

但以下情况会导致崩溃。

Code II

Mat matrix( 0, 3, CV_32F ); 
matrix.push_back( Mat::zeros( 2, 3, CV_32F ) ); 
matrix.push_back( Mat::ones( 2, 3, CV_32F ) ); 

根据OpenCV documentation about push_back

template<typename T> void Mat::push_back(const T& elem)

唯一的要求是&#34; elem的类型和列数必须与容器矩阵&#34;中的相同。我认为 Code II 符合要求。任何人都可以解释为什么 Code II 会导致崩溃?

1 个答案:

答案 0 :(得分:2)

这很有趣,甚至可能是一个错误。

  • Code1调用void Mat :: push_back(const Mat&amp; elems),

  • Code2调用void Mat :: push_back(const _Tp&amp; elem),这显然已被破坏。它似乎从Mat :: zeros()返回的MatExpr错了(因为它是非const的?)

嗯,这个也有效(但它显然不是,你想要的)

    Mat matrix( 0, 3, CV_32F ); 
    matrix.push_back( Mat( Mat::zeros( 2, 3, CV_32F) ) ); 
    matrix.push_back( Mat( Mat::ones( 2, 3, CV_32F ) ) ); 
    cerr << matrix << endl;

也许make an issue here