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,rects.push_back(mr);这句话是啥意思?
C++ - SIGSEGV 在向量<Mat> 上执行 push_back