5

Matlab には、行列の列または行の循環シフトを実行するためのシフト関数があります。OpenCVにも同様の機能はありますか?

4

4 に答える 4

2

これが私の循環行列シフトの実装です。どんな提案でも大歓迎です。

//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);
    }
}
于 2012-05-09T14:14:46.457 に答える
0

または、Pythonを使用している場合は、roll()メソッドのみを使用します。

于 2012-05-02T21:59:45.133 に答える
0

短い答え、いいえ。

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

于 2012-05-02T20:39:31.143 に答える