2014-10-20 3 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)) и проведет проверку границ массива. Извините, на самом деле не ответ на ваш вопрос, но я думаю, это может сэкономить вам немного боли. –

+0

o = m (cv :: Rect (0,0,3,3)) работает ли это? – William

ответ

6

Matx имеет функцию get_minor(), которая выполняет именно то, что вы хотите. Я не вижу его в документации OpenCV, но он присутствует внутри реализации. В вашем случае это будет: параметры

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

< Template 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

+0

Я считаю это очень плохо (и опасно) жестко кодировать все эти индексы. Ошибка проскальзывает слишком легко. Это намного хуже по сравнению с циклом в вопросе. – 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 часть = Mat (A, прямоугольник);