列异常的 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() 与原始矩阵共享数据,因此没有缓冲区副本,但您仍然需要Matobject 对象来了解其他信息,例如尺寸。使用调试器逐步解决问题,我可以看到它崩溃了,因为它指向的矩阵的维度是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>的主要内容,如果未能解决你的问题,请参考以下文章

关于openCV中Rect()的解释

java.sql.SQLException: Column 'class' not found.异常没有找到列

从 xpath 获取包含某个单词的 img src

使用NULL列读取行会导致浮动异常

从PHP中具有相同列值的表中获取2行

c++错误0x... 处(位于... .exe 中)引发的异常: 0xC0000005: 读取位置 0x...时发生访问冲突?