列异常的 Img 矩阵迭代器<T>

Img MatIterator<T> of column exception

本文关键字:lt gt 迭代器 异常 Img      更新时间:2023-10-16

我想为我的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::反向时收到异常:

OpenCV(4.1.1) Error: Assertion failed (i >= 0) in cv::MatSize::operator [], file C:buildmaster_winpack-build-win64-vc14opencvmodulescoreincludeopencv2/core/mat.inl.hpp, line 1465
OpenCV(4.1.1) C:buildmaster_winpack-build-win64-vc14opencvmodulescoreincludeopencv2/core/mat.inl.hpp:1465: error: (-215:Assertion failed) i >= 0 in function 'cv::MatSize::operator []'

Mat::col(int number( 返回尺寸为 [img height x 1] 的 Mat obj.,那么为什么会出现这样的错误呢?同样的情况也发生在 Mat::row...

我认为您正在处理一个悬而未决的参考问题,来自col()引用的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);