OpenCV Mat在push_back时崩溃

OpenCV Mat crashes while push_back

本文关键字:back 崩溃 push Mat OpenCV      更新时间:2023-10-16

我试图通过使用push_back函数在OpenCV中创建以下矩阵。

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

下面的代码可以工作。

我<<p> 代码/strong>
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 ); 

但是下列操作将导致崩溃。

代码二

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关于push_back的文档,

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

唯一的要求是"元素的类型和列数必须与容器矩阵中的相同"。我认为代码II符合要求。有人能解释为什么代码II会导致崩溃吗?

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

  • Code1调用void Mat::push_back(const Mat&elem),

  • Code2调用void Mat::push_back(const _Tp&Elem),这显然是坏的。似乎从Mat::zero()返回的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;

这里可能会有问题