我正在尝试使用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 会导致崩溃?
答案 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;