5

在 Matlab 中有一个移位函数,用于执行矩阵的列或行的循环移位。OpenCV中有类似的功能吗?

4

4 回答 4

4

我正在寻找同样的问题,但由于没有,我自己写的。这是另一种选择。在我的代码中,您可以向右或向左移动 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 可以写成

于 2013-08-28T13:16:37.887 回答
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

简短的回答,不。

长答案,如果您真的需要它,您可以轻松实现它,例如使用临时对象使用cv::Mat::row(i), cv::Mat::(cv::Range(rowRange), cv::Range(cv::colRange))

于 2012-05-02T20:39:31.143 回答
0

或者,如果您使用的是 Python,只需使用roll() 方法

于 2012-05-02T21:59:45.133 回答