图MatIterator <T>的列异常

时间:2019-08-31 10:34:47

标签: c++ opencv iterator

我想为我的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 个答案:

答案 0 :(得分:0)

我认为您正在处理col()所引用的documentation of row()中悬而未决的参考问题

  

为指定的矩阵行创建矩阵标题。

     

该方法为指定的矩阵行创建一个新标题并返回   它。

文档强调了一个事实,即col()row()与原始矩阵共享数据,因此没有缓冲区的副本,但是您仍然需要Mat对象对象了解其他信息,例如尺寸。通过调试器逐步解决问题,我可以看到它崩溃了,因为它指向的矩阵的尺寸为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);