我想为我的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 ...
答案 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);