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

6

我在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可以让您映射矩阵的矩形部分(甚至是OpenCV矩阵的部分),并为您执行数组边界检查。抱歉,这不是你问题的答案,但我想它可以节省您一些痛苦。 - the swine
o=m(cv::Rect(0,0,3,3)) 这个可以工作吗? - LovaBill
3个回答

11

Matx有一个叫做get_minor()的函数,可以精确地实现您想要的功能。我在OpenCV文档中没有看到它,但它在实现中存在。在您的情况下,它应该是:

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

模板参数<3, 3>表示小矩阵的高度和宽度。值(0,0)是裁剪矩阵的起点。


他们把这个方法命名为get_minor,这不是很奇怪吗?我原本期望输出的matx不像minors那样有base_row和base_col。 - RohitMat

1
为什么不使用简单的构造函数?
Matx44d m = ...;
Mat33xd o( m(0), m(1), m(2),
           m(4), m(5), m(6),
           m(8), m(9), m(10) );

1
这不是一个坏主意,但有没有更好的方法来做到这一点? - mans
2
我认为将所有这些索引硬编码是非常糟糕(并且危险)的。错误很容易出现。相比于问题中的循环,这要糟糕得多。 - leemes

0

这个怎么样?

//! 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 part = Mat(A, rect );


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接