如何在opencv中获取矩阵的一部分

Posted

技术标签:

【中文标题】如何在opencv中获取矩阵的一部分【英文标题】:How to get a section of a matrix in opencv 【发布时间】:2014-10-20 09:49:22 【问题描述】:

我在 openCV 中有这个矩阵:

  cv::Matx44d m;

我想从这个矩阵中取出左上角的 3x3 矩阵。最简单、最快捷的方法是什么?

我可以通过以下方式做到这一点:

cv::Matx44d m;
cv::Matx33d o;
for(int i=0;i<3;i++)

    for(int j=0;j<3;j++)
    
       o(i,j)=m(i,j);
    
 

但如果存在的话,我正在寻找一种更简单、更快捷的方法!

【问题讨论】:

尽可能不要使用 OpenCV。例如 Eigen 将允许您对矩阵 (even of the OpenCV matrix) 进行 map a rectangular part 并将为您进行数组边界检查。抱歉,这不是您问题的真正答案,但我想它可以为您节省一些痛苦。 o=m(cv::Rect(0,0,3,3)) 这行得通吗? 【参考方案1】:

Matx 有一个名为 get_minor() 的函数,它完全可以满足您的需求。我在 OpenCV 的文档中没有看到它,但它存在于实现中。在您的情况下,它将是:

o = m.get_minor<3,3>(0,0);

模板参数是小矩阵的高和宽。值 (0,0) 是裁剪矩阵的起点。

【讨论】:

他们将方法命名为 get_minor 是不是很奇怪?我希望我的输出 matx 没有 base_row 和 base_col 就像我们为未成年人所拥有的那样【参考方案2】:

为什么不使用简单的构造函数?

Matx44d m = ...;
Mat33xd o( m(0), m(1), m(2),
           m(4), m(5), m(6),
           m(8), m(9), m(10) );

【讨论】:

这是一个不错的主意,但有没有更好的方法来做到这一点? 我认为硬编码所有这些索引非常糟糕(而且危险)。错误太容易漏掉。与问题中的循环相比,这要糟糕得多。【参考方案3】:

这个怎么样?

//! creates a matrix header for a part of the bigger matrix
Mat(const Mat& m, const Range& rowRange, const Range& colRange=Range::all());
Mat(const Mat& m, const Rect& roi);
Mat(const Mat& m, const Range* ranges);

所以你可以写: 垫子部分 = Mat(A, rect);

【讨论】:

以上是关于如何在opencv中获取矩阵的一部分的主要内容,如果未能解决你的问题,请参考以下文章

如何在openCV中修改部分多维矩阵?

OpenCV如何获取GLCM灰度共生矩阵

如何在没有额外分配的情况下从 OpenCV 矩阵中获取图像数据?

如何使用倾斜的线在openCV中获取矩阵(ROI)

如何在opencv中获取getPerspectiveTransform的比例因子?

如何获取矩阵二范数 opencv