2014-02-11 5 views
6

Существуют ли какие-либо функции в OpenCV, которые равны функциям MATLAB sub2ind и ind2sub? Мне нужны обе функции для моего приложения на C++. Если у OpenCV эти функции отсутствуют, существуют ли какие-либо библиотеки C++, которые обеспечивают эквивалентную функциональность?MATLAB sub2ind/ind2sub в OpenCV/C++

ответ

7

Вы можете написать их сами:

int sub2ind(const int row,const int col,const int cols,const int rows) 
{ 
    return row*cols+col; 
} 

void ind2sub(const int sub,const int cols,const int rows,int &row,int &col) 
{ 
    row=sub/cols; 
    col=sub%cols; 
} 
+0

Обратите внимание, что MATLAB 'sub2ind' и' ind2sub' также работают на многомерных массивах (а не только на двумерных матрицах). Это менее важно в OpenCV, потому что cv :: Mat обычно представляет их как 2D-массивы, но с несколькими каналами (срезами). См. [Здесь] (http://docs.opencv.org/modules/core/doc/basic_structures.html#Mat): http://docs.opencv.org/_images/math/29954d8c450a7ef8c777681a299e7e510c5c45e4.png – Amro

+0

@paghdv Я не знаю Понимаете, вы отвечаете, можете ли вы объяснить, например, у меня есть = [1 2 3; 4 5 6] и я делаю sub2ind (размер (a), 2,2) ответ должен быть 4 – Gilad

+0

@ Gilad вам нужно сделать res = sub2ind (1,1, a.cols, a.rows) .... (Я предполагаю, что вы имеете в виду позицию [1,1], потому что [2,2] не существует ... это индекс на основе нуля). Результат - 4 – paghdv

0

Вот мой код для 2D матрицы. Я протестировал его.

cv::Mat Utilities::Sub2Ind(int width, int height, cv::Mat X, cv::Mat Y) 
{ 
    /*sub2ind(size(a), rowsub, colsub) 
    sub2ind(size(a), 2  , 3) = 6 
    a = 1 2 3 ; 
    4 5 6 
    rowsub + colsub-1 * numberof rows in matrix*/ 

    std::vector<int> index; 
    cv::transpose(Y,Y); 
    cv::MatConstIterator_<int> iterX = X.begin<int>(), it_endX = X.end<int>(); 
    cv::MatConstIterator_<int> iterY = Y.begin<int>(), it_endY = Y.end<int>(); 
    for (int j = 0; j < X.cols; ++j,++iterX)  
    { 
     //running on each col of y matrix 
     for (int i =0 ;i < Y.cols; ++i,++iterY) 
     { 
      int rowsub = *iterY; 
      int colsub = *iterX; 
      int res = rowsub + ((colsub-1)*height); 
      index.push_back(res); 
     } 
     int x = 5; 
    } 
    cv::Mat M(index) ; 
    return M; 
} 
Смежные вопросы