2012-05-02 2 views

答えて

0

短答、いいえ。 、cv::Mat::(cv::Range(rowRange), cv::Range(cv::colRange))を使用した一時オブジェクトを使用するなど、実際に必要な場合は簡単に実装できます。

0

Pythonを使用している場合は、roll() methodだけです。

+0

応答ありがとうございます。私はC + +を使用しています。最後に、最初のレスポンスで推奨されたメソッドrow()を使用して自分自身を実装しました。 – user1370912

1

ここでは、循環行列シフトの実装を示します。どんな提案も大歓迎です。

//circular shift one row from up to down 
void shiftRows(Mat& mat) { 

    Mat temp; 
    Mat m; 
    int k = (mat.rows-1); 
    mat.row(k).copyTo(temp); 
    for(; k > 0 ; k--) { 
     m = mat.row(k); 
     mat.row(k-1).copyTo(m); 
    } 
    m = mat.row(0); 
    temp.copyTo(m); 

} 

//circular shift n rows from up to down if n > 0, -n rows from down to up if n < 0 
void shiftRows(Mat& mat,int n) { 

    if(n < 0) { 

     n = -n; 
     flip(mat,mat,0); 
     for(int k=0; k < n;k++) { 
      shiftRows(mat); 
     } 
     flip(mat,mat,0); 

    } else { 

     for(int k=0; k < n;k++) { 
      shiftRows(mat); 
     } 
    } 

} 

//circular shift n columns from left to right if n > 0, -n columns from right to left if n < 0 
void shiftCols(Mat& mat, int n) { 

    if(n < 0){ 

     n = -n; 
     flip(mat,mat,1); 
     transpose(mat,mat); 
     shiftRows(mat,n); 
     transpose(mat,mat); 
     flip(mat,mat,1); 

    } else { 

     transpose(mat,mat); 
     shiftRows(mat,n); 
     transpose(mat,mat); 
    } 
} 
3

私は、同じ質問を探しましたが、どれもが存在しないので、私は自分自身で書きました。もう一つの選択肢があります。私のコードでは、右または左にn回シフトすることができます:left numRight is -n, right +n

void shiftCol(Mat& out, Mat in, int numRight){ 
    if(numRight == 0){ 
     in.copyTo(out); 
     return; 
    } 

    int ncols = in.cols; 
    int nrows = in.rows; 

    out = Mat::zeros(in.size(), in.type()); 

    numRight = numRight%ncols; 
    if(numRight < 0) 
     numRight = ncols+numRight; 

    in(cv::Rect(ncols-numRight,0, numRight,nrows)).copyTo(out(cv::Rect(0,0,numRight,nrows))); 
    in(cv::Rect(0,0, ncols-numRight,nrows)).copyTo(out(cv::Rect(numRight,0,ncols-numRight,nrows))); 
} 

これは一部の人に役立つことを望みます。同様に、shiftRowsを書くことができます

+0

ただし、ニースコードでは、numRight = 0の例外が発生します。 – vipers36

+0

'(numRight <= 0)'で解決されますか? – smttsp

+0

はい、それがnumRight = numRight%ncolsの後に置かれ、 'in.copyTo(out)とともに使用されている場合です。または 'if(numRight == 0){in.copyTo(out); return;} 'を先頭に置くことができます – vipers36

関連する問題