2014-10-20 68 views
3

我有這個矩陣中的OpenCV:如何獲得一個矩陣的部分在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); 
    } 
} 

,但我期待的,如果它存在的簡單,更快捷的方式!

+0

如果可能的話,請勿使用OpenCV。例如[Eigen](http://eigen.tuxfamily.org)將允許您[矩形的一部分](http://eigen.tuxfamily.org/dox/group__TutorialBlockOperations.html)矩陣([偶數] OpenCV矩陣](http://eigen.tuxfamily.org/dox/group__TutorialMapClass.html)),並且會爲你做數組邊界檢查。對不起,對你的問題不是一個真正的答案,但我想它可以爲你節省一些痛苦。 – 2014-10-20 11:33:44

+0

o = m(cv :: Rect(0,0,3,3))完成這項工作嗎? – William 2014-10-20 14:27:33

回答

6

Matx有一個名爲get_minor()的函數,它的功能正是你想要的。我沒有在OpenCV的文檔中看到它,但它存在於實現中。在您的情況下,將:

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

模板參數< 3,3>小矩陣的高度和寬度。值(0,0)是矩陣被裁剪的起點。

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 2014-10-20 10:47:49

+0

我認爲對所有這些指數進行硬編碼是非常糟糕的(也是危險的)。錯誤太容易滑倒。與問題中的循環相比,情況要糟糕得多。 – leemes 2014-10-20 10:52:38

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); 

所以你可以這樣寫: 墊部分=墊(A,RECT);