OpenCV Mat 在 push_back 时崩溃

Posted

技术标签:

【中文标题】OpenCV Mat 在 push_back 时崩溃【英文标题】:OpenCV Mat crashes while push_back 【发布时间】:2014-03-20 20:53:14 【问题描述】:

我正在尝试使用 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 ); 

但以下会导致崩溃。

代码 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)

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

【问题讨论】:

【参考方案1】:

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

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

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

嗯,这个也可以(但显然不是你想要的)

    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

【讨论】:

我刚刚检查过了。 Mat::zeros() 和 Mat::ones() 不返回矩阵,而是分别返回 0 和 1 的数组。这可能是原因吗?我仍然不确定这是否是一个错误。 Mat::zeros() 和 one() 返回一个 MatExpr 。它应该很容易分配给 Mat,但是在您发布的示例中显然出现了问题。是的,很容易理解,你不想在那里出丑,但不用担心,那里的开发人员不会咬人,所以如果你不喜欢,我可能会这样做。 (错误只会消失,如果你告诉他们...)

以上是关于OpenCV Mat 在 push_back 时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV中Mat的属性

在 OpenCV (C++) 中打印多维 Mat

如何在 Opencv 中显示一个 Mat

OpenCV 中 Mat 对象的标头是啥意思?

opencv中MatND和Mat的区别

选择一个 Mat 的子集并复制它们以在 C++/Opencv 中创建一个新的 mat