列异常的 Img MatIterator<T>
Posted
技术标签:
【中文标题】列异常的 Img MatIterator<T>【英文标题】:Img MatIterator<T> of column exception 【发布时间】:2019-08-31 10:34:47 【问题描述】:我想为我的 openCV 应用程序使用一些 STL 算法。现在,我想镜像img。我想颠倒行、列和两行一列的顺序。当我输入时:
// Horizontal and vertical mirror
MatIterator_<cv::Vec3b> it = img.begin<cv::Vec3b>();
MatIterator_<cv::Vec3b> end = img.end<cv::Vec3b>();
std::reverse(it, end);
它就像一个魅力。
但是当我尝试遍历单个列或行时
MatIterator_<cv::Vec3b> it = img.col(0).begin<cv::Vec3b>();
MatIterator_<cv::Vec3b> end = img.col(0).end<cv::Vec3b>();
std::reverse(it, end);
调用 std::reverse 时出现异常:
OpenCV(4.1.1) Error: Assertion failed (i >= 0) in cv::MatSize::operator [], file C:\build\master_winpack-build-win64-vc14\opencv\modules\core\include\opencv2/core/mat.inl.hpp, line 1465
OpenCV(4.1.1) C:\build\master_winpack-build-win64-vc14\opencv\modules\core\include\opencv2/core/mat.inl.hpp:1465: error: (-215:Assertion failed) i >= 0 in function 'cv::MatSize::operator []'
Mat::col(int number) 返回 Mat obj。尺寸为 [img height x 1],那么为什么会出现这样的错误? Mat::row 也是如此...
【问题讨论】:
【参考方案1】:我认为您正在处理一个悬空引用问题,来自 documentation of row()
引用的 col()
为指定的矩阵行创建一个矩阵标题。
该方法为指定的矩阵行创建一个新标题并返回 它。
文档强调col()
或row()
与原始矩阵共享数据,因此没有缓冲区副本,但您仍然需要Mat
object 对象来了解其他信息,例如尺寸。使用调试器逐步解决问题,我可以看到它崩溃了,因为它指向的矩阵的维度是0
。它指向的矩阵是col()
返回的矩阵,它在您的第一行之后不再存在。您可以修复您的代码,确保列矩阵在不再需要之前一直存在:
auto col = img.col(0);
cv::MatIterator_<cv::Vec3b> it = col.begin<cv::Vec3b>();
cv::MatIterator_<cv::Vec3b> end = col.end<cv::Vec3b>();
std::reverse(it, end);
【讨论】:
以上是关于列异常的 Img MatIterator<T>的主要内容,如果未能解决你的问题,请参考以下文章
java.sql.SQLException: Column 'class' not found.异常没有找到列
c++错误0x... 处(位于... .exe 中)引发的异常: 0xC0000005: 读取位置 0x...时发生访问冲突?