在OpenCV中移位(如Matlab函数)矩阵的行或列

时间:2012-05-02 19:35:53

标签: opencv

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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);
    }
}

答案 2 :(得分:0)

简短回答,不。

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

答案 3 :(得分:0)

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